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}\),

\[{\mathbf{J}}_{m,pos} = \frac{\partial \LU{0}{{\mathbf{v}}}_{m}}{\partial \dot {\mathbf{q}}_{n_b}} = \sum_i w_i \cdot {\mathbf{J}}_{i,pos}\]

in which \({\mathbf{J}}_{i,pos}\) denotes the position jacobian of mesh node \(i\),

\[{\mathbf{J}}_{i,pos} = \frac{\partial \LU{0}{{\mathbf{v}}}_{i}}{\partial \dot {\mathbf{q}}_{n_b}}\]

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:

The web version may not be complete. For details, consider also the Exudyn PDF documentation : theDoc.pdf