Skip to content

Grain-size evolution

MILET evolves a grain size d on every marker, balancing Arrhenius normal grain growth against paleowattmeter grain-size reduction (Austin & Evans 2007, Geology 35:343), and feeds it back into the viscosity through a grain-size-sensitive diffusion-creep law. The kinetics live in src/materials/GrainSize.jl, the rheological coupling in src/materials/Rheology.jl and src/materials/FlowLaws.jl, the driver wiring in update_marker_grain_size! (src/time_stepping/Driver.jl); the design spec is doc/design/grain_size.md.

Evolution equation

Per marker, at fixed (T,P,Ψdisl):

dddt=G0pdp1exp(Eg+PVgRT)growthλcγd2Ψdislreduction

Growth is the normal grain-growth law dpd0p=G0texp((Eg+PVg)/RT) differentiated (Karato 1989; Evans et al. 2001). Typical olivine values: p=3, G01.5×105mp/s, Eg3.5×105J/mol. The rate coefficient K(T,P)=G0exp((Eg+PVg)/RT) is grain_growth_coeff.

Reduction is the Austin–Evans wattmeter: the fraction λ0.1 of the dislocation-creep work rate Ψdisl=σIIε˙disl (W/m³) is stored as new grain-boundary surface energy (γ1 J/m², geometric constant c3π). Diffusion creep does no work on the dislocation structure and therefore does not reduce d.

Steady state (the wattmeter)

Setting growth = reduction gives the closed-form fixed point (grain_size_steady_state):

dss=(cγKpλΨdisl)1/(p+1),K=G0exp(Eg+PVgRT),

reproducing the dssΨ1/(p+1) scaling of Austin & Evans (2007). This is enforced as a unit test (test/smoke/test_grainsize.jl), approached from both above and below.

Exact-sub-flow integrator

The ODE is stiff far from equilibrium (reduction d2, growth d1p), so update_grain_size uses operator splitting in which both sub-flows integrate exactly in closed form:

growth:d(dp)dt=Kd(dp+KΔt)1/preduction:d˙=ad2,a=λΨdislcγdd1+adΔt

Consequences: with Ψdisl=0 the analytic growth law is reproduced in a single substep, and the reduction flow is unconditionally stable. Substeps are adaptive:

  • net-rate limiter: Δtsub0.1d/|d˙net| — vanishes at the fixed point, where an equilibrium early-exit (|d˙net|tleft<103d) makes steady-state markers nearly free;

  • split-error control: each sub-flow capped at 5 % of d per substep (a 50 % cap left a 10 % offset from the analytic dss; 5 % gives < 1 %);

  • bounds: floor d_min = 1e-6 m (1 µm), cap d_max = 0.1 m, at most max_substeps = 400 substeps.

The update is pure per-marker arithmetic (no Gridap calls) and is threaded over markers on the Cartesian fast path.

Mechanism partition (who pays for the wattmeter)

The composite viscous rheology assumes both creep mechanisms act in parallel at common stress, so compliances add (see Rheology):

1ηvisc=1ηdisl+1ηdiff(d)

viscous_mechanism_partition (src/materials/Rheology.jl) recovers the per-mechanism rates under stress continuity:

σII=2ηviscε˙II,ε˙mech=σII2ηmech,Ψdisl=σIIε˙disl.

Two implementation points matter:

  • The partition uses the unclamped constitutive viscosity — the eta_min/eta_max clamps are numerical guards for the FE solve; applying them here would break the identity ε˙diff+ε˙disl=ε˙II and inflate the work rate wherever a clamp engages.

  • With no calibrated diffusion law (diff_A = 0) the entire viscous strain rate is attributed to the dislocation/legacy branch — the conservative choice for grain-size reduction.

The diffusion-creep viscosity is the Hirth & Kohlstedt (2003) form (diffusion_viscosity, src/materials/FlowLaws.jl):

ε˙II=AσIIdmexp(E+PVRT)ηdiff=106(d106)m2Aexp(E+PVRT)  [Pas]

with the laboratory convention A in MPa⁻¹ µmm s⁻¹ (d in metres at the call site, converted to µm inside; the 106 factor converts MPa to Pa). Catalog entries (DIFF_CREEP_LAWS) usable via diff_prof: "Dry_Olivine_diff-Hirth_Kohlstedt_2003" (A=1.5×109, m=3, E=375 kJ/mol, V=6×106 m³/mol) and "Wet_Olivine_diff-Hirth_Kohlstedt_2003" (A=109, m=3, E=335 kJ/mol, V=4×106 m³/mol).

Driver wiring and feedback loop

Per step, after marker advection and gated on any(rk -> rk.grain_G0 > 0), update_marker_grain_size! runs per marker: 1.

T

from mk.T; lithostatic pressure P=ρrefgy (the same convention as the projection and phase changes); ε˙II from the host cell (state.eii_c).

  1. viscous_mechanism_partition at the marker's own grain size → Ψdisl.

  2. update_grain_size advances mk.grain_size[m].

The loop closes through the projection: project_markers_to_cells! (src/particles/Projection.jl) passes each marker's grain size to compute_VEP_viscosity, where diff_A > 0 activates the 1/ηdiff(d) compliance — so grain-size reduction in shear zones lowers viscosity, localizes strain, raises Ψdisl, and reduces d further until the wattmeter balance is reached.

Marker state: mk.grain_size::Vector{Float32} is initialized per rock from grain_init (src/initialization/Markers.jl), advects with the marker, is inherited on reseeding, checkpointed, and written to the marker VTK output as grain_size_mm.

A legacy path is kept for backward compatibility: the global [rheology] key grain_exponent (m: 0 = off, 2 = Coble, 3 = Nabarro–Herring) multiplies the eta0-path creep viscosity by (d/dref)m with dref=103 m. With diff_A = 0 and grain_G0 = 0 behavior is identical to the pre-grain-size code (regression-tested).

Configuration (per [[rock]])

Defaults from src/io/TOMLLoader.jl; see also Parameter file and doc/Parameter-file-example.md.

KeyDefaultUnitsMeaning
diff_prof""named catalog diffusion-creep law (overrides the four below)
diff_A0.0MPa⁻¹ µmm s⁻¹diffusion-creep prefactor; 0 = mechanism off
diff_m3.0grain-size exponent m
diff_E375e3J/molactivation energy
diff_V6e-6m³/molactivation volume
grain_G00.0mp/sgrowth prefactor G0; 0 = grain size frozen
grain_p3.0growth exponent p
grain_Eg350e3J/molgrowth activation energy Eg
grain_Vg8e-6m³/molgrowth activation volume Vg
grain_lambda0.1work partition λ
grain_gamma1.0J/m²grain-boundary surface energy γ
grain_cgeometric constant c
grain_init1e-3minitial marker grain size

Tests

test/smoke/test_grainsize.jl checks: (1) the growth-only analytic law over a large Δt; (2) convergence to the closed-form dss from both directions; (3) the composite-rheology identity 1/η=1/ηdiff+1/ηdisl and the diff_A = 0 regression; (4) mechanism-partition stress consistency (ε˙diff+ε˙dislε˙II).