Kinematics¶
A kinematic model defines an allowed type of deformation for an individual body. Solfec includes three kinematic models:
- rigid body
- pseudo–rigid body
- finite–element body
A kinematic model is selected by specifying the kind paramter of the BODY command.
Rigid body¶
The motion of a rigid body reads
where \(\mathbf{\Lambda}\left(t\right)\) is a \(3\times3\) rotation matrix, \(\bar{\mathbf{X}}\) is a selected referential point, and \(\bar{\mathbf{x}}\left(t\right)\) is a spatial point. Hence \(\bar{\mathbf{x}}\left(t\right)=\mathbf{x}\left(\bar{\mathbf{X}},t\right)\) is the motion of the selected point \(\bar{\mathbf{X}}\). The term \(\mathbf{\Lambda}\left(t\right)\left(\mathbf{X}-\bar{\mathbf{X}}\right)\) represents the rotation of \(\mathbf{X}\) about the point \(\bar{\mathbf{X}}\). Representing rotations, \(\mathbf{\Lambda}\) must be orthogonal: \(\mathbf{\Lambda}^{T}\mathbf{\Lambda}=\mathbf{I}\), where \(\mathbf{I}\) is the \(3\times3\) identity matrix. Thus, the rigidity condition follows \(\left\Vert \mathbf{x}-\bar{\mathbf{x}}\right\Vert =\left\Vert \mathbf{X}-\bar{\mathbf{X}}\right\Vert\), that is the length of a line segment before and after rotation is preserved.
The velocity of the spatial point reads
where \(\mathbf{\omega}\) is the spatial angular velocity vector, \(\mathbf{\Omega}\) is the referential angular velocity vector, and \(\dot{\bar{\mathbf{x}}}\) is the velocity of the spatial image of \(\bar{\mathbf{X}}\). W note that
The hat operator \(\hat{\mathbf{y}}\) creates an anti–symmetric \(3\times3\) matrix out of a 3–vector as follows
In vector notation the configuration \(\mathbf{q}\) and the velocity \(\mathbf{u}\) can be expressed as
The configuration \(\mathbf{q}\) has 12 components and the velocity \(\mathbf{u}\) has 6 components.
Pseudo–rigid body¶
The motion of a pseudo–rigid body reads
where \(\mathbf{x}\) is the current image of a referential point \(\mathbf{X}\), \(\mathbf{F}\) is a spatially homogeneous deformation gradient \(\left(\mathbf{F}=\partial\mathbf{x}/\partial\mathbf{X}\right), \bar{\mathbf{X}}\) is a selected referential point and \(\bar{\mathbf{x}}=\bar{\mathbf{x}}\left(t\right)\) is the current image of \(\bar{\mathbf{X}}\). Deformation gradient \(\mathbf{F}\) is an invertible and orientation preserving \(\left(\det\left(\mathbf{F}\right)>0\right)\) \(3\times3\) matrix.
The velocity of the spatial point reads
where \(\dot{\mathbf{F}}\) is the velocity of the deformation gradient and \(\dot{\bar{\mathbf{x}}}\) is the velocity of the spatial image of \(\bar{\mathbf{X}}\).
In vector notation the configuration \(\mathbf{q}\) and the velocity \(\mathbf{u}\) can be expressed as
Both, the configuration \(\mathbf{q}\) and the velocity \(\mathbf{u}\) are 12–component vectors.
Finite–element body¶
The finite–element motion reads
where \(\mathbf{x}\) is the current image of the referential point \(\mathbf{X}\), \(\mathbf{N}\left(\mathbf{X}\right)\) is a matrix of shape functions, and \(\mathbf{q}\left(t\right)\) is a vector of nodal displacements.
The velocity of the spatial point reads
where \(\dot{\mathbf{q}}\) is the vector of nodal \(x,y,z\) velocities.
In vector notation, the configuration \(\mathbf{q}\) and the velocity \(\mathbf{u}\) can be expressed as
Both, the configuration \(\mathbf{q}\) and the velocity \(\mathbf{u}\) have size \(3\times n\), where \(n\) is the number of nodes in a finite–element mesh.
The matrix \(\mathbf{N}\) in (19) and (20) has the following form
where \(N_{i}\) are nodal shape functions, juxtaposed from element shape functions meeting at coincident mesh nodes.
Shape functions¶
Finite–element types available in Solfec are depicted in Fig. 4. Shape functions for those elements are summarised in Table 25.
Isoparametric mapping is used to go back and forth between the natural element coordinates \(\xi_{1}\), \(\xi_{2}\), \(\xi_{3}\), local to individual element domains, and the referential mesh coordinates \(\mathbf{Y}\)
where \(\mathbf{Y}_{i}\) are referential coordinates of mesh nodes. The function \(\mathbf{N}\left(\mathbf{X}\right)\) in (19) and (20) has the following form
Newton iterations are required to solve \(\mathbf{X}=\mathbf{Y}\left(\xi_{1},\xi_{2},\xi_{3}\right)\) and find \(\xi_{1}\), \(\xi_{2}\), \(\xi_{3}\) for a given referential point \(\mathbf{X}\).
Tetrahedron |
\(N_{1}=1-\left(\xi_{1}+\xi_{2}+\xi_{3}\right)\) \(N_{2}=\xi_{1}\) \(N_{3}=\xi_{2}\) \(N_{4}=\xi_{3}\) |
Pyramid |
\(r=
\xi_{1}\xi_{2}\xi_{3}/\left(1-\xi_{3}\right)\text{ if }\xi_{3}\ne1\text{ or }0\text{ otherwise}\) \(N_{1}=0.25\left(\left(1+\xi_{1}\right)\left(1+\xi_{2}\right)-\xi_{3}+r\right)\) \(N_{2}=0.25\left(\left(1-\xi_{1}\right)\left(1+\xi_{2}\right)-\xi_{3}-r\right)\) \(N_{3}=0.25\left(\left(1-\xi_{1}\right)\left(1-\xi_{2}\right)-\xi_{3}+r\right)\) \(N_{4}=0.25\left(\left(1+\xi_{1}\right)\left(1-\xi_{2}\right)-\xi_{3}-r\right)\) \(N_{5}=\xi_{3}\) |
Wedge |
\(N_{1}=0.5\left(1-\xi_{1}-\xi_{2}\right)\left(1-\xi_{3}\right)\) \(N_{2}=0.5\xi_{1}\left(1-\xi_{3}\right)\) \(N_{3}=0.5\xi_{2}\left(1-\xi_{3}\right)\) \(N_{4}=0.5\left(1-\xi_{1}-\xi_{2}\right)\left(1+\xi_{3}\right)\) \(N_{5}=0.5\xi_{1}\left(1+\xi_{3}\right)\) \(N_{6}=0.5\xi_{2}\left(1+\xi_{3}\right)\) |
Hexahedron |
\(N_{1}=0.125\left(1-\xi_{1}\right)\left(1-\xi_{2}\right)\left(1-\xi_{3}\right)\) \(N_{2}=0.125\left(1+\xi_{1}\right)\left(1-\xi_{2}\right)\left(1-\xi_{3}\right)\) \(N_{3}=0.125\left(1+\xi_{1}\right)\left(1+\xi_{2}\right)\left(1-\xi_{3}\right)\) \(N_{4}=0.125\left(1-\xi_{1}\right)\left(1+\xi_{2}\right)\left(1-\xi_{3}\right)\) \(N_{5}=0.125\left(1-\xi_{1}\right)\left(1-\xi_{2}\right)\left(1+\xi_{3}\right)\) \(N_{6}=0.125\left(1+\xi_{1}\right)\left(1-\xi_{2}\right)\left(1+\xi_{3}\right)\) \(N_{7}=0.125\left(1+\xi_{1}\right)\left(1+\xi_{2}\right)\left(1+\xi_{3}\right)\) \(N_{8}=0.125\left(1-\xi_{1}\right)\left(1+\xi_{2}\right)\left(1+\xi_{3}\right)\) |
Implementation¶
Kinematic models are implement in bod.c (rigid, pseudo–rigid) and fem.c (finite–element) files. Configuration and velocity vectors are declared in bod.h as follows:
struct general_body
{
enum {OBS, RIG, PRB, FEM} kind; /* obstacle, rigid, pseudo-rigid, finite element */
/* ... */
double *conf, /* configuration */
*velo; /* velocity */
/* ... */
}