Skip to content

Commit 5f89826

Browse files
committed
updated theory for CMS in RST; added CMS-stress description
1 parent 3caf20e commit 5f89826

31 files changed

+1649
-110
lines changed

README.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Exudyn
3939

4040
**A flexible multibody dynamics systems simulation code with Python and C++**
4141

42-
Exudyn version = 1.8.28.dev1 (Jones)
42+
Exudyn version = 1.8.32.dev1 (Jones)
4343

4444
+ **University of Innsbruck**, Department of Mechatronics, Innsbruck, Austria
4545

docs/RST/Examples/reinforcementLearningRobot.rst

+795
Large diffs are not rendered by default.

docs/RST/Exudyn.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Exudyn
3939

4040
**A flexible multibody dynamics systems simulation code with Python and C++**
4141

42-
Exudyn version = 1.8.28.dev1 (Jones)
42+
Exudyn version = 1.8.32.dev1 (Jones)
4343

4444
+ **University of Innsbruck**, Department of Mechatronics, Innsbruck, Austria
4545

docs/RST/IntegrationPoints.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,4 @@ Further integration rules can be found in the C++ code of Exudyn, see file \ ``B
128128

129129

130130

131-
\ **For further information on this topic read**\ : `theDoc.pdf <https://github.com/jgerstmayr/EXUDYN/blob/master/docs/theDoc/theDoc.pdf>`_
131+

docs/RST/ModelOrderReductionAndComponentModeSynthesis.rst

+570
Large diffs are not rendered by default.

docs/RST/TheoryAndFormulationsIndex.rst

+1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ Theory and formulations
1010
DynamicsMechanicalPrinciples
1111
FramesRotationsAndCoordinateSystems
1212
IntegrationPoints
13+
ModelOrderReductionAndComponentModeSynthesis
1314

docs/RST/cInterface/MainSystem.rst

+20-11
Original file line numberDiff line numberDiff line change
@@ -1081,16 +1081,19 @@ Relevant Examples (Ex) and TestModels (TM) with weblink to github:
10811081

10821082
Function: ComputeLinearizedSystem
10831083
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1084-
`ComputeLinearizedSystem <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L366>`__\ (\ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``useSparseSolver = False``\ )
1084+
`ComputeLinearizedSystem <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L369>`__\ (\ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``projectIntoConstraintNullspace = False``\ , \ ``singularValuesTolerance = 1e-12``\ , \ ``returnConstraintJacobian = False``\ , \ ``returnConstraintNullspace = False``\ )
10851085

10861086
- | \ *function description*\ :
1087-
| compute linearized system of equations for ODE2 part of mbs, not considering the effects of algebraic constraints
1087+
| compute linearized system of equations for ODE2 part of mbs, not considering the effects of algebraic constraints; for computation of eigenvalues and advanced computation with constrained systems, see ComputeODE2Eigenvalues; the current implementation is also able to project into the constrained space, however, this currently does not generally work with non-holonomic systems
10881088
| - NOTE that this function is added to MainSystem via Python function ComputeLinearizedSystem.
10891089
- | \ *input*\ :
10901090
| \ ``simulationSettings``\ : specific simulation settings used for computation of jacobian (e.g., sparse mode in static solver enables sparse computation)
1091-
| \ ``useSparseSolver``\ : if False (only for small systems), all eigenvalues are computed in dense mode (slow for large systems!); if True, only the numberOfEigenvalues are computed (numberOfEigenvalues must be set!); Currently, the matrices are exported only in DENSE MODE from mbs! NOTE that the sparsesolver accuracy is much less than the dense solver
1091+
| \ ``projectIntoConstraintNullspace``\ : if False, algebraic equations (and constraint jacobian) are not considered for the linearized system; if True, the equations are projected into the nullspace of the constraints in the current configuration, using singular value decomposition; in the latter case, the returned list contains [M, K, D, C, N] where C is the constraint jacobian and N is the nullspace matrix (C and N may be an empty list, depending on the following flags)
1092+
| \ ``singularValuesTolerance``\ : tolerance used to distinguish between zero and nonzero singular values for algebraic constraints projection
1093+
| \ ``returnConstraintJacobian``\ : if True, the returned list contains [M, K, D, C, N] where C is the constraint jacobian and N is the nullspace matrix (may be empty)
1094+
| \ ``returnConstraintNullspace``\ : if True, the returned list contains [M, K, D, C, N] where C is the constraint jacobian (may be empty) and N is the nullspace matrix
10921095
- | \ *output*\ :
1093-
| [ArrayLike, ArrayLike, ArrayLike]; [M, K, D]; list containing numpy mass matrix M, stiffness matrix K and damping matrix D
1096+
| [ArrayLike, ArrayLike, ArrayLike]; [M, K, D]; list containing numpy mass matrix M, stiffness matrix K and damping matrix D; for constraints, see options with arguments above, return values may change to [M, K, D, C, N]
10941097
- | \ *notes*\ :
10951098
| consider paper of Agundez, Vallejo, Freire, Mikkola, "The dependent coordinates in the linearization of constrained multibody systems: Handling and elimination", https://www.sciencedirect.com/science/article/pii/S0020740324000791
10961099
- | \ *example*\ :
@@ -1131,19 +1134,19 @@ Relevant Examples (Ex) and TestModels (TM) with weblink to github:
11311134

11321135
Function: ComputeODE2Eigenvalues
11331136
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1134-
`ComputeODE2Eigenvalues <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L443>`__\ (\ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``useSparseSolver = False``\ , \ ``numberOfEigenvalues = 0``\ , \ ``constrainedCoordinates = []``\ , \ ``convert2Frequencies = False``\ , \ ``useAbsoluteValues = True``\ , \ ``computeComplexEigenvalues = False``\ , \ ``ignoreAlgebraicEquations = False``\ , \ ``singularValuesTolerance = 1e-12``\ )
1137+
`ComputeODE2Eigenvalues <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L502>`__\ (\ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``useSparseSolver = False``\ , \ ``numberOfEigenvalues = 0``\ , \ ``constrainedCoordinates = []``\ , \ ``convert2Frequencies = False``\ , \ ``useAbsoluteValues = True``\ , \ ``computeComplexEigenvalues = False``\ , \ ``ignoreAlgebraicEquations = False``\ , \ ``singularValuesTolerance = 1e-12``\ )
11351138

11361139
- | \ *function description*\ :
1137-
| compute eigenvalues for unconstrained ODE2 part of mbs; the computation may include constraints in case that ignoreAlgebraicEquations=False; for algebraic constraints, however, a dense singular value decomposition of the constraint jacobian is used for the nullspace projection; the computation is done for the initial values of the mbs, independently of previous computations. If you would like to use the current state for the eigenvalue computation, you need to copy the current state to the initial state (using GetSystemState, SetSystemState, see Section :ref:`sec-mbs-systemdata`\ ); note that mass and stiffness matrices are computed in dense mode so far, while eigenvalues are computed according to useSparseSolver.
1140+
| compute eigenvalues for unconstrained ODE2 part of mbs; the computation may include constraints in case that ignoreAlgebraicEquations=False (however, this currently does not generally work with non-holonomic systems); for algebraic constraints, however, a dense singular value decomposition of the constraint jacobian is used for the nullspace projection; the computation is done for the initial values of the mbs, independently of previous computations. If you would like to use the current state for the eigenvalue computation, you need to copy the current state to the initial state (using GetSystemState, SetSystemState, see Section :ref:`sec-mbs-systemdata`\ ); note that mass and stiffness matrices are computed in dense mode so far, while eigenvalues are computed according to useSparseSolver.
11381141
| - NOTE that this function is added to MainSystem via Python function ComputeODE2Eigenvalues.
11391142
- | \ *input*\ :
11401143
| \ ``simulationSettings``\ : specific simulation settings used for computation of jacobian (e.g., sparse mode in static solver enables sparse computation)
1141-
| \ ``useSparseSolver``\ : if False (only for small systems), all eigenvalues are computed in dense mode (slow for large systems!); if True, only the numberOfEigenvalues are computed (numberOfEigenvalues must be set!); Currently, the matrices are exported only in DENSE MODE from mbs! NOTE that the sparsesolver accuracy is much less than the dense solver
1144+
| \ ``useSparseSolver``\ : if False (only for small systems), all eigenvalues are computed in dense mode (slow for large systems!); if True, only the numberOfEigenvalues are computed (numberOfEigenvalues must be set!); Currently, the matrices are exported only in DENSE MODE from mbs, which means that intermediate matrices may become huge for more than 5000 coordinates! NOTE that the sparsesolver accuracy is much less than the dense solver
11421145
| \ ``numberOfEigenvalues``\ : number of eigenvalues and eivenvectors to be computed; if numberOfEigenvalues==0, all eigenvalues will be computed (may be impossible for larger or sparse problems!)
11431146
| \ ``constrainedCoordinates``\ : if this list is non-empty (and there are no algebraic equations or ignoreAlgebraicEquations=True), the integer indices represent constrained coordinates of the system, which are fixed during eigenvalue/vector computation; according rows/columns of mass and stiffness matrices are erased; in this case, algebraic equations of the system are ignored
11441147
| \ ``convert2Frequencies``\ : if True, the eigen values are converted into frequencies (Hz) and the output is [eigenFrequencies, eigenVectors]
11451148
| \ ``useAbsoluteValues``\ : if True, abs(eigenvalues) is used, which avoids problems for small (close to zero) eigenvalues; needed, when converting to frequencies
1146-
| \ ``computeComplexEigenvalues``\ : if True, the system is converted into a system of first order differential equations, including damping; only implemented for dense solver!
1149+
| \ ``computeComplexEigenvalues``\ : if True, the system is converted into a system of first order differential equations, including damping; for complex eigenvalues, set useAbsoluteValues=False (otherwise you will not get the complex values; values are unsorted, however!); only implemented for dense solver
11471150
| \ ``ignoreAlgebraicEquations``\ : if True, algebraic equations (and constraint jacobian) are not considered for eigenvalue computation; otherwise, the solver tries to automatically project the system into the nullspace kernel of the constraint jacobian using a SVD; this gives eigenvalues of the constrained system; eigenvectors are not computed
11481151
| \ ``singularValuesTolerance``\ : tolerance used to distinguish between zero and nonzero singular values for algebraic constraints projection
11491152
- | \ *output*\ :
@@ -1163,7 +1166,6 @@ Function: ComputeODE2Eigenvalues
11631166
mbs = SC.AddSystem()
11641167
#
11651168
b0 = mbs.CreateMassPoint(referencePosition = [2,0,0],
1166-
initialVelocity = [2*0,5,0],
11671169
physicsMass = 1, gravity = [0,-9.81,0],
11681170
drawSize = 0.5, color=color4blue)
11691171
#
@@ -1178,7 +1180,14 @@ Function: ComputeODE2Eigenvalues
11781180
mbs.Assemble()
11791181
#
11801182
[eigenvalues, eigenvectors] = mbs.ComputeODE2Eigenvalues()
1181-
#==>eigenvalues contain the eigenvalues of the ODE2 part of the system in the current configuration
1183+
#==>eigenvalues contain the eigenvalues of the ODE2 part of the system in the current configuration
1184+
#
1185+
#compute eigenfrequencies in Hz (analytical: 100/2/pi Hz for y-direction):
1186+
[eigenvaluesHz, ev] = mbs.ComputeODE2Eigenvalues(convert2Frequencies=True)
1187+
#
1188+
#compute complex eigenvalues:
1189+
[eigenvaluesComplex, ev] = mbs.ComputeODE2Eigenvalues(computeComplexEigenvalues=True,
1190+
useAbsoluteValues=False)
11821191
11831192
11841193
Relevant Examples (Ex) and TestModels (TM) with weblink to github:
@@ -1191,7 +1200,7 @@ Relevant Examples (Ex) and TestModels (TM) with weblink to github:
11911200

11921201
Function: ComputeSystemDegreeOfFreedom
11931202
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1194-
`ComputeSystemDegreeOfFreedom <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L660>`__\ (\ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``threshold = 1e-12``\ , \ ``verbose = False``\ , \ ``useSVD = False``\ )
1203+
`ComputeSystemDegreeOfFreedom <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L719>`__\ (\ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``threshold = 1e-12``\ , \ ``verbose = False``\ , \ ``useSVD = False``\ )
11951204

11961205
- | \ *function description*\ :
11971206
| compute system DOF numerically, considering Grübler-Kutzbach formula as well as redundant constraints; uses numpy matrix rank or singular value decomposition of scipy (useSVD=True)

docs/RST/pythonUtilities/solver.rst

+4-4
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ Function: SolverSuccess
8383

8484
Function: ComputeLinearizedSystem
8585
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
86-
`ComputeLinearizedSystem <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L366>`__\ (\ ``mbs``\ , \ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``useSparseSolver = False``\ )
86+
`ComputeLinearizedSystem <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L369>`__\ (\ ``mbs``\ , \ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``projectIntoConstraintNullspace = False``\ , \ ``singularValuesTolerance = 1e-12``\ , \ ``returnConstraintJacobian = False``\ , \ ``returnConstraintNullspace = False``\ )
8787

8888

8989
- | **NOTE**\ : this function is directly available in MainSystem (mbs); it should be directly called as mbs.ComputeLinearizedSystem(...). For description of the interface, see the MainSystem Python extensions, :ref:`sec-mainsystemextensions-computelinearizedsystem`\
@@ -94,7 +94,7 @@ Function: ComputeLinearizedSystem
9494

9595
Function: ComputeODE2Eigenvalues
9696
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
97-
`ComputeODE2Eigenvalues <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L443>`__\ (\ ``mbs``\ , \ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``useSparseSolver = False``\ , \ ``numberOfEigenvalues = 0``\ , \ ``constrainedCoordinates = []``\ , \ ``convert2Frequencies = False``\ , \ ``useAbsoluteValues = True``\ , \ ``computeComplexEigenvalues = False``\ , \ ``ignoreAlgebraicEquations = False``\ , \ ``singularValuesTolerance = 1e-12``\ )
97+
`ComputeODE2Eigenvalues <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L502>`__\ (\ ``mbs``\ , \ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``useSparseSolver = False``\ , \ ``numberOfEigenvalues = 0``\ , \ ``constrainedCoordinates = []``\ , \ ``convert2Frequencies = False``\ , \ ``useAbsoluteValues = True``\ , \ ``computeComplexEigenvalues = False``\ , \ ``ignoreAlgebraicEquations = False``\ , \ ``singularValuesTolerance = 1e-12``\ )
9898

9999

100100
- | **NOTE**\ : this function is directly available in MainSystem (mbs); it should be directly called as mbs.ComputeODE2Eigenvalues(...). For description of the interface, see the MainSystem Python extensions, :ref:`sec-mainsystemextensions-computeode2eigenvalues`\
@@ -105,7 +105,7 @@ Function: ComputeODE2Eigenvalues
105105

106106
Function: ComputeSystemDegreeOfFreedom
107107
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
108-
`ComputeSystemDegreeOfFreedom <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L660>`__\ (\ ``mbs``\ , \ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``threshold = 1e-12``\ , \ ``verbose = False``\ , \ ``useSVD = False``\ )
108+
`ComputeSystemDegreeOfFreedom <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L719>`__\ (\ ``mbs``\ , \ ``simulationSettings = exudyn.SimulationSettings()``\ , \ ``threshold = 1e-12``\ , \ ``verbose = False``\ , \ ``useSVD = False``\ )
109109

110110

111111
- | **NOTE**\ : this function is directly available in MainSystem (mbs); it should be directly called as mbs.ComputeSystemDegreeOfFreedom(...). For description of the interface, see the MainSystem Python extensions, :ref:`sec-mainsystemextensions-computesystemdegreeoffreedom`\
@@ -119,7 +119,7 @@ Function: ComputeSystemDegreeOfFreedom
119119

120120
Function: CheckSolverInfoStatistics
121121
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
122-
`CheckSolverInfoStatistics <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L747>`__\ (\ ``solverName``\ , \ ``infoStat``\ , \ ``numberOfEvaluations``\ )
122+
`CheckSolverInfoStatistics <https://github.com/jgerstmayr/EXUDYN/blob/master/main/pythonDev/exudyn/solver.py\#L806>`__\ (\ ``solverName``\ , \ ``infoStat``\ , \ ``numberOfEvaluations``\ )
123123

124124
- | \ *function description*\ :
125125
| helper function for solvers to check e.g. if high number of memory allocations happened during simulation

docs/RST/trackerlog.rst

+18-10
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,27 @@ BUG numbers refer to the according issue numbers.
1919

2020
General information on current version:
2121

22-
+ Exudyn version = 1.8.28.dev1,
23-
+ last change = 2024-05-04,
24-
+ Number of issues = 1834,
25-
+ Number of resolved issues = 1622 (28 in current version),
22+
+ Exudyn version = 1.8.32.dev1,
23+
+ last change = 2024-05-09,
24+
+ Number of issues = 1837,
25+
+ Number of resolved issues = 1626 (32 in current version),
2626

2727
***********
2828
Version 1.8
2929
***********
3030

31+
* Version 1.8.32: resolved Issue 1832: theory docu (docu)
32+
- description: add description of computation of stresses for FFRFreducedOrder
33+
- date resolved: **2024-05-09 17:12**\ , date raised: 2024-05-03
34+
* Version 1.8.31: resolved Issue 1836: ComputeLinearizedSystem (extension)
35+
- description: output constraint and nullspace matrices for constrained systems
36+
- date resolved: **2024-05-05 16:18**\ , date raised: 2024-05-05
37+
* Version 1.8.30: resolved Issue 1835: ComputeLinearizedSystem (extension)
38+
- description: add option to compute linearized system of constrained system
39+
- date resolved: **2024-05-05 16:18**\ , date raised: 2024-05-05
40+
* Version 1.8.29: resolved Issue 1834: ComputeLinearizedSystem (change)
41+
- description: remove sparse solver option useSparseSolver, as it is not implemented
42+
- date resolved: **2024-05-05 16:17**\ , date raised: 2024-05-05
3143
* Version 1.8.28: resolved Issue 1833: ComputeODE2EigenValues (extension)
3244
- description: extend to complex eigenvalues
3345
- **notes:** added TestModel complexEigenvaluesTest.py
@@ -61,7 +73,7 @@ Version 1.8
6173
- description: change type in AddObject, AddMarker, AddSensor, AddLoad, AddNode from pyObject: dict to pyObject: Any in order to resolve typing errors
6274
- date resolved: **2024-04-21 19:16**\ , date raised: 2024-04-19
6375
* Version 1.8.18: resolved Issue 1819: KinematicTreePendulum.py (example)
64-
- description: Version 1.7.71 broke example kinematicTreePendulum with transition from SensorObject to SensorBody
76+
- description: Version 1.7.71 broke example kinematicTreePendulum with transition from SensorObject to SensorBody
6577
- **notes:** changed SensorObject(objectNumber=oKT into SensorBody(bodyNumber=oKT
6678
- date resolved: **2024-04-17 16:13**\ , date raised: 2024-04-17
6779
- resolved by: P. Manzl
@@ -80,7 +92,7 @@ Version 1.8
8092
- description: .pyi files do not contain correct default args for C++ interfaces
8193
- date resolved: **2024-04-14 16:15**\ , date raised: 2024-04-14
8294
* Version 1.8.13: resolved Issue 1815: stub files (fix)
83-
- description: .pyi files contain _ instead of _ from latex documentation
95+
- description: .pyi are missing backslash before underscore (for latex) documentation
8496
- date resolved: **2024-04-14 15:15**\ , date raised: 2024-04-14
8597
* Version 1.8.12: resolved Issue 1812: GetMarkerOutput (fix)
8698
- description: not working for MarkerKinematicTreeRigid in case of Reference configuration; adjustments done in CObjectKinematicTree::ComputeTreeTransformations to avoid the need for velocities in the retrieval of positions
@@ -5273,10 +5285,6 @@ Version 0.1
52735285
Open issues
52745286
***********
52755287

5276-
* **open issue 1832:** theory docu
5277-
- description: add description of computation of stresses for FFRFreducedOrder
5278-
- date raised: 2024-05-03
5279-
52805288
* **open issue 1825:** GraphicsDataCube
52815289
- description: rename to GraphicsDataBrick... functions; use assignment to keep previous functionality
52825290
- date raised: 2024-04-25

0 commit comments

Comments
 (0)