unsNonLinGeomTotalLagSolid
This page documents the unstructured nonlinear total-Lagrangian total-displacement solid model. The runtime type is:
unsNonLinearGeometryTotalLagrangian
The model assumes finite strains and rotations and solves for the total displacement field D in the total-Lagrangian frame, so the mesh is not moved. It is the nonlinear-geometry counterpart of unsLinGeomSolid: the "uns" prefix indicates that the face tangential gradient is calculated with a face-Gauss approach rather than from the cell-centred gradient.
The stress is computed by the run-time selectable mechanical law.
User Guide
What this model solves
unsNonLinGeomTotalLagSolid:
- solves the momentum equation in total-Lagrangian form;
- uses total displacement
Das the primary unknown; - carries the kinematics as surface fields —
Ff,Finvf,Jf— as well as the cell-centredF,Finv,J; - uses the surface stress
sigmafin the momentum equation; - solves with a segregated implicit algorithm only;
- can fall back to a linear-geometry equation when the outer iterations diverge (see below).
The model is appropriate when deformation is large enough that linear geometry is not valid, and the mesh is unstructured enough to warrant the face-Gauss gradient.
Supported solution algorithms
This model implements a single, segregated implicit algorithm. It does not read solutionAlgorithm, and there is no PETSc SNES or explicit path. Use nonLinGeomTotalLagTotalDispSolid if you need those.
Model options
| Entry | Default | Description |
|---|---|---|
nonLinear | true | Allow the automatic linear fallback |
debug | false | Extra per-iteration solver output |
solutionTolerance | inherited | Used here as a relative tolerance |
solutionTolerance has a different meaning in this model. It is used as arelative tolerance: the convergence target is the largest relative momentumresidual seen so far, multiplied by solutionTolerance, floored at the baseclass solutionTolerance. A value that works for the other solid models mayconverge sooner or later here.
The relevant inherited solidModel entries are:
| Entry | Default | Relevance |
|---|---|---|
nCorrectors | 10000 | Maximum number of outer correctors |
materialTolerance | 1e-05 | Mechanical-law convergence tolerance |
dampingCoeff | 0 | Adds dampingCoeff*rho*ddt(D) to the equation |
relaxationMethod | fixed | Under-relaxation method (fixed, aitken) |
infoFrequency | 100 | Frequency for solver progress output |
cellDisplacements | optional | Internal-cell displacement constraints |
The linear fallback
Nonlinear geometry can drive the outer iterations into a state where the deformation gradient becomes unphysical. After each update the model calls checkEnforceLinear(Jf_); if the relative Jacobian indicates divergence, the enforceLinear flag is set and the nonlinear part of the divergence-of-stress term is replaced by its linear-geometry equivalent for the remainder of the time step. The traction boundary condition switches to its linear form at the same time.
When this happens, evolve() returns false, which signals the calling solver to reduce the time step and try again. If nonLinear is set to false, the check is skipped and the model runs without the fallback.
Recommended dictionary setup
Minimal example for constant/solidProperties:
solidModel unsNonLinearGeometryTotalLagrangian;
unsNonLinearGeometryTotalLagrangianCoeffs
{
nonLinear yes;
nCorrectors 10000;
solutionTolerance 1e-06;
materialTolerance 1e-05;
infoFrequency 100;
}
The momentum equation is assembled with the name laplacian(DD,D), so fvSchemes must provide a laplacian(DD,D) entry, and fvSolution must provide a solver for D.
Required fields and boundary conditions
At minimum, the model expects:
Din the time directory;solidPropertiesinconstant;ginconstant;- a
mechanicalPropertiesconfiguration for the chosen material law.
Traction boundaries are handled through tractionBoundarySnGrad(), which uses the deformed-configuration normal J*Finv.T() & n from Nanson's relation, or the reference normal n when the linear fallback is active.
Field glossary
D,DD: total and incremental displacement at cell centres.pointD,pointDD: total and incremental displacement at mesh points.grad(D),grad(DD): cell-centre gradients.grad(D)f: face gradient ofD, computed with the face-Gauss approach.F,Finv,J: total deformation gradient, its inverse and Jacobian at cell centres.Ff,Finvf,Jf: the same quantities at faces; these are the ones the momentum equation uses.sigma,sigmaf: cell-centre and face stress.U: velocity field, computed asddt(D).
The cell-centred F, Finv, J and sigma are updated once at the end of evolve(), for post-processing and for the mechanical law's cell-centred interface; the loop itself runs entirely on the face fields.
Developer Notes
Class role
unsNonLinGeomTotalLagSolid is the total-Lagrangian, face-gradient member of the family. The key design choices are:
Dis the primary solution variable (solutionD()returnsD());nonLinGeom()returnsTOTAL_LAGRANGIAN, so the mesh is never moved;- the momentum equation is written on the reference mesh, with
Jf*Finvf.T() & Sfmapping the reference face areas to the deformed configuration; - stress is delegated to
mechanicalModel.
The class name in the header's Class tag is nonLinGeomTotalLagSolid, which is a historical leftover; the actual class is unsNonLinGeomTotalLagSolid.
Construction
The constructor:
- calls the base
solidModelconstructor andDisRequired(); - creates
sigmaf_,gradDf_and the kinematic fields, all of which areREAD_IF_PRESENTso that a restart picks them up; - takes
impK_,impKf_from the mechanical law and storesrImpK_; - reads
nonLinear,debugand the relativesolutionTolerance; - on restart, recomputes
grad(D),grad(D)f,Ff,FinvfandJffromDand callsmechanical().setRestart().
evolve()
A single outer loop:
- reset
enforceLinearand storeDfor under-relaxation; -
assemble the momentum equation
rho*d2dt2(D) == laplacian(impKf, D) - fvc::laplacian(impKf, D) + fvc::div((Jf*Finvf.T() & Sf) & sigmaf) + rho*gi.e. an implicit Laplacian with a deferred correction that recovers the total-Lagrangian divergence of stress at convergence;
- add damping if
dampingCoeffis non-zero; - if
enforceLinearis set, add the difference between the nonlinear and linear divergence terms, which cancels the nonlinear contribution; - relax the linear system, apply
solidModel::setCellDisps(), and solve; - under-relax
D, then updatepointD,grad(D),grad(D)f,grad(DD),Ff,FinvfandJf; - call
checkEnforceLinear(Jf_)unless the fallback is already active ornonLinearisfalse; - update
sigmafand evaluate the relative residual.
Convergence is checked against maxRes*relativeTol_, floored at the base-class solutionTolerance; the first iteration is always followed by a second. After the loop, U, F, Finv, J, sigma, DD and pointDD are updated once.
evolve() returns false if the linear fallback was triggered, and true otherwise.
Traction boundary treatment
tractionBoundarySnGrad() has two branches. In the nonlinear branch the traction and pressure are applied on the deformed normal:
((traction - nCurrent*pressure) - (nCurrent & sigma) + (n & (impK*gradD)))*rImpK
with nCurrent = J*Finv.T() & n. In the enforceLinear branch, nCurrent is replaced by the reference normal n. In both cases the impK*gradD term removes the part of the traction that the implicit Laplacian already accounts for.
Extension points
evolve()for a different outer-iteration or fallback strategy;tractionBoundarySnGrad()if the deferred-correction split changes.
As with unsLinGeomSolid, the face fields are the primary state: any new algorithm must keep sigmaf_, gradDf_, Ff_, Finvf_ and Jf_ consistent, not just their cell-centred counterparts.
Tutorials
No tutorial selects unsNonLinearGeometryTotalLagrangian by default. The finite-strain cases that exercise the sibling models — solids/hyperelasticity/cantileverBeam, solids/hyperelasticity/cylindricalPressureVessel and solids/elastoplasticity/cooksMembrane — are the natural places to try it, by changing the solidModel entry in constant/solidProperties.