Skip to content

Retrieval Model and Eigenvalue Analysis Data¤

Model Data¤

First, instantiate the OpenSeesMatlab interface class. This class provides native OpenSees commands, as well as additional visualization, pre/post-processing, and utility methods.

1
2
opsMAT = OpenSeesMatlab();
ops = opsMAT.opensees;

For example, the tool property provides a function loadExamples to run some built-in models. Of course, you can run your own model; the built-in model is used here for demonstration purposes only.

1
2
opsMAT.utils.loadExamples("Frame3D");
% or your model here

We can visualize the model using the plotModel function in the vis attribute.

1
2
figure;
h = opsMAT.vis.plotModel();
Output
[OpenSeesMatlab] Model summary Nodes: 384 Beam elements: 930
figure_0.png

We can retrieve data from the current model, which returns a nested struct. You can view the data using MATLAB's workspace variables.

1
2
modelData = opsMAT.post.getModelData();
disp(modelData)
Output
Nodes: [1x1 struct] Fixed: [1x1 struct] MPConstraint: [1x1 struct] Loads: [1x1 struct] Elements: [1x1 struct] NumNode: 384 NumElement: 930

Finally, we can print the information for each field.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
S = modelData;


stack = {{'S', S}};


while ~isempty(stack)
    item = stack{end};
    stack(end) = [];


    name = item{1};
    val  = item{2};


    if isstruct(val)
        fns = fieldnames(val);
        for i = numel(fns):-1:1
            f = fns{i};
            stack{end+1} = {sprintf('%s.%s', name, f), val.(f)};
        end
    else
        sz = strjoin(string(size(val)), 'x');
        fprintf('%s : %s\n', name, sz);
    end
end
Output
S.Nodes.Tags : 384x1 S.Nodes.Coords : 384x3 S.Nodes.Ndm : 384x1 S.Nodes.Ndf : 384x1 S.Nodes.UnusedTags : 0x1 S.Nodes.Bounds : 1x6 S.Nodes.MinBoundSize : 1x1 S.Nodes.MaxBoundSize : 1x1 S.Fixed.NodeTags : 24x1 S.Fixed.NodeIndex : 24x1 S.Fixed.Coords : 24x3 S.Fixed.Dofs : 24x6 S.MPConstraint.PairNodeTags : 0x2 S.MPConstraint.Cells : 0x3 S.MPConstraint.MidCoords : 0x3 S.MPConstraint.Dofs : 0x6 S.Loads.PatternTags : 0x1 S.Loads.Node.PatternNodeTags : 0x2 S.Loads.Node.Values : 0x3 S.Loads.Element.Beam.PatternElementTags : 0x2 S.Loads.Element.Beam.Values : 0x10 S.Loads.Element.Surface.PatternElementTags : 0x2 S.Loads.Element.Surface.Values : 0x0 S.Elements.Summary.Tags : 930x1 S.Elements.Summary.ClassTags : 930x1 S.Elements.Summary.CenterCoords : 930x3 S.Elements.Families.Truss.Tags : 0x1 S.Elements.Families.Truss.Cells : 0x3 S.Elements.Families.Beam.Tags : 930x1 S.Elements.Families.Beam.Cells : 930x3 S.Elements.Families.Beam.Midpoints : 930x3 S.Elements.Families.Beam.Lengths : 930x1 S.Elements.Families.Beam.XAxis : 930x3 S.Elements.Families.Beam.YAxis : 930x3 S.Elements.Families.Beam.ZAxis : 930x3 S.Elements.Families.Link.Tags : 0x1 S.Elements.Families.Link.Cells : 0x3 S.Elements.Families.Link.Midpoints : 0x3 S.Elements.Families.Link.Lengths : 0x1 S.Elements.Families.Link.XAxis : 0x3 S.Elements.Families.Link.YAxis : 0x3 S.Elements.Families.Link.ZAxis : 0x3 S.Elements.Families.Line.Tags : 930x1 S.Elements.Families.Line.Cells : 930x3 S.Elements.Families.Plane.Tags : 0x1 S.Elements.Families.Plane.Cells : 0x0 S.Elements.Families.Plane.CellTypes : 0x1 S.Elements.Families.Shell.Tags : 0x1 S.Elements.Families.Shell.Cells : 0x0 S.Elements.Families.Shell.CellTypes : 0x1 S.Elements.Families.Solid.Tags : 0x1 S.Elements.Families.Solid.Cells : 0x0 S.Elements.Families.Solid.CellTypes : 0x1 S.Elements.Families.Joint.Tags : 0x1 S.Elements.Families.Contact.Tags : 0x1 S.Elements.Families.Contact.Cells : 0x3 S.Elements.Families.Unstructured.Tags : 0x1 S.Elements.Families.Unstructured.Cells : 0x0 S.Elements.Families.Unstructured.CellTypes : 0x1 S.Elements.Classes.ElasticBeam3d.Cells : 930x3 S.Elements.Classes.ElasticBeam3d.CellTypes : 930x1 S.Elements.Classes.ElasticBeam3d.ElementTags : 930x1 S.NumNode : 1x1 S.NumElement : 1x1

Eigen Data¤

First, we need to save the eigenvalue analysis results data for future reuse.

1
2
tag = 1;
opsMAT.post.saveEigenData(tag, 10, solver='-genBandArpack');

Then, data is retrieved from the file, returning a nested structure that stores the various results of the eigenvalue analysis.

1
2
eigenData = opsMAT.post.getEigenData(odbTag=tag);
disp(eigenData)
Output
EigenVectors: [1x1 struct] InterpolatedEigenVectors: [1x1 struct] ModalProps: [1x1 struct] ModelInfo: [1x1 struct] ModeTags: [10x1 double]

Using this data, we can visualize the first modal shapes.

1
2
3
figure;
opsMAT.vis.plotEigen(6, eigenData);
axis off
figure_1.png
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
S = eigenData;


stack = {{'S', S}};


while ~isempty(stack)
    item = stack{end};
    stack(end) = [];


    name = item{1};
    val  = item{2};


    if isstruct(val)
        fns = fieldnames(val);
        for i = numel(fns):-1:1
            f = fns{i};
            stack{end+1} = {sprintf('%s.%s', name, f), val.(f)};
        end
    else
        sz = strjoin(string(size(val)), 'x');
        fprintf('%s : %s\n', name, sz);
    end
end
Output
S.EigenVectors.data : 10x384x6 S.EigenVectors.nodeCoords : 384x3 S.EigenVectors.nodeNdf : 384x1 S.EigenVectors.nodeNdm : 384x1 S.EigenVectors.nodeTags : 384x1 S.InterpolatedEigenVectors.cellNodeTags : 930x2 S.InterpolatedEigenVectors.cells : 4650x3 S.InterpolatedEigenVectors.data : 10x5580x3 S.InterpolatedEigenVectors.eleTags : 930x1 S.InterpolatedEigenVectors.modeTags : 10x1 S.InterpolatedEigenVectors.nodeTags : 384x1 S.InterpolatedEigenVectors.nptsPerElement : 1x1 S.InterpolatedEigenVectors.pointID : 5580x1 S.InterpolatedEigenVectors.points : 5580x3 S.ModalProps.attrs.centerOfMass : 1x3 S.ModalProps.attrs.domainSize : 1x1 S.ModalProps.attrs.totalFreeMass : 1x6 S.ModalProps.attrs.totalMass : 1x6 S.ModalProps.raw.centerOfMass : 1x3 S.ModalProps.raw.domainSize : 1x1 S.ModalProps.raw.eigenFrequency : 1x10 S.ModalProps.raw.eigenLambda : 1x10 S.ModalProps.raw.eigenOmega : 1x10 S.ModalProps.raw.eigenPeriod : 1x10 S.ModalProps.raw.partiFactorMX : 1x10 S.ModalProps.raw.partiFactorMY : 1x10 S.ModalProps.raw.partiFactorMZ : 1x10 S.ModalProps.raw.partiFactorRMX : 1x10 S.ModalProps.raw.partiFactorRMY : 1x10 S.ModalProps.raw.partiFactorRMZ : 1x10 S.ModalProps.raw.partiMassMX : 1x10 S.ModalProps.raw.partiMassMY : 1x10 S.ModalProps.raw.partiMassMZ : 1x10 S.ModalProps.raw.partiMassRMX : 1x10 S.ModalProps.raw.partiMassRMY : 1x10 S.ModalProps.raw.partiMassRMZ : 1x10 S.ModalProps.raw.partiMassRatiosCumuMX : 1x10 S.ModalProps.raw.partiMassRatiosCumuMY : 1x10 S.ModalProps.raw.partiMassRatiosCumuMZ : 1x10 S.ModalProps.raw.partiMassRatiosCumuRMX : 1x10 S.ModalProps.raw.partiMassRatiosCumuRMY : 1x10 S.ModalProps.raw.partiMassRatiosCumuRMZ : 1x10 S.ModalProps.raw.partiMassRatiosMX : 1x10 S.ModalProps.raw.partiMassRatiosMY : 1x10 S.ModalProps.raw.partiMassRatiosMZ : 1x10 S.ModalProps.raw.partiMassRatiosRMX : 1x10 S.ModalProps.raw.partiMassRatiosRMY : 1x10 S.ModalProps.raw.partiMassRatiosRMZ : 1x10 S.ModalProps.raw.partiMassesCumuMX : 1x10 S.ModalProps.raw.partiMassesCumuMY : 1x10 S.ModalProps.raw.partiMassesCumuMZ : 1x10 S.ModalProps.raw.partiMassesCumuRMX : 1x10 S.ModalProps.raw.partiMassesCumuRMY : 1x10 S.ModalProps.raw.partiMassesCumuRMZ : 1x10 S.ModalProps.raw.totalFreeMass : 1x6 S.ModalProps.raw.totalMass : 1x6 S.ModalProps.data : 10x34 S.ModeTags : 10x1

Let's look at the period of each mode.

1
S.ModalProps.raw.eigenPeriod
Output
ans = 1x10 2.2607 2.1196 1.9810 0.7388 0.6988 0.6564 0.4202 0.4051 0.3870 0.2951

Let's look at the cumulative participation mass ratio (%) in each direction.

1
S.ModalProps.raw.partiMassRatiosCumuMX
Output
ans = 1x10 0.0000 80.7272 80.7272 80.7272 91.1228 91.1228 91.1228 94.5874 94.5874 94.5874
1
S.ModalProps.raw.partiMassRatiosCumuMY
Output
ans = 1x10 79.6341 79.6341 79.6341 90.9131 90.9131 90.9131 94.4481 94.4481 94.4481 96.2749
1
S.ModalProps.raw.partiMassRatiosCumuMZ
Output
ans = 1x10 1.0e-28 * 0.0011 0.0011 0.0011 0.0366 0.0452 0.0509 0.2541 0.2549 0.3173 0.3245
1
S.ModalProps.raw.partiMassRatiosCumuRMX
Output
ans = 1x10 19.1567 19.1567 19.1567 71.8213 71.8213 71.8213 78.3219 78.3219 78.3219 85.4282
1
S.ModalProps.raw.partiMassRatiosCumuRMY
Output
ans = 1x10 0.0000 16.7152 16.7152 16.7152 67.3875 67.3875 67.3875 72.9309 72.9309 72.9309
1
S.ModalProps.raw.partiMassRatiosCumuRMZ
Output
ans = 1x10 0.0000 0.0000 81.5449 81.5449 81.5449 91.1897 91.1897 91.1897 94.6036 94.6036