```{raw} latex \clearpage ``` (sec-item-objectmasspoint)= # ObjectMassPoint A 3D mass point which is attached to a position-based node, usually NodePoint. ```{image} /docs/figures/itemImages/ObjectMassPoint.png :width: 500 ``` **Simpler**: [`mbs.CreateMassPoint`](#sec-mainsystemextensions-createmasspoint) adds this item, with what it needs, in one call. ## Interface - Python names: `ObjectMassPoint` or `MassPoint`, and `VMassPoint` for its visualization - Nodes it takes: [](#sec-item-nodepoint), [](#sec-item-noderigidbodyep), [](#sec-item-noderigidbodyrxyz), [](#sec-item-noderigidbodyrotveclg), [](#sec-item-nodepointslope1), [](#sec-item-nodepointslope12), [](#sec-item-nodepointslope23), [](#sec-item-nodepointground) - Body markers that can be placed on it: [](#sec-item-markerbodymass), [](#sec-item-markerbodyposition) ## Parameters The parameters of the item; in a dictionary, its type is 'MassPoint': | name | type | size | default | description | |---|---|---|---|---| | **name** | String | | '' | objects's unique name | | **mass** | UReal | | 0. | (symbol: $m$) mass [SI:kg] of mass point | | **nodeNumber** | NodeIndex | | invalid (-1) | (symbol: $n0$) node number (type NodeIndex) for mass point | | **visualization** | VObjectMassPoint | | | parameters for visualization of item | Renamed parameters, still taken with a `DeprecationWarning`: `physicsMass` (deprecated since 1.12.258, removed in 2031): use `mass`. ## Visualization parameters The parameters of `VObjectMassPoint`, given as `visualization`: | name | type | size | default | description | |---|---|---|---|---| | **show** | Bool | | True | set true, if item is shown in visualization and false if it is not shown | | **graphicsData** | BodyGraphicsData | | | Structure contains data for body visualization; data is defined in special list / dictionary structure | ## Drawing Drawn as [all bodies](#sec-drawing-objectsbody); its `graphicsData`, moved with the node; without `graphicsData` only the node is seen. ## Output variables Available as `OutputVariableType` in sensors, `Get...Output()` and other functions: ```{tabularcolumns} \Y{0.25}\Y{0.25}\Y{0.5} ``` | output variable | symbol | description | |---|---|---| | Position | $\LU{0}{\pv}\cConfig(\pLocB) = \LU{0}{\pRef}\cConfig + \LU{0}{\pRef}\cRef + \LU{0b}{\ImThree}\pLocB$ | global position vector of translated local position; local (body) coordinate system = global coordinate system | | Displacement | $\LU{0}{\uv}\cConfig = [q_0,\;q_1,\;q_2]\cConfig\tp$ | global displacement vector of mass point | | Velocity | $\LU{0}{\vv}\cConfig = \LU{0}{\dot\uv}\cConfig = [\dot q_0,\;\dot q_1,\;\dot q_2]\cConfig\tp$ | global velocity vector of mass point | | Acceleration | $\LU{0}{\av}\cConfig = \LU{0}{\ddot\uv}\cConfig = [\ddot q_0,\;\ddot q_1,\;\ddot q_2]\cConfig\tp$ | global acceleration vector of mass point | | RotationMatrix | | identity matrix (only for completeness) | | Rotation | $[0,0,0]$ | (only for completeness) | | AngularVelocity | $[0,0,0]$ | (only for completeness) | | AngularVelocityLocal | $[0,0,0]$ | (only for completeness) | | KineticEnergy | $T = \frac{1}{2} m\, \LU{0}{\vv}\tp \LU{0}{\vv}$ | kinetic energy of the mass point; localPosition must be $[0,0,0]$ | | PotentialEnergy | $V = 0$ | the body has no elastic energy; gravity and other loads are not part of it (see exudyn.advancedUtilities.LoadPotentialEnergy) - the value stays the same when a body gets a built-in gravity; localPosition must be $[0,0,0]$ | (description-objectmasspoint)= ## Detailed description ### Definition of quantities | intermediate variables | symbol | description | |---|---|---| | node position | $\LU{0}{\pv}\cConfig = \LU{0}{\pRef}\cRef + \LU{0}{\uv}\cConfig = \LU{0}{\pv}(n_0)\cConfig$ | position of the mass point, provided by node $n_0$, in any configuration | | node displacement | $\LU{0}{\uv}\cConfig = [q_0,\;q_1,\;q_2]\cConfig\tp$ | displacement of the mass point, the coordinates of node $n_0$ | | node velocity | $\LU{0}{\vv}\cConfig = [\dot q_0,\;\dot q_1,\;\dot q_2]\cConfig\tp$ | velocity of the mass point | | rotation matrix | $\LU{0b}{\Rot} = \ImThree$ | the body frame is the global frame | | applied forces | $\LU{0}{\fv}_a = [f_0,\;f_1,\;f_2]\tp$ | from loads, connectors and joint reaction forces | ### Equations of motion $$ \mr{m}{0}{0} {0}{m}{0} {0}{0}{m} \vr{\ddot q_0}{\ddot q_1}{\ddot q_2} = \vr{f_0}{f_1}{f_2} . $$ A `LoadCoordinate` on coordinate 1 of the node adds to $f_1$. ### Marker interfaces The position of a local point is $\LU{0}{\pv}\cConfig + \pLocB$, as the body frame is the global frame. The position Jacobian is the unit matrix, $$ \LU{0}{\Jm_{pos}} = \frac{\partial \LU{0}{\vv}}{\partial \dot\qv} = \mr{1}{0}{0} {0}{1}{0} {0}{0}{1} , $$ so a global force acts as it is, $\Qm = \LU{0}{\fv}_a$, and the mass-weighted Jacobian is $m$ times it. A mass point has no rotation: there is no rotation Jacobian, and no `MarkerBodyRigid` fits. (miniexample-objectmasspoint)= ## Mini example ```python node = mbs.AddNode(NodePoint(referenceCoordinates = [1,1,0], initialCoordinates=[0.5,0,0], initialVelocities=[0.5,0,0])) mbs.AddObject(MassPoint(nodeNumber = node, mass=1)) #assemble and solve system for default parameters mbs.Assemble() mbs.SolveDynamic() #check result exu.sys['testResult'] = mbs.GetNodeOutput(node, exu.OutputVariableType.Position)[0] #final x-coordinate of position shall be 2 ``` Examples (Ex) and TestModels (TM) that show this item, with weblink to github: [`basicTutorial2024.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/basicTutorial2024.py) (Ex), [`tutorialSpringDamper.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/notebooks/tutorialSpringDamper.py) (Ex), [`tutorialSpringDamperCreate.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/notebooks/tutorialSpringDamperCreate.py) (Ex), [`cartesianSpringDamper.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/cartesianSpringDamper.py) (Ex), [`coordinateSpringDamper.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/coordinateSpringDamper.py) (Ex)