NodePointSlope23
A 3D point/slope vector node for spatial, shear and cross-section deformable ANCF (absolute nodal coordinate formulation) beam elements, with 3 position and 2 \(\times\) 3 slope coordinates, all ODE2; the slope vectors are the derivatives of the position with respect to the two cross section coordinates \(y\) and \(z\).
Interface
Provides:
Position,Orientation,PointSlope23Node markers that can be attached: MarkerNodePosition, MarkerNodeRigid, MarkerNodeRotationCoordinate
Objects that take this node: ObjectMassPoint, ObjectANCFBeam, ObjectBeamGeometricallyExact
Parameters
The parameters of the item; in a dictionary, its type is ‘PointSlope23’:
name |
type |
size |
default |
description |
|---|---|---|---|---|
name |
String |
‘’ |
node’s unique name |
|
referenceCoordinates |
Vector9D |
9 |
[0.,0.,0.,0.,1.,0.,0.,0.,1.] |
reference coordinates (x-pos,y-pos,z-pos; x-slopey, y-slopey, z-slopey; x-slopez, y-slopez, z-slopez) of node; global position of node without displacement |
initialCoordinates |
Vector9D |
9 |
[0.,0.,0.,0.,0.,0.,0.,0.,0.] |
initial displacement coordinates relative to reference coordinates |
initialVelocities |
Vector9D |
9 |
[0.,0.,0.,0.,0.,0.,0.,0.,0.] |
initial velocity coordinates |
visualization |
VNodePointSlope23 |
parameters for visualization of item |
Visualization parameters
The parameters of VNodePointSlope23, 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; with nodes.showNodalSlopes, also its slope vectors.
Settings beyond those of all nodes: nodes.showNodalSlopes.
Output variables
Available as OutputVariableType in sensors, Get...Output() and other functions:
output variable |
symbol |
description |
|---|---|---|
Position |
\(\LU{0}{\pv}\cConfig = \LU{0}{[p_0,\, p_1,\, p_2]}\cConfig\tp\) |
global 3D position vector of node (=displacement+reference position) |
Displacement |
\(\LU{0}{\uv}\cConfig = \LU{0}{[q_0,\, q_1,\, q_2]}\cConfig\tp\) |
global 3D displacement vector of node |
Velocity |
\(\LU{0}{\vv}\cConfig = \LU{0}{[\dot q_0,\,\dot q_1,\,\dot q_2]}\cConfig\tp\) |
global 3D velocity vector of node |
Acceleration |
\(\LU{0}{\av}\cConfig = \LU{0}{[\ddot q_0,\,\ddot q_1,\,\ddot q_2]}\cConfig\tp\) |
global 3D acceleration vector of node |
CoordinatesTotal |
displacement plus reference coordinates of node |
|
Coordinates |
coordinate vector of node (relative to reference configuration) |
|
Coordinates_t |
velocity coordinates vector of node |
|
Coordinates_tt |
acceleration coordinates vector of node |
|
RotationMatrix |
\([A_{00},\,A_{01},\,A_{02},\,A_{10},\,\ldots,\,A_{21},\,A_{22}]\cConfig\tp\) |
vector with 9 components of the rotation matrix \(\LU{0b}{\Rot}\cConfig\) in row-major format, in any configuration; the rotation matrix transforms local (\(b\)) to global (0) coordinates |
Rotation |
\([\varphi_0,\,\varphi_1,\,\varphi_2]\tp\cConfig\) |
vector with 3 components of the Euler / Tait-Bryan angles in xyz-sequence |
AngularVelocity |
\(\LU{0}{\tomega}\cConfig = \LU{0}{[\omega_0,\,\omega_1,\,\omega_2]}\cConfig\tp\) |
global 3D angular velocity vector of node |
AngularVelocityLocal |
\(\LU{b}{\tomega}\cConfig = \LU{b}{[\omega_0,\,\omega_1,\,\omega_2]}\cConfig\tp\) |
local (body-fixed) 3D angular velocity vector of node |
Detailed description
Coordinates
index |
symbol |
kind |
meaning |
frame |
|---|---|---|---|---|
0, 1, 2 |
\(q_0,\,q_1,\,q_2\) |
displacement of the node position \(\rv\) |
global |
|
3, 4, 5 |
\(q_3,\,q_4,\,q_5\) |
change of the slope vector \(\rv_y\) |
global |
|
6, 7, 8 |
\(q_6,\,q_7,\,q_8\) |
change of the slope vector \(\rv_z\) |
global |
Configuration
The slope vectors
Unlike the slopes of the cable nodes, the two slope vectors of this node are not taken along the
beam axis: they are the derivatives of the position with respect to the two cross section
coordinates \(y\) and \(z\), \(\rv_y = \partial \rv / \partial y\) and \(\rv_z = \partial \rv / \partial z\),
so that a point of the cross section at \((y,\,z)\) is at \(\rv + y\,\rv_y + z\,\rv_z\), as
ObjectANCFBeam computes it. The axial direction follows from the positions of the two nodes of the
element. In a beam along the global \(x\)-axis the slope vectors are \([0,\;1,\;0]\tp\) and
\([0,\;0,\;1]\tp\); they span the cross section, and their lengths and angle carry its deformation -
the element is shear and cross section deformable. The default reference coordinates are those
of a beam along the global \(x\)-axis; a model gives the reference coordinates of every node.
Frame and interpretation
All nine coordinates are global (absolute nodal coordinates). The node is used by ObjectANCFBeam.
Rotation
MarkerNodeRigid and the output variables of the rotation take the orthonormal frame of the slopes:
\(\rv_z\) normalized is its \(z\)-axis, \(\rv_y\) orthogonalized against it and normalized its \(y\)-axis, and the
\(x\)-axis is their cross product. The angular velocity \(\tomega\) and the rotation Jacobian
\(\Jm_{rot} = \partial \tomega / \partial \dot \qv\) are the derivatives of this frame, so joints and torques act
consistently with it (#2763).
Action on the equations of motion
The nine coordinates lead to nine ODE2 equations, which the element provides; a force at the node enters the first three.
Mini example
#a cantilever of four ANCF beam elements: position and the slopes r_y, r_z of the cross section
L = 1; nElements = 4; F = -0.1
section = exu.BeamSection()
section.stiffnessMatrix = np.diag([1e5, 1e4, 1e4, 100, 100, 100]) #EA, GA_y, GA_z, GJ, EI_y, EI_z
section.massPerLength = 1
section.inertia = 0.01*np.eye(3)
mGround = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=nGround, coordinate=0))
n0 = mbs.AddNode(NodePointSlope23(referenceCoordinates=[0,0,0, 0,1,0, 0,0,1]))
for i in range(9): #clamped: position and both slopes
mbs.AddObject(ObjectConnectorCoordinate(markerNumbers=[mGround,
mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=n0, coordinate=i))]))
for k in range(nElements):
n1 = mbs.AddNode(NodePointSlope23(referenceCoordinates=[L*(k+1)/nElements,0,0, 0,1,0, 0,0,1]))
mbs.AddObject(ObjectANCFBeam(nodeNumbers=[n0,n1], length=L/nElements, sectionData=section))
n0 = n1
mTip = mbs.AddMarker(MarkerNodeRigid(nodeNumber=n1))
mbs.AddLoad(LoadForceVector(markerNumber=mTip, loadVector=[0,F,0]))
mbs.Assemble()
mbs.SolveStatic()
#converges to F*L^3/(3*EI_z) + F*L/GA_y = -0.3433e-3 as the number of elements grows
exu.sys['testResult'] = mbs.GetNodeOutput(n1, exu.OutputVariableType.Displacement)[1]*1000 #-0.338
Relevant Examples (Ex) and TestModels (TM) with weblink to github: ANCFBeamEigTest.py (TM), ANCFBeamTest.py (TM), ANCFCableBeamDampingTest.py (TM), energiesFlexibleBodiesTest.py (TM), geometricallyExactBeamTest.py (TM), rightAngleFrame.py (TM)