MarkerSuperElementPosition
A position marker attached to a SuperElement, such as ObjectFFRF, ObjectGenericODE2 and ObjectFFRFreducedOrder (for which it is in its current implementation inefficient for large number of meshNodeNumbers). The marker acts on the mesh (interface) nodes, not on the underlying nodes of the object.
Additional information for MarkerSuperElementPosition:
- This
Marker
has/provides the following types =Object
,Body
,Position
The item MarkerSuperElementPosition with type = ‘SuperElementPosition’ has the following parameters:
- name [type = String, default = ‘’]:marker’s unique name
- bodyNumber [\(n_b\), type = ObjectIndex, default = invalid (-1)]:body number to which marker is attached to
- meshNodeNumbers [\([k_0,\,\ldots,\,k_{n_m-1}]\tp\), type = ArrayIndex, default = []]:a list of \(n_m\) mesh node numbers of superelement (=interface nodes) which are used to compute the body-fixed marker position; the related nodes must provide 3D position information, such as NodePoint, NodePoint2D, NodeRigidBody[..]; in order to retrieve the global node number, the generic body needs to convert local into global node numbers
- weightingFactors [\([w_{0},\,\ldots,\,w_{n_m-1}]\tp\), type = Vector, default = []]:a list of \(n_m\) weighting factors per node to compute the final local position; the sum of these weights shall be 1, such that a summation of all nodal positions times weights gives the average position of the marker
- visualization [type = VMarkerSuperElementPosition]:parameters for visualization of item
The item VMarkerSuperElementPosition has the following parameters:
- show [type = Bool, default = True]:set true, if item is shown in visualization and false if it is not shown
- showMarkerNodes [type = Bool, default = True]:set true, if all nodes are shown (similar to marker, but with less intensity)
DESCRIPTION of MarkerSuperElementPosition
Definition of marker quantities:
intermediate variables
|
symbol
|
description
|
---|---|---|
number of mesh nodes
|
\(n_m\)
|
size of
meshNodeNumbers and weightingFactors which are marked; this must not be the number of mesh nodes in the marked object |
mesh node number
|
\(i = k_i\)
|
abbreviation
|
mesh node points
|
\(\LU{0}{{\mathbf{p}}}_{i}\)
|
position of mesh node \(k_i\) in object \(n_b\)
|
mesh node velocities
|
\(\LU{0}{{\mathbf{v}}}_{i}\)
|
velocity of mesh node \(i\) in object \(n_b\)
|
marker position
|
\(\LU{0}{{\mathbf{p}}}_{m} = \sum_i w_i \cdot \LU{0}{{\mathbf{p}}_i}\)
|
current global position which is provided by marker
|
marker velocity
|
\(\LU{0}{{\mathbf{v}}}_{m} = \sum_i w_i \cdot \LU{0}{{\mathbf{v}}_i}\)
|
current global velocity which is provided by marker
|
Marker quantities
The marker provides a ‘position’ jacobian, which is the derivative of the marker velocity w.r.t.the object velocity coordinates \(\dot {\mathbf{q}}_{n_b}\),
in which \({\mathbf{J}}_{i,pos}\) denotes the position jacobian of mesh node \(i\),
The jacobian \({\mathbf{J}}_{i,pos}\) usually contains mostly zeros for ObjectGenericODE2
, because the jacobian only affects one single node.
In ObjectFFRFreducedOrder
, the jacobian may affect all reduced coordinates.
Note that \({\mathbf{J}}_{m,pos}\) is actually computed by the
ObjectSuperElement
within the function GetAccessFunctionSuperElement
.
MINI EXAMPLE for MarkerSuperElementPosition
1#set up a mechanical system with two nodes; it has the structure: |~~M0~~M1
2#==>further examples see objectGenericODE2Test.py, objectFFRFTest2.py, etc.
3nMass0 = mbs.AddNode(NodePoint(referenceCoordinates=[0,0,0]))
4nMass1 = mbs.AddNode(NodePoint(referenceCoordinates=[1,0,0]))
5mGround = mbs.AddMarker(MarkerBodyPosition(bodyNumber=oGround, localPosition = [1,0,0]))
6
7mass = 0.5 * np.eye(3) #mass of nodes
8stif = 5000 * np.eye(3) #stiffness of nodes
9damp = 50 * np.eye(3) #damping of nodes
10Z = 0. * np.eye(3) #matrix with zeros
11#build mass, stiffness and damping matrices (:
12M = np.block([[mass, 0.*np.eye(3)],
13 [0.*np.eye(3), mass ] ])
14K = np.block([[2*stif, -stif],
15 [ -stif, stif] ])
16D = np.block([[2*damp, -damp],
17 [ -damp, damp] ])
18
19oGenericODE2 = mbs.AddObject(ObjectGenericODE2(nodeNumbers=[nMass0,nMass1],
20 massMatrix=M,
21 stiffnessMatrix=K,
22 dampingMatrix=D))
23
24#EXAMPLE for single node marker on super element body, mesh node 1; compare results to ObjectGenericODE2 example!!!
25mSuperElement = mbs.AddMarker(MarkerSuperElementPosition(bodyNumber=oGenericODE2, meshNodeNumbers=[1], weightingFactors=[1]))
26mbs.AddLoad(Force(markerNumber = mSuperElement, loadVector = [10, 0, 0]))
27
28#assemble and solve system for default parameters
29mbs.Assemble()
30
31mbs.SolveDynamic(solverType = exudyn.DynamicSolverType.TrapezoidalIndex2)
32
33#check result at default integration time
34exudynTestGlobals.testResult = mbs.GetNodeOutput(nMass1, exu.OutputVariableType.Position)[0]
Relevant Examples and TestModels with weblink:
NGsolvePistonEngine.py (Examples/), NGsolvePostProcessingStresses.py (Examples/), objectFFRFreducedOrderNetgen.py (Examples/), objectFFRFreducedOrderAccelerations.py (TestModels/), objectFFRFreducedOrderStressModesTest.py (TestModels/), objectFFRFreducedOrderTest.py (TestModels/), objectFFRFTest.py (TestModels/), objectFFRFTest2.py (TestModels/), objectGenericODE2Test.py (TestModels/), perfObjectFFRFreducedOrder.py (TestModels/), superElementRigidJointTest.py (TestModels/)
The web version may not be complete. For details, consider also the Exudyn PDF documentation : theDoc.pdf