GentElastic
This page documents the Gent-Flory elastic law for microgel behaviour. The runtime type is:
GentElastic
User Guide
What it computes
The law updates the deformation gradient and evaluates the following stress at cell centres or faces:
J = det(F)
B = symm(F & F.T())
C = symm(F.T() & F)
omega = Vs/Na
Nv = N/omega
sigma = kb*temperature*(Nv/J)
* ((ilim/(ilim - tr(B) + 3))*C - I)
Here Na is fixed at 6.022141e23 and dimensionless, while kb is fixed at 1.38064852e-23 with dimensions [1 2 -2 -1 0 0 0]. The nonlinear stress does not use E, nu, mu or K; those quantities are used by updateF() when the solid model enforces a linear response and by impK().
The volSymmTensorField and surfaceSymmTensorField correct() overloads are implemented. The inherited pointSymmTensorField overload aborts with notImplemented. On OpenFOAM.com and OpenFOAM.org, the inherited CompactListList overload also exists and aborts with notImplemented; that interface is excluded from foam-extend by #ifndef FOAMEXTEND.
Model options
| Entry | Required | Description |
|---|---|---|
E | yes | Young's modulus, [1 -1 -2 0 0 0 0] |
nu | yes | Poisson's ratio, dimensionless |
temperature | yes | Temperature, [0 0 0 1 0 0 0] |
ilim | yes | Limiting invariant parameter, dimensionless |
Vs | yes | Volume divided by Na to form omega, [0 3 0 0 0 0 0] |
N | yes | Crosslink parameter divided by omega, dimensionless |
rho | yes | Density, [1 -3 0 0 0 0 0] |
solvePressureEqn | no | Base switch; default no |
pressureSmoothingScaleFactor | no | Base scale factor; default 100 |
regionName | no | Base mesh region; otherwise detected automatically |
The top-level planeStress switch is also required. It changes the K used for linear enforcement and impK(), but it does not change the nonlinear stress expression. Although the base constructor reads solvePressureEqn and pressureSmoothingScaleFactor, this law never calls updateSigmaHyd(), so neither option changes its computed stress.
No range or positivity checks are applied to the material entries. In particular, the denominator ilim - tr(B) + 3 is not guarded against zero.
Recommended dictionary setup
Illustrative setup for a water-swollen microgel:
planeStress no;
mechanical
(
waterSwollenMicrogel
{
type GentElastic;
rho rho [1 -3 0 0 0 0 0] 1000;
E E [1 -1 -2 0 0 0 0] 3e4;
nu nu [0 0 0 0 0 0 0] 0.49;
temperature temperature [0 0 0 1 0 0 0] 298;
ilim ilim [0 0 0 0 0 0 0] 100;
Vs Vs [0 3 0 0 0 0 0] 1.8e-5;
N N [0 0 0 0 0 0 0] 1e-4;
// Optional base-class entries
// regionName region0;
// solvePressureEqn no;
// pressureSmoothingScaleFactor 100;
}
);
Field glossary
F_,Ff_: total deformation gradients at cell centres and faces. They are read if present and written for restart.relF_,relFf_: relative deformation gradients maintained byupdateF().mu_<material>,K_<material>: cell fields populated from the uniform derived moduli when the volume correction is used.muf_<material>,Kf_<material>: corresponding face fields populated by the surface correction.impK: implicit stiffness field returned to the solid model, with value(4/3)*mu + Kunless animpKfield is read from the current time.sigma: stress field supplied by the solid model and overwritten bycorrect().
Developer Notes
Class role
GentElastic derives directly from mechanicalLaw and is registered in the nonLinGeomMechLaw runtime selection table. It stores ten constant dimensionedScalar members: E_, nu_, mu_, temperature_, ilim_, K_, Na_, kb_, omega_ and N_.
The class itself has no fork guards. The inherited quadrature-point interface is guarded by #ifndef FOAMEXTEND. GentElastic.C appears in both Make/files.openfoam and Make/files.foamextend.
Construction
The base constructor first reads or inserts solvePressureEqn and pressureSmoothingScaleFactor, then reads regionName or detects solid or region0. Failure to find a base mesh region is fatal.
The derived constructor then performs these operations in order:
- Reads
Eandnu, and derivesmu = E/(2*(1 + nu)). - Reads
temperatureandilim. -
Reads the top-level
planeStressswitch and derivesK:K = nu*E/((1 + nu)*(1 - nu)) + (2/3)*mu // plane stress K = nu*E/((1 + nu)*(1 - 2*nu)) + (2/3)*mu // otherwise - Sets the fixed values of
Naandkb. - Reads
Vsand calculatesomega = Vs/Na. - Reads
Nand replaces it internally byN/omega.
Missing or dimensionally inconsistent required entries cause dictionary or dimension errors. The constructor contains no explicit material validation and emits no law-specific fatal error or warning. If solvePressureEqn is enabled, the base constructor only prints an informational message.
Key methods
impK()returns a cell field equal to(4/3)*mu + K. It is the diffusivity of the solid model's implicit Laplacian term and affects the outer-iteration convergence rate rather than the converged answer.- Both implemented
correct()methods callupdateF(sigma, mu, K)first. If it returnstrue, the linearised stress supplied byupdateF()is kept. Otherwise they evaluate the Gent-Flory expression above usingForFf.updateF()aborts for non-incremental updated-Lagrangian use or an unknown nonlinear-geometry type, and warns when linearity is enforced for stability. materialTangent()is not overridden. The inherited implementation aborts withnotImplemented, so solid models that request a material tangent cannot use this law.setRestart()sets bothFandFftoAUTO_WRITE, constructing either field if it has not already been used.
Extension points
A related law can copy this class, replace both correct() expressions, and update the dimensionedScalar inputs and impK() linearisation. It must use a new TypeName, register in the nonLinGeomMechLaw table, and be added to both build lists when it supports all forks. Implement the point, quadrature-point and material-tangent interfaces if the target solid models require them.
The source is at GentElastic.C.
Tutorials
No tutorial currently selects the GentElastic runtime type.