coupledUnsLinGeomLinearElasticSolid
This page documents the block-coupled linear-elastic solid model. The runtime type is:
coupledUnsLinearGeometryLinearElastic
The model assumes small strains and small rotations and solves the momentum equation for the total displacement D with a block-coupled methodology: all three displacement components are solved simultaneously in one linear system, rather than segregated component by component. Because linear elasticity with linear boundary conditions gives a linear problem, no outer iteration is required at all — one linear solve per time step is the answer.
The method is described in:
P. Cardiff, Z. Tukovic, H. Jasak and A. Ivankovic (2016), A block-coupled finite volume methodology for linear elasticity and unstructured meshes, Computers and Structures, 175, 100-122, 10.1016/j.compstruc.2016.07.004.
This model is only available with foam-extend. On OpenFOAM.com andOpenFOAM.org builds the class compiles, but evolve() calls notImplementedand the run aborts. It relies on foam-extend’s BlockLduMatrix machinery andon src/blockCoupledSolids4FoamTools.
User Guide
What this model solves
coupledUnsLinGeomLinearElasticSolid:
- assembles the linear-geometry momentum equation directly as a block matrix, with the Laplacian, Laplacian-transpose and Laplacian-trace terms of
div(sigma)all treated implicitly; - solves for total displacement
Din a single block solve per time step; - uses the
unsface-Gauss gradient, so the discretisation matches unsLinGeomSolid; - reads
muandlambdaonce at construction from the mechanical law.
The advantage over the segregated models is convergence: the inter-component coupling that segregated solvers defer to the outer iterations is here inside the matrix, which matters most on high-aspect-ratio and bending-dominated problems. The cost is memory and a larger, denser linear system.
Restrictions
The constructor enforces two hard restrictions:
- exactly one material — multi-material cases abort;
- the mechanical law must be
linearElastic— any other law aborts.
The linear definition of stress is hard-coded into the block assembly, so these are not incidental limits. Equation under-relaxation is also disabled: if fvSolution relaxes DEqn, the run aborts.
Supported solution algorithms
There is a single block-coupled path and no outer loop. This model does not read solutionAlgorithm, nCorrectors or the convergence tolerances.
Model options
coupledUnsLinGeomLinearElasticSolid reads no entries of its own, and the inherited iteration controls do not apply. The coefficients sub-dictionary must still be present, but it may be empty:
solidModel coupledUnsLinearGeometryLinearElastic;
coupledUnsLinearGeometryLinearElasticCoeffs
{}
Linear solver setup
The block system is solved with a blockD solver selected from fvSolution, not with an ordinary D solver:
solvers
{
blockD
{
solver EigenSparseLU;
}
}
The block solvers available come from src/blockCoupledSolids4FoamTools/BlockLduSolvers.
Boundary conditions
Standard solids4foam patch types do not work here: the boundary conditions are inserted directly into the block matrix, so they need block-aware implementations. Use the block* patch types from src/blockCoupledSolids4FoamTools/blockFvPatchVectorFields:
| Patch type | Purpose |
|---|---|
blockFixedDisplacement | Prescribed displacement |
blockFixedDisplacementZeroShear | Normal displacement fixed, zero shear |
blockFixedGradient | Prescribed displacement gradient |
blockSolidTraction | Prescribed traction and pressure |
blockSolidVelocity | Prescribed velocity |
blockGlobalSolid | Global patch, used for coupling |
A symmetry plane is handled by blockFixedDisplacementZeroShear; there is no block-aware symmetry type.
Required input files
Din the time directory, withblock*boundary conditions;constant/solidProperties;constant/mechanicalProperties, selecting a singlelinearElasticlaw;constant/g;- a
blockDentry infvSolution.
Field glossary
D,DD: total and incremental displacement.pointD,pointDD: displacement at mesh points.grad(D),grad(DD): displacement gradients.sigma: symmetric stress tensor, evaluated once per time step from the mechanical law.U: velocity field, computed asddt(D).solutionVec: the block solution vector, written withAUTO_WRITE. It has one entry per variable of the extended mesh, which includes boundary unknowns as well as cells, so it is longer than the cell count.
Developer Notes
Class role
coupledUnsLinGeomLinearElasticSolid inherits directly from solidModel, and holds a solidPolyMesh (extendedMesh_) alongside the ordinary fvMesh. The extended mesh carries the larger addressing needed by the block system, in which boundary faces as well as cells are unknowns.
Dis the primary solution variable;nonLinGeom()returnsLINEAR_GEOMETRY;muf_andlambdaf_are surface fields, set once at construction, which is why onlylinearElasticis permitted.
Everything inside evolve() is guarded by #ifdef FOAMEXTEND.
Construction
The constructor writes a banner citing the reference paper, calls DisRequired(), then validates the mechanical model: one law, and that law linearElastic. It casts the law and copies mu() and lambda() into muf_ and lambdaf_. On foam-extend it also builds extendedMesh_ and the solutionVec_ field, sized from extendedMesh_.nVariables().
evolve()
There is no loop. Each time step:
- clear the extended mesh's cached global coefficients;
- build an empty
BlockLduMatrix<vector>and zero its diagonal and off-diagonals; - assemble three separate block matrices through
BlockFvm::laplacian,BlockFvm::laplacianTransposeandBlockFvm::laplacianTrace, and add their diagonal, off-diagonal and processor-coupling contributions together by hand — aBlockFvMatrixclass would tidy this up; - insert the boundary-condition equations with
extendedMesh_.insertBoundaryConditions(); - add the transient and gravity terms via
extendedMesh_.addFvMatrix()withrho*d2dt2(D) - rho*g; - abort if
DEqnunder-relaxation is requested; - solve with the
blockDsolver and copy the result back intoDthroughextendedMesh_.copySolutionVector(); - under-relax
D, interpolate topointD, and evaluategrad(D)— twice, because fixed-displacement boundaries need the patch internal field to setsnGradon the gradient's boundary; - update
DD,grad(DD),sigma,pointDDandU.
The non-orthogonal correction of the Laplacian is treated implicitly, which is one of the advantages the block approach has over the segregated models.
Extension points
- the three
BlockFvmterms if a different stress form is wanted; note that removing thelinearElasticrestriction means these must become functions of the mechanical law rather than of fixedmuandlambdafields; solidPolyMesh::insertBoundaryConditions()for a new block patch type.
There is commented-out code in evolve() that would enforce zero normal displacement on symmetry patches at the point level; the note there suggests a blockSymmetry boundary condition as the proper fix.
Tutorials
No tutorial selects coupledUnsLinearGeometryLinearElastic by default, since it needs foam-extend. Three cases ship a ready-made unsCoupled variant — constant/solidProperties.unsCoupled, 0/D.unsCoupled and system/fvSolution.unsCoupled:
solids/linearElasticity/cantilever2dsolids/linearElasticity/narrowTmembersolids/linearElasticity/ellipticPlate