Kinematics¶
A kinematic model defines an allowed type of deformation for an individual body. Solfec-1.0 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-1.0 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)\) |
Pyramid |
\(r=
\xi_{1}\xi_{2}\xi_{3}/\left(1-\xi_{3}\right)\text{ if }\xi_{3}\ne1\text{ or }0\text{ otherwise}\) |
Wedge |
\(N_{1}=0.5\left(1-\xi_{1}-\xi_{2}\right)\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)\) |
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 */
/* ... */
}