Nonlinear geometry mechanical laws
This section documents the mechanical laws that make no small-strain or small-rotation assumption.
A mechanical law is the constitutive part of a solids4foam case: the solid model assembles and solves the momentum equation, and the mechanical law answers the single question given the current displacement field, what is the stress? Nonlinear geometry laws answer that question in terms of the deformation gradient
F = I + grad(D)^T
J = det(F)
and quantities derived from it, such as the left Cauchy-Green tensor B = F & F.T(), the Green strain G = 0.5*(F.T() & F - I), and the isochoric split isoB = J^(-2/3)*B. Because the reference and deformed configurations are distinct, these laws must also be explicit about which stress measure they return — the Cauchy stress sigma for updated-Lagrangian laws, the second Piola-Kirchhoff stress S for total-Lagrangian ones.
Laws in this directory are registered under the nonLinGeomMechLaw run-time selection table and are intended for the nonlinear geometry solid models, for example nonLinearGeometryUpdatedLagrangian, nonLinearGeometryTotalLagrangianTotalDisplacement and unsNonLinearGeometryTotalLagrangian.
The linear geometry counterparts live in linearGeometryLaws and areregistered under a separate linGeomMechLaw table. A law from one tablecannot be selected by a solid model that uses the other.
Catalogue
For every law in this subsection the run-time selection name registered by addToRunTimeSelectionTable is identical to the C++ class name, so the class name is what you type in constant/mechanicalProperties.
| Runtime type | Purpose |
|---|---|
StVenantKirchhoffElastic | Hookean law in Green strain and 2nd PK stress |
StVenantKirchhoffOrthotropicElastic | Nine-parameter orthotropic St Venant |
neoHookeanElastic | Compressible neo-Hookean, Simo and Hughes Eqn 9.2.6 |
MooneyRivlinElastic | Three-parameter Mooney-Rivlin |
YeohElastic | Three-parameter Yeoh |
OgdenElastic | Third-order Ogden, in principal stretches |
GentElastic | Gent-Flory law for the swelling behaviour of microgels |
isotropicFungElastic | Two-parameter exponential Fung-like model |
GuccioneElastic | Exponential Guccione law for myocardium |
HolzapfelGasserOgdenElastic | Two-fibre-family anisotropic HGO law |
neoHookeanElasticMisesPlastic | Neo-Hookean with J2 plasticity |
viscoNeoHookeanElastic | Neo-Hookean generalised Maxwell viscoelasticity |
electroMechanicalLaw | Wrapper adding an active electro-mechanical stress |
diffusionHyperElastic | Neo-Hookean scaled by a mesh motion diffusivity |
neoHookeanElastic, MooneyRivlinElastic, YeohElastic, OgdenElastic, GentElastic and isotropicFungElastic are isotropic and purely elastic, and differ only in their strain energy function; StVenantKirchhoffElastic is the degenerate case that keeps a linear stress-strain relation while accounting for finite rotation. The remaining anisotropic laws each need directional data in addition to their material constants: StVenantKirchhoffOrthotropicElastic takes a local coordinate system, while GuccioneElastic and HolzapfelGasserOgdenElastic take a fibre direction field. The latter two were added for cardiovascular modelling.
neoHookeanElasticMisesPlastic and viscoNeoHookeanElastic are the two inelastic laws in this subsection: they carry internal state between time steps, so they require the solid model to be run with a sensible time step rather than as a steady-state solve.
electroMechanicalLaw is a wrapper. It owns a nested, run-time selectable passive hyperelastic law and adds an active stress contribution to whatever that law returns, so it can be combined with most of the other entries.
diffusionHyperElastic is not a physical material model; like diffusionElastic in the linear geometry subsection, it exists so that a solid model can be used as a mesh motion solver.
HolzapfelGasserOgdenElastic is written for the mixed pressure-displacementformulation and is intended for coupledPressureDisplacementSolid. It is nota drop-in replacement for the other laws here.
Selecting a law
Mechanical laws are selected in constant/mechanicalProperties. The mechanical entry is a list of sub-dictionaries, one per material, so multi-material cases are expressed by adding further entries:
planeStress no;
mechanical
(
rubber
{
type neoHookeanElastic;
rho rho [1 -3 0 0 0 0 0] 1100;
E E [1 -1 -2 0 0 0 0] 6e6;
nu nu [0 0 0 0 0 0 0] 0.45;
}
);
The name of each sub-dictionary (rubber above) is arbitrary; for multi-material cases it must match the corresponding cellZone.
Most of these laws accept their stiffness as either the E/nu pair or the mu/K pair, in the same way as linearElastic, and then add their own law-specific constants. The individual pages give the exact entries.
Entries every law understands
These are read by the mechanicalLaw base class, so they are valid inside any of the sub-dictionaries above:
| Entry | Default | Description |
|---|---|---|
rho | required | Density, [1 -3 0 0 0 0 0] |
solvePressureEqn | no | Solve a Laplacian for hydrostatic pressure |
pressureSmoothingScaleFactor | 100 | Scale factor for that equation |
regionName | auto | Object registry holding the solid mesh |
rho is looked up on demand rather than at construction, so a missing rho is reported the first time the solid model asks for the density.
The top-level planeStress switch sits outside the mechanical list and is read by the base class through the mechanicalProperties dictionary itself. Several laws here consult it when converting E and nu into the constants they actually use: with planeStress yes the second Lame parameter becomes nu*E/((1 + nu)*(1 - nu)) rather than nu*E/((1 + nu)*(1 - 2*nu)). It changes only that conversion — it does not impose a plane stress constraint on the solution — so a genuine plane stress analysis still has to be set up as a one-cell-thick three-dimensional model with a traction-free front and back.