class felupe.SolidBody(umat, field, statevars=None)[source]#

Bases: object

A SolidBody with methods for the assembly of sparse vectors/matrices.

class felupe.SolidBodyNearlyIncompressible(umat, field, bulk, state=None, statevars=None)[source]#

Bases: object

A (nearly) incompressible SolidBody with methods for the assembly of sparse vectors/matrices for a material with optional state variables.

  • umat (A constitutive material formulation with methods for the evaluation) – of the gradient P = umat.gradient(F) as well as the hessian A = umat.hessian(F) of the strain energy function w.r.t. the deformation gradient.

  • field (FieldContainer) – The field (and its underlying region) on which the solid body will be created on.

  • bulk (float) – The bulk modulus of the volumetric material behaviour (\(U(J)=K(J-1)^2/2\)).

  • state (StateNearlyIncompressible) – A valid initial state for a (nearly) incompressible solid.


The volumetric material behaviour is hard-coded and is defined by the strain energy function.

\[U(J) = \frac{K}{2} (J - 1)^2\]

Hu-Washizu Three-Field-Variation Principle

The Three-Field-Variation \((\boldsymbol{u},p,J)\) leads to a linearized equation system with nine sub block-matrices. Due to the fact that the equation system is derived by a potential, the matrix is symmetric and hence, only six independent sub-matrices have to be evaluated. Furthermore, by the application of the mean dilatation technique, two of the remaining six sub-matrices are identified to be zero. That means four sub-matrices are left to be evaluated, where two non-zero sub-matrices are scalar-valued entries.

\[\begin{split}\begin{bmatrix} \boldsymbol{A} & \boldsymbol{b} & \boldsymbol{0} \\ \boldsymbol{b}^T & 0 & -c \\ \boldsymbol{0}^T & -c & d \end{bmatrix} \cdot \begin{bmatrix} \boldsymbol{x} \\ y \\ z \end{bmatrix} = \begin{bmatrix} \boldsymbol{u} \\ v \\ w \end{bmatrix}\end{split}\]

An alternative representation of the equation system, only dependent on the primary unknowns \(\boldsymbol{u}\) is carried out. To do so, the second line is multiplied by \(\frac{d}{c}\).

\[\begin{split}\begin{bmatrix} \boldsymbol{A} & \boldsymbol{b} & \boldsymbol{0} \\ \frac{d}{c}~\boldsymbol{b}^T & 0 & -c \\ \boldsymbol{0}^T & -c & d \end{bmatrix} \cdot \begin{bmatrix} \boldsymbol{x} \\ y \\ z \end{bmatrix} = \begin{bmatrix} \boldsymbol{u} \\ \frac{d}{c}~v \\ -w \end{bmatrix}\end{split}\]

Now, equations two and three are summed up. This eliminates one of the three unknowns.

\[\begin{split}\begin{bmatrix} \boldsymbol{A} & \boldsymbol{b} \\ \frac{d}{c}~\boldsymbol{b}^T & -c \end{bmatrix} \cdot \begin{bmatrix} \boldsymbol{x} \\ y \end{bmatrix} = \begin{bmatrix} \boldsymbol{u} \\ \frac{d}{c}~v + w \end{bmatrix}\end{split}\]

Next, the second equation is left-multiplied by \(\frac{1}{c}~\boldsymbol{b}\) and both equations are summed up again.

\[\begin{bmatrix} \boldsymbol{A} + \frac{d}{c^2}~\boldsymbol{b} \otimes \boldsymbol{b} \end{bmatrix} \cdot \begin{bmatrix} \boldsymbol{x} \end{bmatrix} = \begin{bmatrix} \boldsymbol{u} + \frac{d}{c^2}~\boldsymbol{b}~v + \frac{1}{c}~\boldsymbol{b}~w \end{bmatrix}\]

The secondary unknowns are evaluated after solving the primary unknowns.

\[ \begin{align}\begin{aligned}z &= \frac{1}{c}~\boldsymbol{b}^T \boldsymbol{x} - \frac{1}{c}~v\\y &= \frac{d}{c}~z - \frac{1}{c}~w\end{aligned}\end{align} \]

For the mean-dilatation technique, the variables, equations as well as sub-matrices are evaluated. Note that the pairs of indices \((ai)\) and \((bk)\) have to be treated as 1d-vectors.

\[ \begin{align}\begin{aligned}A_{aibk} &= \int_V \frac{\partial h_a}{\partial X_J} \left( \frac{\partial^2 \overset{\wedge}{\psi}}{\partial F_{iJ} \partial F_{kL}} + p \frac{\partial^2 J}{\partial F_{iJ} \partial F_{kL}} \right) \frac{\partial h_b}{\partial X_L} \ dV\\b_{ai} &= \int_V \frac{\partial h_a}{\partial X_J} \frac{\partial J}{\partial F_{iJ}} \ dV\\c &= \int_V \ dV = V\\d &= \int_V \frac{\partial^2 U(\bar{J})}{\partial \bar{J} \partial \bar{J}} \ dV = \bar{U}'' V\end{aligned}\end{align} \]


\[ \begin{align}\begin{aligned}x_{ai} &= \delta {u}_{ai}\\y &= \delta p\\z &= \delta \bar{J}\end{aligned}\end{align} \]

as well as

\[ \begin{align}\begin{aligned}u_{ai} (= -r_{ai}) &= -\int_V \frac{\partial h_a}{\partial X_J} \left( \frac{\partial \overset{\wedge}{\psi}}{\partial F_{iJ}} + p \frac{\partial J}{\partial F_{iJ}} \right) \ dV\\v &= -\int_V (J - \bar{J}) \ dV = \bar{J} V - v\\w &= -\int_V (\bar{U}' - p) \ dV = p V - \bar{U}' V\end{aligned}\end{align} \]
class felupe.StateNearlyIncompressible(field)[source]#

Bases: object

A State with internal fields for (nearly) incompressible solid bodies.


Integrated shape-function gradient w.r.t. the deformed coordinates x.


Cell volumes of the deformed configuration.

class felupe.SolidBodyGravity(field, gravity=None, density=1.0)[source]#

Bases: object

A SolidBody with methods for the assembly of sparse vectors/matrices.

class felupe.SolidBodyPressure(field, pressure=None)[source]#

Bases: object

A hydrostatic pressure boundary on a SolidBody.

class felupe.PointLoad(field, points, values=None, apply_on=0, axisymmetric=False)[source]#

Bases: object

A point load with methods for the assembly of sparse vectors/matrices.

class felupe.Step(items, ramp=None, boundaries=None)[source]#

Bases: object

A Step with multiple substeps, subsequently depending on the solution of the previous substep.


Generate all substeps.

class felupe.Job(steps, callback=<function Job.<lambda>>, filename=None)[source]#

Bases: object

A job with a list of steps.

evaluate(filename=None, mesh=None, point_data=None, cell_data=None, point_data_default=True, cell_data_default=True, verbose=True, parallel=False, **kwargs)[source]#
class felupe.CharacteristicCurve(steps, boundary, items=None, callback=<function CharacteristicCurve.<lambda>>)[source]#

Bases: Job

plot(x=None, y=None, xaxis=0, yaxis=0, xlabel=None, ylabel=None, xscale=1, yscale=1, gradient=False, swapaxes=False, fig=None, ax=None, items=None, **kwargs)[source]#
class felupe.MultiPointConstraint(field, points, centerpoint, skip=(False, False, False), multiplier=1000.0)[source]#
class felupe.MultiPointContact(field, points, centerpoint, skip=(False, False, False), multiplier=1000000.0)[source]#