Governing equations
MILET solves creeping (zero-Reynolds-number) thermo-mechanical flow: a mixed Stokes problem for velocity and pressure with visco-elasto-plastic (VEP) rheology, coupled to an energy equation (Heat transport) and a marker-in-cell material description (Markers). This page covers the Stokes system as implemented in src/physics/Stokes.jl, the buoyancy term from src/physics/Gravity.jl / src/time_stepping/PicardLoop.jl; the compressible (TALA) form is on the Compressibility page.
Strong form
In the default Boussinesq formulation (formulation = "boussinesq"):
with gy = +9.81 in the [gravity] TOML section.
Weak form
build_stokes_forms (src/physics/Stokes.jl) assembles the bilinear and linear forms. Multiplying momentum by a test function
The system is discretized with inf-sup stable Q2–Q1 Taylor–Hood elements (fe_order_v = 2, fe_order_p = 1 in the [fe] section; see Discretization). CellField projected from the markers (project_markers_to_cells! in src/particles/Projection.jl). assemble_stokes wraps the forms into a Gridap AffineFEOperator.
Free-slip penalty
Walls flagged free_slip (bc_left, bc_right, bc_surface, bc_deep, plus bc_front/bc_back in 3D) contribute the penalty term
which weakly enforces no-penetration (build_free_slip_bcs sets the penalty scale per wall as
where eta_min) and free_slip_penalty (default 1000) is portable across viscosity regimes and resolutions.
Traction (Neumann) walls
Walls flagged traction impose build_traction_bcs composes the global-frame traction vector from the per-wall config keys t_traction_<wall>_n (normal, positive outward) and t_traction_<wall>_t (tangential), where <wall> is one of left | right | surface | deep. Walls flagged prescribed use strong Dirichlet values instead (src/boundary_conditions/Velocity.jl).
VEP elastic memory source
For Maxwell visco-elasticity the previous-step deviatoric stress enters the RHS as
where SymTensorValue field built from the marker-averaged stress components by build_sigma_old_cellfield. picard_stokes! only constructs this term when any cell has shear_modulus
After each Stokes solve, update_marker_stresses! applies the marker-level stress update (Gerya 2010, eq. 12.13)
followed by an explicit Jaumann co-rotation increment _update_marker_stresses_3d! carries all six deviatoric components and the full three-component spin. recover_invariants! computes cell-mean
Buoyancy: Boussinesq perturbation form
buoyancy_cellfield (src/physics/Gravity.jl) builds the body-force CellField used in
where src/time_stepping/PicardLoop.jl).
Options:
| Config key | Default | Effect |
|---|---|---|
body_force_full | false | true → use full |
buoyancy_from_T | false | true → build T_ref_density |
gravity.model | "vertical_const" | "vertical_const" (constant gx,gy,gz) or "radial" (g_mag) — gravity_fn in src/physics/Gravity.jl |
Compressible flow (TALA)
formulation = "tala" replaces the Boussinesq equations with the truncated anelastic liquid approximation of King et al. (2010). The equations, the reference state and their verification are on the Compressibility page.
Nonlinear (Picard) iteration
The viscosity depends on strain rate, picard_stokes! (src/time_stepping/PicardLoop.jl) iterates:
project markers → cell fields (
, , , ), assemble and solve the linear Stokes system with frozen
, recover
, test
.
Controls in [fe]: n_picard (default 3), picard_tol (default 1e-3), nonlinear_method = "picard" | "newton" and newton_damping (
Related pages
Rheology — how
, , are computed Heat transport — the coupled energy equation
Two-phase flow — the three-field
extension Free surface — sticky-air and ALE treatments
Parameter file — full key reference