OgdenElastic
This page documents the three-term Ogden hyperelastic mechanical law. The runtime type is:
OgdenElastic
User Guide
What it computes
The cell-centred correct forms the right Cauchy-Green tensor and its principal stretches. With c_i denoting an eigenvalue of C, the implemented relation is:
C = F^T F
J = det(F)
lambda_i = max(sqrt(c_i), VSMALL)
p_i = mu1*lambda_i^alpha1
+ mu2*lambda_i^alpha2
+ mu3*lambda_i^alpha3
s = rotation of diag(p_1, p_2, p_3) to the spatial basis
sigmaHyd = (K/2)*(J^2 - 1)
sigma = (1/J)*[dev(s - (mu1 + mu2 + mu3)*I)
+ sigmaHyd*I + symm(F sigma0 F^T)]
The subtraction of (mu1 + mu2 + mu3)*I occurs inside dev, so it does not alter the deviatoric result. updateSigmaHyd() either assigns the expression above directly or obtains a smoothed field by solving the pressure equation. If the solid model enforces material linearity, updateF() returns a Hookean stress based on mu1 + mu2 + mu3 and K before the Ogden calculation.
The law implements correct(volSymmTensorField&). Its correct(surfaceSymmTensorField&) overload aborts with notImplemented. The inherited point-tensor overload also aborts. On OpenFOAM.com and OpenFOAM.org, the inherited CompactListList quadrature-point overload is present and aborts; that interface is not compiled on foam-extend.
Model options
| Entry | Required | Description |
|---|---|---|
mu1 | yes | First modulus parameter, [1 -1 -2 0 0 0 0] |
mu2 | yes | Second modulus parameter, [1 -1 -2 0 0 0 0] |
mu3 | yes | Third modulus parameter, [1 -1 -2 0 0 0 0] |
alpha1 | yes | First exponent, [0 0 0 0 0 0 0] |
alpha2 | yes | Second exponent, [0 0 0 0 0 0 0] |
alpha3 | yes | Third exponent, [0 0 0 0 0 0 0] |
K | yes | Bulk modulus, [1 -1 -2 0 0 0 0] |
rho | yes | Density, [1 -3 0 0 0 0 0] |
solvePressureEqn | no | Solve for pressure; default no |
pressureSmoothingScaleFactor | no | Pressure scale; default 100 |
regionName | no | Base mesh region; otherwise detected |
All seven law-specific entries are read as dimensionedScalar values. The constructor does not apply explicit range or sign checks. rho is read lazily by the base-class density accessor. The remaining base-class entries are described on the mechanical-law page.
Initial stress is not a dictionary entry for this law. The base class instead reads a sigma0 volume field if it is present and otherwise creates a zero field.
Recommended dictionary setup
The following rubber parameters are used by the commented Ogden alternative in the cylinderCrush tutorial:
mechanical
(
rubber
{
type OgdenElastic;
rho rho [1 -3 0 0 0 0 0] 1000;
K K [1 -1 -2 0 0 0 0] 1.410e9;
mu1 mu1 [1 -1 -2 0 0 0 0] 0.746e6;
mu2 mu2 [1 -1 -2 0 0 0 0] -0.306e6;
mu3 mu3 [1 -1 -2 0 0 0 0] 6.609e-5;
alpha1 alpha1 [0 0 0 0 0 0 0] 1.748;
alpha2 alpha2 [0 0 0 0 0 0 0] -1.656;
alpha3 alpha3 [0 0 0 0 0 0 0] 7.671;
// Optional
// solvePressureEqn no;
// pressureSmoothingScaleFactor 100;
// regionName region0;
}
);
Field glossary
mu_<name>,K_<name>: uniform cell fields set tomu1 + mu2 + mu3andKfor use by the base class.muf_<name>,Kf_<name>: corresponding interpolated face fields.F_,relF_: total and relative deformation gradients maintained byupdateF();F_is written for incremental total-Lagrangian restarts.sigmaHyd,grad(sigmaHyd): hydrostatic stress quantity and its gradient, created when the stress is first corrected.sigma0: initial stress field, read if present and otherwise initialised to zero. It is pushed forward assymm(F sigma0 F^T)/J.impK: implicit stiffness field returned as(4/3)*mu + K.eigenVal(C),eigenVec(C),s: non-writing temporary fields created during each cell-centred stress correction.
Developer Notes
Class role
OgdenElastic derives directly from mechanicalLaw and is registered in the nonLinGeomMechLaw runtime selection table. It stores seven uniform dimensionedScalar members: mu1_, mu2_, mu3_, alpha1_, alpha2_, alpha3_ and K_.
The #ifdef FOAMEXTEND branches in correct() select the appropriate mutable internal- and boundary-field APIs. The quadrature-point base interface is guarded by #ifndef FOAMEXTEND. The law is listed in both Make/files.openfoam and Make/files.foamextend.
Construction
The base constructor first adds solvePressureEqn with default false and pressureSmoothingScaleFactor with default 100.0 when they are absent. It then uses regionName, or detects solid and then region0. Failure to find a base mesh region produces a fatal error.
The derived constructor reads mu1, mu2, mu3, alpha1, alpha2, alpha3 and K, in that order, and prints their values. A missing or malformed required entry produces the dictionary reader's fatal error; the class has no additional parameter validation. It sets the inherited cell shear modulus to mu1 + mu2 + mu3, sets the cell bulk modulus to K, and interpolates both to the faces. Construction itself emits no law-specific warnings.
When sigma0 is later created on a distinct single-material mesh, the base class warns that mapping from the base mesh may be incorrect. updateF() also aborts for a non-incremental updated-Lagrangian solid and warns once per time step when material linearity is enforced.
Key methods
impK(): returns(4/3)*(mu1 + mu2 + mu3) + K. This is the diffusivity of the solid model's implicit Laplacian term and affects outer-iteration convergence rate rather than the converged answer.correct(volSymmTensorField&): updatesF, computes the eigenpairs ofF^T F, builds and rotates the three principal stress values, updates the hydrostatic quantity, and adds the pushed-forward initial stress.correct(surfaceSymmTensorField&): aborts withnotImplemented.materialTangent(): is not overridden. The inherited implementation aborts withnotImplemented, so this law does not provide a 6x6 Newton tangent.
Extension points
A related principal-stretch law can copy this class, retain registration in the nonlinear-geometry selection table, and replace the principal-stress and hydrostatic expressions in the cell-centred correct(). Implement the face, point or quadrature-point correct() overloads for solid models that use those interfaces, and override materialTangent() for Newton methods that request a consistent tangent. Add the new source file to each supported fork's build list.
The source is at OgdenElastic.C.
Tutorials
solids/hyperelasticity/cylinderCrushcontains an equivalent Ogden setup, but it is commented out; the active configuration usesMooneyRivlinElastic.