coupledPressureDisplacementSolid
This page documents the block-coupled pressure-displacement solid model. The runtime type is:
coupledPressureDisplacementSolid
The model is aimed at incompressible and nearly incompressible solids, where a displacement-only formulation locks. It solves the displacement increment DD and the hydrostatic pressure increment Dp together in one block system of four unknowns per cell, in an updated-Lagrangian frame with the mesh moved to the current configuration.
This model is only available with foam-extend. It is listed inMake/files.foamextend but not in Make/files.openfoam, so it does not existat all in OpenFOAM.com and OpenFOAM.org builds. Its tutorials callsolids4Foam::caseOnlyRunsWithFoamExtend.
User Guide
What this model solves
coupledPressureDisplacementSolid:
- assembles a
volVector4Fieldunknown,DDDp, holding the three components of the displacement incrementDDplus the pressure incrementDp; - inserts the momentum equation at rows 0-2 and the pressure equation at row 3, with the two coupling blocks — the pressure gradient in the momentum equation, and the displacement divergence in the pressure equation — inserted implicitly;
- uses a Rhie-Chow-style flux
phito avoid pressure-velocity decoupling on a collocated mesh, with an optional consistent variant; - moves the mesh to the current configuration each outer iteration when
nonLinearis enabled; - supports both first-order Euler and backward temporal schemes, and a steady-state mode.
The pressure unknown is what distinguishes this from the other coupled model, coupledUnsLinGeomLinearElasticSolid: that one is displacement-only and linear-elastic, this one is a general finite-strain mixed formulation.
Supported solution algorithms
There is a single block-coupled path. This model does not read solutionAlgorithm.
Model options
| Entry | Default | Description |
|---|---|---|
nonLinear | true | Nonlinear geometry and mesh motion |
K | 0 | Mass-proportional damping coefficient |
consistentRhieChow | false | Consistent Rhie-Chow correction |
composite | false | Composite-material mode |
stdDispGrad | true | Standard displacement-gradient evaluation |
debug | false | Extra per-iteration solver output |
writeConvergenceData | false | Write convergData.dat in the case |
solutionTolerance | inherited | Used here as a relative tolerance |
K has dimensions [0 0 -1 0 0 0 0]. consistentRhieChow allocates extra interpolated face fields when enabled.
As in unsNonLinGeomTotalLagSolid, solutionTolerance is used as a relativetolerance in this model, not an absolute one.
K is unusual in that it is re-read from the dictionary inside updateTotalFields(), so it can be changed while a case is running — useful for ramping damping down as a quasi-static solution settles.
The relevant inherited solidModel entries are:
| Entry | Default | Relevance |
|---|---|---|
nCorrectors | 10000 | Maximum number of outer correctors |
alternativeTolerance | 1e-07 | Secondary convergence tolerance |
materialTolerance | 1e-05 | Mechanical-law convergence tolerance |
infoFrequency | 100 | Frequency for solver progress output |
restart | false | Writes extra fields needed for a consistent restart |
stabilisation | auto-created | Both sub-dictionaries are used |
cellDisplacements | optional | Internal-cell displacement constraints |
The stabilisation sub-models accept a scaleFactorJacobian alongside scaleFactor, so the stabilisation used when forming the block matrix can differ from the one used in the residual. Setting both to zero, as the heartTissueBeam tutorial does, disables stabilisation entirely; the comment there notes that momentum stabilisation contributes to sigmaHyd oscillations.
Required input files
Because the model is incremental and mixed, the fields differ from the other solid models:
DD, the displacement increment, with the boundary conditions;Dp, the pressure increment (MUST_READ);pointDD, usuallycalculated;- any material-specific fields, such as a fibre direction
f0; constant/solidProperties,constant/mechanicalProperties,constant/g.
Note that D and p are outputs, accumulated from DD and Dp.
Recommended dictionary setup
Example for constant/solidProperties:
solidModel coupledPressureDisplacementSolid;
coupledPressureDisplacementSolidCoeffs
{
nCorrectors 2000;
solutionTolerance 1e-7;
alternativeTolerance 1e-06;
materialTolerance 1e-05;
infoFrequency 1;
stabilisation
{
momentum
{
type laplacian;
scaleFactor 0;
scaleFactorJacobian 0;
}
pressure
{
type laplacian;
scaleFactor 0;
scaleFactorJacobian 0;
}
}
nonLinear true;
debug false;
consistentRhieChow false;
composite false;
stdDispGrad true;
restart true;
K K [0 0 -1 0 0 0 0] 150;
writeConvergenceData true;
}
The block system is solved with a DDDp solver in fvSolution, not with separate DD and Dp solvers:
solvers
{
DDDp
{
solver BiCGStab;
preconditioner
{
preconditioner Cholesky;
}
}
}
Boundary conditions
Displacement boundaries are set on DD. The type designed for this model is tractionPressureDisplacement, which applies a traction consistently with the pressure unknown; symmetryPlane and the standard fixed-displacement types also work. Pressure boundaries on Dp are usually zeroGradient.
Field glossary
DDDp: the block unknown; components 0-2 areDD, component 3 isDp.DD,D: displacement increment and accumulated total displacement.Dp,p: pressure increment and accumulated pressure.DU: velocity increment.phi: the Rhie-Chow flux increment.delta,weights: geometric quantities cached across the mesh motion, written withAUTO_WRITEso restarts are consistent.force: the assembled surface force used in the momentum equation.pointDD,pointD,U,sigma: as for the other incremental models.
Developer Notes
Class role
coupledPressureDisplacementSolid inherits directly from solidModel. The key design choices are:
DDis the primary solution variable (DDisRequired()is called), withDpas a coupled second unknown;- the block matrix is a foam-extend
fvBlockMatrix<vector4>, which is why the class is foam-extend-only; - the mesh is moved to the current configuration inside the iteration when
nonLinearis set, so the formulation is updated-Lagrangian in effect while the equations are assembled in total-Lagrangian form on the reference points, kept inrefPoints_.
The implementation is split across a set of .H include files — calcPhi.H, calcTraction.H, calcForce.H, completeMomentumEqAssembly.H, addBlockCoupledBC.H, finalizeMomentumEqn.H, updateAD.H, solidContinuityErrs.H and others — which are #included directly into evolve(). This keeps evolve() readable but means the control flow is spread over a dozen files.
evolve()
Each outer iteration:
- computes the tangential and normal parts of the displacement-increment gradient at faces, and the traction (
calcTraction.H); - assembles the momentum equation as a Laplacian in
DDwith explicit corrections for the tangential gradient, the nonlinear force correction and the old-time force, plus the temporal terms — Euler, backward or steady-state — and the optionalKdamping; - inserts it into the block matrix at row 0, completes the assembly with the normal-derivative term, applies the block-coupled boundary corrections, and inserts the pressure-gradient coupling block at (0, 3);
- moves the mesh to the current configuration if
nonLinear; - computes the Rhie-Chow flux (
calcPhi.H), assembles the pressure equation asSp(rKappa, Dp) - laplacian(rADf, Dp) + div(phi), inserts it at row 3, and inserts the displacement-divergence coupling block at (3, 0); - solves the block system, retrieves
DDandDp, corrects their boundary conditions, updates the flux and reports the continuity errors; - accumulates
D = D.oldTime() + DDandp = p.oldTime() + Dp.
updateTotalFields()
Refreshes impKf_ from the mechanical law, re-reads K from the dictionary, and — when nonLinear is set — updates the accumulated configuration. This is the hook that makes K adjustable mid-run.
Extension points
- the pressure equation and
calcPhi.Hif a different pressure-velocity coupling is wanted; completeMomentumEqAssembly.Hfor changes to the implicit momentum terms;addBlockCoupledBC.Hfor a new block-aware boundary condition.
The composite and consistentRhieChow switches guard code paths that are less exercised than the defaults; treat them as experimental.
Tutorials
Cases that select coupledPressureDisplacementSolid, all foam-extend only:
solids/hyperelasticity/heartTissueBeamsolids/hyperelasticity/ratCarotidsolids/hyperelasticity/idealisedVentriclesolids/hyperelasticity/cylindricalPressureVessel, in itscaseOptions/pressureDisplacementvariantssolids/linearElasticity/plateHole, in itscaseOptions/pressureDisplacementvariant