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=G0pdp−1exp(−Eg+PVgRT)⏟growth−λcγd2Ψdisl⏟reduction

Growth is the normal grain-growth law dp−d0p=G0texp⁡(−(Eg+PVg)/RT) differentiated (Karato 1989; Evans et al. 2001). Typical olivine values: p=3, G0≈1.5×10−5mp/s, Eg≈3.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 c≈3π). 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 ∝d1−p), so update_grain_size uses operator splitting in which both sub-flows integrate exactly in closed form:

growth:d(dp)dt=K⇒d←(dp+KΔt)1/preduction:d˙=−ad2,a=λΨdislcγ⇒d←d1+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: Δtsub≤0.1d/|d˙net| — vanishes at the fixed point, where an equilibrium early-exit (|d˙net|tleft<10−3d) 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σIId−mexp(−E+PVRT)⇒ηdiff=106(d⋅106)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×10−6 m³/mol) and "Wet_Olivine_diff-Hirth_Kohlstedt_2003" (A=109, m=3, E=335 kJ/mol, V=4×10−6 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=10−3 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.0—grain-size exponent m
diff_E375e3J/molactivation energy
diff_V6e-6m³/molactivation volume
grain_G00.0mp/sgrowth prefactor G0; 0 = grain size frozen
grain_p3.0—growth exponent p
grain_Eg350e3J/molgrowth activation energy Eg
grain_Vg8e-6m³/molgrowth activation volume Vg
grain_lambda0.1—work partition λ
grain_gamma1.0J/m²grain-boundary surface energy γ
grain_c3π—geometric 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).