NodePointSlope12

A 3D point/slope vector node for thin ANCF (absolute nodal coordinate formulation) plate 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 in-plane coordinates of the plate.

Interface

Parameters

The parameters of the item; in a dictionary, its type is ‘PointSlope12’:

name

type

size

default

description

name

String

‘’

node’s unique name

referenceCoordinates

Vector9D

9

[0.,0.,0.,1.,0.,0.,0.,1.,0.]

reference coordinates (x-pos,y-pos,z-pos; x-slopeX, y-slopeX, z-slopeX; x-slopeY, y-slopeY, z-slopeY) 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

VNodePointSlope12

parameters for visualization of item

Visualization parameters

The parameters of VNodePointSlope12, 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\)

ODE2

displacement of the node position \(\rv\)

global

3, 4, 5

\(q_3,\,q_4,\,q_5\)

ODE2

change of the slope vector \(\rv_x^\prime\)

global

6, 7, 8

\(q_6,\,q_7,\,q_8\)

ODE2

change of the slope vector \(\rv_y^\prime\)

global

Configuration

\[ \rv = \rv\cRef + [q_0,\,q_1,\,q_2]\tp, \quad \rv_x^\prime = \rv_{x,\mathrm{ref}}^\prime + [q_3,\,q_4,\,q_5]\tp, \quad \rv_y^\prime = \rv_{y,\mathrm{ref}}^\prime + [q_6,\,q_7,\,q_8]\tp . \]

The slope vectors

The two slope vectors are the derivatives of the position of the mid-surface of a thin plate with respect to its two in-plane coordinates, \(\rv_x^\prime = \partial \rv / \partial x\) and \(\rv_y^\prime = \partial \rv / \partial y\). In a flat plate in the global \(x\)-\(y\) plane they are \([1,\;0,\;0]\tp\) and \([0,\;1,\;0]\tp\). They span the tangent plane of the mid-surface, and their lengths and angle carry its in-plane strains. The default reference coordinates are those of a flat plate in the global \(x\)-\(y\) plane; 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 ObjectANCFThinPlate, whose element scales the slopes by slopesScalingX and slopesScalingY.

Rotation

MarkerNodeRigid and the output variables of the rotation take an orthonormal frame of the slopes: \(\rv_x\) normalized is its \(x\)-axis, \(\rv_y\) orthogonalized against it and normalized its \(y\)-axis, and the \(z\)-axis - the normal of the surface - is their cross product. The angular velocity \(\tomega\) and the rotation Jacobian are not the derivatives of this frame but the least-squares fit \(\tomega = \left(-\tilde\rv_x\tilde\rv_x - \tilde\rv_y\tilde\rv_y\right)^{-1}\left(\tilde\rv_x\dot\rv_x + \tilde\rv_y\dot\rv_y\right)\), symmetric in the two slopes; the two agree for slopes that keep their lengths and their right angle (#2219). The derivative of \(\Jm_{rot}\tp\vv\) with respect to the coordinates is not implemented: a connector whose Jacobian needs it, e.g. a RigidBodySpringDamper at the node with an implicit solver, raises an error; a torque and a joint do not need it.

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 square plate clamped at one edge, from ANCF thin plate elements with position and slopes r_x, r_y
from exudyn.shells import ShellMesh
plate = ShellMesh(vertices=[[0,0,0],[1,0,0],[1,1,0],[0,1,0]], numberOfElementsX=2, numberOfElementsY=2,
                  youngsModulus=2e9, poissonsRatio=0, density=1000, thickness=0.01)
plate.CreateANCFThinPlateElements(mbs) #adds a NodePointSlope12 per mesh point
for node in plate.boundaryNodeNumbers['left']:
    mNode = mbs.AddMarker(MarkerNodeRigid(nodeNumber=node))
    mbs.CreateGenericJoint(itemNumbers=[oGround, mNode]) #clamped: position and orientation
for element in plate.elementNumbers:
    mbs.AddLoad(LoadMassProportional(markerNumber=mbs.AddMarker(MarkerBodyMass(bodyNumber=element)),
                                     loadVector=[0,0,-9.81]))

mbs.Assemble()
mbs.SolveStatic()

#a corner of the free edge; compare q*L^4/(8*D) = 0.0736 of a cantilever strip, D = E*h^3/12
corner = plate.vertexNodeNumbers[1]
exu.sys['testResult'] = mbs.GetNodeOutput(corner, exu.OutputVariableType.Displacement)[2]