thermalLinGeomSolid
This page documents the coupled thermal linear-geometry solid model. The runtime type is:
thermalLinearGeometry
The model assumes small strains and small rotations, and solves the energy equation for temperature T and the linear momentum equation for total displacement D inside one outer loop, so that the temperature-displacement coupling is converged within each time step.
The stress is computed by the run-time selectable mechanical law.
User Guide
What this model solves
thermalLinGeomSolid:
- solves the transient heat equation
rhoC*ddt(T) == laplacian(k, T) + (sigma && grad(U)), i.e. including the mechanical work term; - solves the linear-geometry momentum equation for
D; - alternates the two equations inside a single outer loop, and requires both to converge before the time step ends;
- takes
Candkfrom athermalModel, configured inconstant/thermalProperties; - exposes the interface that thermal fluid-solid interaction uses to set patch temperature and heat flux.
The momentum equation does not include a thermal-expansion term by itself.To get thermal stresses, select a mechanical law that consumes the temperaturefield, such as thermoMechanicalLaw. Without one, the temperature solutionhas no effect on the displacement.
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.
Model options
| Entry | Default | Description |
|---|---|---|
absoluteTemperatureTolerance | 1e-06 | Convergence threshold on T |
absoluteTemperatureTolerance is an absolute change in degrees: once the temperature stops moving by more than this between outer iterations, the thermal loop is considered converged.
The relevant inherited solidModel entries are:
| Entry | Default | Relevance |
|---|---|---|
nCorrectors | 10000 | Maximum number of outer correctors |
solutionTolerance | 1e-06 | Primary convergence tolerance, T and D |
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 |
stabilisation | auto-created if absent | momentum sub-dictionary is used |
cellDisplacements | optional | Internal-cell displacement constraints |
Convergence requires the temperature and the displacement residuals to be satisfied, and at least two outer iterations are always performed.
Required input files
TandDin the time directory;constant/solidProperties;constant/thermalProperties, providing thethermalsub-dictionary;constant/mechanicalProperties;constant/g.
T is MUST_READ, so a case that omits it will fail at construction.
Example constant/thermalProperties:
thermal
{
type constant;
C C [0 2 -2 -1 0 0 0] 434;
k k [1 1 -3 -1 0 0 0] 250;
}
Recommended dictionary setup
Minimal example for constant/solidProperties:
solidModel thermalLinearGeometry;
thermalLinearGeometryCoeffs
{
nCorrectors 10000;
solutionTolerance 1e-06;
alternativeTolerance 1e-07;
materialTolerance 1e-05;
absoluteTemperatureTolerance 1e-06;
infoFrequency 100;
}
fvSchemes must provide laplacian(k,T) and laplacian(DD,D) entries, and fvSolution must provide solvers for T and D.
Boundary conditions
Displacement boundaries use the standard solids4foam patch types. Temperature boundaries use the usual OpenFOAM scalar patch types, plus:
thermalRobin, which carries both a temperature and a heat flux and is the type required on a thermal fluid-solid interface. CallingsetTemperatureAndHeatFlux()on any other patch type is a fatal error.thermalConvection, for a convective heat-transfer boundary.
Field glossary
T: temperature; primary thermal unknown, written each output time.grad(T): temperature gradient, used to report the heat flux.heatFlux:-k*grad(T), constructed and written bywriteFields().D,DD: total and incremental displacement.pointD,pointDD: displacement at mesh points.grad(D),grad(DD): displacement gradients.sigma: symmetric stress tensor.U: velocity field, computed asddt(D).rhoC: product of density and specific heat capacity.
Each write also prints the maximum and minimum temperature and the maximum magnitude of the heat flux.
Developer Notes
Class role
thermalLinGeomSolid inherits directly from solidModel and adds a thermalModel member. The key design choices are:
Dis the primary solution variable (solutionD()returnsD());nonLinGeom()returnsLINEAR_GEOMETRY;- the momentum equation is the same deferred-correction Laplacian form used by
linGeomTotalDispSolid, with the momentum stabilisation term applied explicitly; - the heat equation and the momentum equation share one outer loop, which is what distinguishes this model from weakThermalLinGeomSolid.
Construction
The constructor calls the base solidModel constructor and DisRequired(), constructs the thermalModel from the mesh, builds rhoC_ as thermal.C()*mechanical().rho() and k_ from thermal.k(), reads T (MUST_READ) and creates grad(T), reads absoluteTemperatureTolerance, and takes impK_, impKf_ and rImpK_ from the mechanical law. It then forces creation of T.oldTime().
evolve()
Each outer iteration:
- stores
Tfor under-relaxation, assembles and solves the heat equation including thesigma && grad(U)work term, relaxesT, and updatesgrad(T); -
stores
D, updates the momentum stabilisation, assemblesrho*d2dt2(D) == laplacian(impKf, D) - fvc::laplacian(impKf, D) + fvc::div(sigma) + rho*g + impK*stabilisationthen relaxes and solves it, and under-relaxes
D; - updates
DD,U,grad(D),grad(DD)andsigma; - refreshes
impKf_from the mechanical law every tenth iteration, to help convergence when the material stiffness changes.impK_andrImpK_are deliberately not refreshed, because they are used by the traction boundary conditions.
The loop exits through the private converged() overload, which checks both T and D, or when iCorr reaches nCorrectors. Afterwards pointD, DD and pointDD are updated once.
Thermal fluid-solid interaction interface
setTemperatureAndHeatFlux() and setEqInterHeatTransferCoeff() write into a thermalRobin patch field, and faceZoneTemperature(), faceZoneHeatFlux() and faceZoneHeatTransferCoeff() read the corresponding quantities back out on a global face zone. These are the hooks used by the thermal fluid-solid interfaces.
Extension points
evolve()for a different coupling strategy between the two equations;- the private
converged()overload if a different convergence criterion is needed; writeFields()for extra derived thermal output.
Tutorials
Cases that select thermalLinearGeometry:
solids/thermoelasticity/hotCylindersolids/thermoelasticity/hotSpheresolids/thermoelasticity/slabCoolingthermoFluidSolidInteraction/hotTJunction