```{raw} latex \clearpage ``` (sec-item-nodepoint2dslope1)= # NodePoint2DSlope1 A 2D point/slope vector node for planar Bernoulli-Euler ANCF (absolute nodal coordinate formulation) beam elements. The node has 4 displacement degrees of freedom (2 for displacement of point node and 2 for the slope vector 'slopex'); all coordinates lead to second order differential equations; the slope vector defines the directional derivative w.r.t the local axial (x) coordinate, denoted as $()^\prime$; in straight configuration aligned at the global x-axis, the slope vector reads $\rv^\prime=[r_x^\prime\;\;r_y^\prime]^T=[1\;\;0]^T$. ## Interface - Python names: `NodePoint2DSlope1` or `Point2DS1`, and `VPoint2DS1` for its visualization - Provides: `Position2D`, `Orientation2D`, `Point2DSlope1` - Node markers that can be attached: [](#sec-item-markernodeposition), [](#sec-item-markernoderigid) - Objects that take this node: [](#sec-item-objectmasspoint2d), [](#sec-item-objectrigidbody2d), [](#sec-item-objectancfcable2d), [](#sec-item-objectbeamgeometricallyexact2d) ## Parameters The parameters of the item; in a dictionary, its type is 'Point2DSlope1': | name | type | size | default | description | |---|---|---|---|---| | **name** | String | | '' | node's unique name | | **referenceCoordinates** | Vector4D | 4 | [0.,0.,1.,0.] | reference coordinates (x-pos,y-pos; x-slopex, y-slopex) of node; global position of node without displacement | | **initialCoordinates** | Vector4D | 4 | [0.,0.,0.,0.] | initial displacement coordinates: ux, uy and x/y 'displacements' of slopex | | **initialVelocities** | Vector4D | 4 | [0.,0.,0.,0.] | initial velocity coordinates | | **visualization** | VNodePoint2DSlope1 | | | parameters for visualization of item | ## Visualization parameters The parameters of `VNodePoint2DSlope1`, 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 | | **drawSize** | float | | -1. | drawing size (diameter, dimensions of underlying cube, etc.) for item; size == -1.f means that default size is used | | **color** | Float4 | 4 | [-1.,-1.,-1.,-1.] | Default RGBA color for nodes; 4th value is alpha-transparency; R=-1.f means, that default color is used | ## Drawing Drawn as [all nodes](#sec-drawing-nodes); with `nodes.showNodalSlopes`, also its slope vector. Settings beyond those of all nodes: [`nodes.showNodalSlopes`](#sec-vsettingsnodes). ## 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 = [p_0,\, p_1,\,0]\cConfig\tp$ | global 3D position vector of node (=displacement+reference position) | | Displacement | $\LU{0}{\uv}\cConfig = [q_0,\, q_1,\,0]\cConfig\tp$ | global 3D displacement vector of node | | Velocity | $\LU{0}{\vv}\cConfig = [\dot q_0,\,\dot q_1,\,0]\cConfig\tp$ | global 3D velocity vector of node | | Acceleration | $\LU{0}{\av}\cConfig = [\ddot q_0,\,\ddot q_1,\,0]\cConfig\tp$ | global 3D acceleration vector of node | | CoordinatesTotal | | displacement plus reference coordinates of node | | Coordinates | | coordinates vector of node (2 displacement coordinates + 2 slope vector coordinates) | | Coordinates_t | | velocity coordinates vector of node (derivative of the 2 displacement coordinates + 2 slope vector coordinates) | | Coordinates_tt | | acceleration coordinates vector of node (derivative of the 2 displacement coordinates + 2 slope vector coordinates) | (description-nodepoint2dslope1)= ## Detailed description ### Coordinates | index | symbol | kind | meaning | frame | |---|---|---|---|---| | 0, 1 | $q_0,\,q_1$ | {ref}`ODE2 ` | displacement of the node position $\rv$ | global | | 2, 3 | $q_2,\,q_3$ | {ref}`ODE2 ` | change of the slope vector $\rv^\prime$ | global | ### Configuration Position and slope vector are the sums of reference and current values, $$ \rv = \rv\cRef + [q_0,\,q_1]\tp, \quad \rv^\prime = \rv^\prime\cRef + [q_2,\,q_3]\tp . $$ ### The slope vector The slope vector is the derivative of the position of the beam axis with respect to the axial coordinate $x$ of the element in its reference configuration, $\rv^\prime = \partial \rv / \partial x$. In a straight beam along the global $x$-axis it is $[1,\;0]\tp$, which is the default of the reference coordinates. Its **direction** is the tangent of the beam axis, and so the rotation of the cross section in a Bernoulli-Euler beam; its **length** is one plus the axial strain, $\varepsilon = \|\rv^\prime\| - 1$, as `ObjectANCFCable2D` computes it. A reference slope of length other than one therefore describes a pre-strained beam. ### Frame and interpretation All four coordinates are global, with no rotation parameters: this is the absolute nodal coordinate formulation. The node is used by the planar ANCF cable elements, `ObjectANCFCable2D` and `ObjectALEANCFCable2D`, which share the node between neighbouring elements; the beam utilities (`exudyn.beams`) create them. ### Action on the equations of motion The four coordinates lead to four {ref}`ODE2 ` equations, which the element provides. A force at the node enters the first two; `MarkerNodeRigid` sees the node as a position with the orientation of the slope vector. (miniexample-nodepoint2dslope1)= ## Mini example ```python #a cantilever of one ANCF cable element: position and slope (r_x) at each node L = 1; EI = 100; F = -0.1 n0 = mbs.AddNode(NodePoint2DSlope1(referenceCoordinates=[0,0, 1,0])) #position, slope = axis n1 = mbs.AddNode(NodePoint2DSlope1(referenceCoordinates=[L,0, 1,0])) mbs.AddObject(ObjectANCFCable2D(nodeNumbers=[n0,n1], length=L, massPerLength=1, bendingStiffness=EI, axialStiffness=1e5)) mGround = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=nGround, coordinate=0)) for i in [0,1,3]: #clamped: x, y and the y-component of the slope mCoord = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=n0, coordinate=i)) mbs.AddObject(ObjectConnectorCoordinate(markerNumbers=[mGround, mCoord])) mTip = mbs.AddMarker(MarkerNodePosition(nodeNumber=n1)) mbs.AddLoad(LoadForceVector(markerNumber=mTip, loadVector=[0,F,0])) mbs.Assemble() mbs.SolveStatic() #the cubic element is exact for a tip load: F*L^3/(3*EI) = -1/3000 exu.sys['testResult'] = mbs.GetNodeOutput(n1, exu.OutputVariableType.Displacement)[1]*1000 #-1/3 ``` Relevant Examples (Ex) and TestModels (TM) with weblink to github: [`ALEANCFpipe.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ALEANCFpipe.py) (Ex), [`ANCFcantileverTestDyn.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ANCFcantileverTestDyn.py) (Ex), [`ANCFcontactCircle.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ANCFcontactCircle.py) (Ex), [`ANCFcontactCircle2.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ANCFcontactCircle2.py) (Ex), [`ANCFmovingRigidbody.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ANCFmovingRigidbody.py) (Ex), [`ANCFslidingJoint2D.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ANCFslidingJoint2D.py) (Ex), [`ANCFslidingJoint2Drigid.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ANCFslidingJoint2Drigid.py) (Ex), [`ANCFswitchingSlidingJoint2D.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ANCFswitchingSlidingJoint2D.py) (Ex), [`ANCFtestHalfcircle.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ANCFtestHalfcircle.py) (Ex), [`ANCFtests2.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/ANCFtests2.py) (Ex), [`sliderCrank3DwithANCFbeltDrive.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/sliderCrank3DwithANCFbeltDrive.py) (Ex), [`solverFunctionsTestEigenvalues.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/solverFunctionsTestEigenvalues.py) (Ex), [`createItemNumbersTest.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/TestModels/createItemNumbersTest.py) (TM), [`energiesFlexibleBodiesTest.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/TestModels/energiesFlexibleBodiesTest.py) (TM), [`energiesTest.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/TestModels/energiesTest.py) (TM), ...