unsNonLinGeomUpdatedLagSolid
This page documents the unstructured nonlinear updated-Lagrangian incremental-displacement solid model. The runtime type is:
unsNonLinearGeometryUpdatedLagrangian
The model assumes finite strains and rotations and solves for the increment of displacement DD. The mesh is moved at the end of each time step, so the governing equations are written in the updated configuration. It is the updated-Lagrangian 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
unsNonLinGeomUpdatedLagSolid:
- solves the momentum equation in updated-Lagrangian form;
- uses the displacement increment
DDas the primary unknown, and recoversDasD.oldTime() + DD; - carries the kinematics as surface fields —
relFf,relFinvf,relJf,Ff,Jf— as well as their cell-centred counterparts; - uses the surface stress
sigmafin the momentum equation; - maintains its own density field
rho, updated asrho.oldTime()/relJ; - moves the mesh at the end of each time step;
- solves with a segregated implicit algorithm only.
The model is appropriate when deformation is large enough that linear geometry is not valid and mesh motion between time steps is part of the formulation.
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 nonLinGeomUpdatedLagSolid if you need those.
Model options
unsNonLinGeomUpdatedLagSolid adds no options of its own. Unlike its total-Lagrangian sibling it has no nonLinear switch and no automatic linear fallback, and solutionTolerance keeps its usual absolute meaning. The relevant entries in unsNonLinearGeometryUpdatedLagrangianCoeffs are the inherited solidModel ones:
| Entry | Default | Relevance |
|---|---|---|
nCorrectors | 10000 | Maximum number of outer correctors |
solutionTolerance | 1e-06 | Primary convergence tolerance |
alternativeTolerance | 1e-07 | Secondary convergence tolerance |
materialTolerance | 1e-05 | Mechanical-law convergence tolerance |
relaxationMethod | fixed | Under-relaxation method (fixed, aitken) |
infoFrequency | 100 | Frequency for solver progress output |
writeResidualField | false | Writes a residual field during output |
residualFile | false | Writes residual.dat in the case directory |
cellDisplacements | optional | Internal-cell displacement constraints |
dampingCoeff is read by the base class but is not applied by this model’smomentum equation.
Recommended dictionary setup
Minimal example for constant/solidProperties:
solidModel unsNonLinearGeometryUpdatedLagrangian;
unsNonLinearGeometryUpdatedLagrangianCoeffs
{
nCorrectors 10000;
solutionTolerance 1e-06;
alternativeTolerance 1e-07;
materialTolerance 1e-05;
infoFrequency 100;
}
The momentum equation is assembled with the name laplacian(DDD,DD), so fvSchemes must provide a laplacian(DDD,DD) entry, and fvSolution must provide a solver for DD.
Required fields and boundary conditions
Because this model is incremental, the boundary conditions are specified on DD, not on D:
DDin the time directory;solidPropertiesinconstant;ginconstant;- a
mechanicalPropertiesconfiguration for the chosen material law.
The base class enforces this through DDisRequired(). Traction boundaries are handled through tractionBoundarySnGrad(), which uses the deformed normal relJ*relFinv.T() & n obtained from Nanson's relation between the updated and deformed configurations.
Field glossary
DD: displacement increment at cell centres; the primary unknown.D: total displacement, recovered asD.oldTime() + DD.pointDD,pointD: incremental and total displacement at mesh points.grad(DD),grad(D): cell-centre gradients.grad(DD)f: face gradient ofDD, computed with the face-Gauss approach.relF,relFinv,relJ: relative deformation gradient, its inverse and relative Jacobian, mapping the updated to the deformed configuration.F,J: total deformation gradient and Jacobian, accumulated asrelF & F.oldTime()andrelJ*J.oldTime().relFf,relFinvf,relJf,Ff,Jf: the same quantities at faces; these are the ones the momentum equation uses.rho: density in the current configuration, updated asrho.oldTime()/relJ.sigma,sigmaf: cell-centre and face stress.U: velocity field, computed asddt(D).
Developer Notes
Class role
unsNonLinGeomUpdatedLagSolid is the updated-Lagrangian, face-gradient member of the family. The key design choices are:
DDis the primary solution variable (solutionD()returnsDD(), andincremental()returnstrue);nonLinGeom()returnsUPDATED_LAGRANGIAN;movingMesh()returnstrue, so the base class expects the mesh to be moved once per time step;- the momentum equation is written on the updated mesh, with
relJf*relFinvf.T() & Sfmapping the updated face areas to the deformed configuration; - stress is delegated to
mechanicalModel.
The class name in the header's Class tag is nonLinGeomUpdatedLagSolid, which is a historical leftover; the actual class is unsNonLinGeomUpdatedLagSolid.
Construction
The constructor:
- calls the base
solidModelconstructor andDDisRequired(); - creates
sigmaf_,gradDDf_, the relative and total kinematic fields, and its ownrho_, allREAD_IF_PRESENTso that a restart picks them up; - takes
impK_,impKf_from the mechanical law and storesrImpK_; - on restart, recomputes
grad(DD),grad(DD)f,relFf,relFinvf,Ff,relJfandJf, stores the old times ofFfandJf, and callsmechanical().setRestart().
evolve()
A single outer loop:
- store
DDfor under-relaxation and residual calculation; -
assemble the momentum equation
d2dt2(rho, DD) + fvc::d2dt2(rho, D.oldTime()) == laplacian(impKf, DD) - fvc::laplacian(impKf, DD) + fvc::div((relJf*relFinvf.T() & Sf) & sigmaf) + rho*gi.e. an implicit Laplacian with a deferred correction that recovers the updated-Lagrangian divergence of stress at convergence;
- relax the linear system, apply
solidModel::setCellDisps(), and solve; - under-relax
DD, then updatepointDD,grad(DD),grad(DD)f,relFf,relFinvf,Ff,relJfandJf; - update
sigmaffrom the mechanical law.
The loop exits through the base-class converged() helper, or when iCorr reaches nCorrectors. After the loop, the cell-centred relF, relFinv, F, relJ, J and sigma are updated once, then D, grad(D), pointD and U.
evolve() always returns true; there is no divergence fallback in this model.
updateTotalFields()
Called once per time step by the base class after evolve(). It:
- updates the density as
rho = rho.oldTime()/relJ; - moves the mesh by
pointDDthroughmoveMesh(), so that the next time step starts in the new updated configuration; - calls
solidModel::updateTotalFields().
This is the step that makes the formulation updated- rather than total-Lagrangian, and it is why movingMesh() must return true.
Traction boundary treatment
tractionBoundarySnGrad() applies the traction and pressure on the deformed normal nCurrent = relJ*relFinv.T() & n, where n is the normal in the updated configuration, and subtracts the impK*gradDD term that the implicit Laplacian already accounts for.
Extension points
evolve()for a different outer-iteration strategy;updateTotalFields()if the mesh-motion or density update changes;tractionBoundarySnGrad()if the deferred-correction split changes.
As with the other uns models, the face fields are the primary state: any new algorithm must keep sigmaf_, gradDDf_, relFf_, relFinvf_, Ff_, relJf_ and Jf_ consistent, not just their cell-centred counterparts.
Tutorials
Cases that select unsNonLinearGeometryUpdatedLagrangian:
solids/hyperelasticity/cantileverBeam
It is offered as a commented alternative in several further finite-strain cases, which are the natural places to try it:
solids/hyperelasticity/cylindricalPressureVesselsolids/hyperelasticity/longWallsolids/elastoplasticity/cooksMembranesolids/elastoplasticity/pipeCrushsolids/elastoplasticity/cylinderCrush