Rodin/Solid/Integrators/FollowerPressure.h file

Follower (deformation-dependent) pressure load with consistent tangent, for total-Lagrangian hyperelastic formulations.

A pressure $ p $ acting on the CURRENT configuration of a boundary surface contributes the external virtual work

\[ \delta W_{\text{ext}} = -p \int_{\Gamma(t)} \mathbf{n} \cdot \mathbf{w} \, da = -p \int_{\hat{K}} (\mathbf{x}_{,\xi} \times \mathbf{x}_{,\eta}) \cdot \mathbf{w} \, d\xi \, d\eta , \]

where $ \mathbf{x}(\xi,\eta) = \mathbf{X}(\xi,\eta) + \mathbf{d} $ is the deformed surface and the cross product carries BOTH the outward normal direction and the current area element (Nanson). In residual convention (R = internal - external), the load term and its EXACT linearization are

\[ R_p(\mathbf{w}) = +p \int_{\hat{K}} (\mathbf{x}_{,\xi} \times \mathbf{x}_{,\eta}) \cdot \mathbf{w} , \qquad K_p(\delta\mathbf{d}, \mathbf{w}) = +p \int_{\hat{K}} (\delta\mathbf{d}_{,\xi} \times \mathbf{x}_{,\eta} + \mathbf{x}_{,\xi} \times \delta\mathbf{d}_{,\eta}) \cdot \mathbf{w} , \]

(cf. Bonet & Wood, Nonlinear Continuum Mechanics for Finite Element Analysis, ch. 8). Only SURFACE-parametric derivatives appear: the operators are assembled face-locally, with no volume trace required. The load-stiffness $ K_p $ is generally NONSYMMETRIC; use a direct solver or a nonsymmetric Krylov method.

At $ \mathbf{d} = 0 $ the residual reduces EXACTLY to the dead load $ +p \int_{\Gamma_0} \mathbf{N} \cdot \mathbf{w} \, dA $ (the classic BoundaryIntegral(p * Dot(w, N)) term), which both fixes the sign convention (positive p pushes AGAINST the outward normal of the solid, as a pressure must; for a lumen pressure on an inner wall, whose outward normal points INTO the lumen, this pushes the wall outward) and gives a built-in verification limit.

Both integrators support the standard .over(attribute) restriction. Supported spaces: vector P1 (the local basis is evaluated analytically with the framework's $ \text{local} = \text{vertex} \cdot d_v + \text{component} $ layout). Supported dimensions: 3D (triangular faces) and 2D (segment faces, where the "cross product" is the +90-degree rotation of the tangent).

Usage (static prestress with FULL Newton convergence):

Real p = 0.0; // ramped externally
Solid::FollowerPressureForce   load(p, w, dState);    // residual, "+"
Solid::FollowerPressureTangent loadK(p, d, w, dState); // tangent,  "+"
problem = tangent + internal
        + loadK + load // note: both PLUS, matching internal/tangent
        + DirichletBC(...);

The pressure is captured BY REFERENCE (the integrators are copied into the Problem, and all copies read the same variable), so ramping the original variable between solves updates the load with no reassembly bookkeeping.

Namespaces

namespace Rodin
The Rodin library for finite element methods and shape optimization.
namespace Rodin::Solid
Constitutive laws, kinematics, and solid-mechanics integration.

Classes

template<class StateFES, class State>
struct Rodin::Solid::Internal::FaceKinematics
template<class TestFunctionType, class DisplacementType>
class Rodin::Solid::FollowerPressureForce
Linear-form integrator: follower pressure residual $ +p \int (\mathbf{x}_{,\xi} \times \mathbf{x}_{,\eta}) \cdot \mathbf{w} $ . Add it with "+" to the Problem (it already carries the residual-convention sign of a pressure pushing along the outward normal).
template<class TrialFunctionType, class TestFunctionType, class DisplacementType>
class Rodin::Solid::FollowerPressureTangent
Bilinear-form integrator: the EXACT load stiffness of the follower pressure, $ +p \int (\delta\mathbf{d}_{,\xi} \times \mathbf{x}_{,\eta} + \mathbf{x}_{,\xi} \times \delta\mathbf{d}_{,\eta}) \cdot \mathbf{w} $ . Add it with "+" alongside the material tangent. NONSYMMETRIC.

Functions

auto p1FaceBasis(size_t a, const Math::SpatialVector<Real>& rc, size_t faceDim) -> Real
auto p1FaceBasisGrad(size_t a, size_t j, size_t faceDim) -> Real
void surfaceCross(Math::SpatialVector<Real>& out, const Math::SpatialVector<Real>& t1, const Math::SpatialVector<Real>& t2, size_t sdim)

Function documentation

Real p1FaceBasis(size_t a, const Math::SpatialVector<Real>& rc, size_t faceDim)

Parameters
a Basis or lattice index in the reference element.
rc Coordinates in the reference element.
faceDim Dimension of the reference face.
Returns Value of the selected linear reference-face basis function.

Scalar P1 basis on the reference segment/triangle.

Real p1FaceBasisGrad(size_t a, size_t j, size_t faceDim)

Parameters
a Basis or lattice index in the reference element.
j Index of the second coordinate.
faceDim Dimension of the reference face.
Returns Reference-coordinate derivative of the selected linear face basis function.

Constant reference gradient component d(phi_a)/d(xi_j).

void surfaceCross(Math::SpatialVector<Real>& out, const Math::SpatialVector<Real>& t1, const Math::SpatialVector<Real>& t2, size_t sdim)

Parameters
out Storage for the computed result.
t1 First tangent vector.
t2 Second tangent vector.
sdim Dimension of the embedding space.

"Cross product" carrying normal direction and area element: 3D: t1 x t2; 2D: +90-degree rotation of t1 (t2 ignored).