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
Hyperelastic solid mechanics module for large-deformation problems.

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.