Skip to content

Softening & healing

Strain localization in MILET is driven by a per-marker accumulated plastic strain εp (mk.strain) that weakens both the plastic and (optionally) the viscous branch of the rheology, anneals away on a temperature-dependent healing timescale, and accumulates only where the material actually yields. The constitutive side lives in src/materials/Rheology.jl (_compute_viscosity_core), the strain bookkeeping in update_marker_strain! (src/particles/Projection.jl); the design spec is doc/design/softening_healing.md.

Plastic strain weakening (Drucker–Prager ramps)

The yield stress is Drucker–Prager with linear strain weakening:

τyield=min(C(εp)+sinφ(εp)P,σy,max)

Cohesion C and friction sinφ interpolate linearly from (C0,sinφ0) to (Cf,sinφf) as εp runs over [εinit,εweak]:

C(εp)=C0+f(CfC0),sinφ(εp)=sinφ0+f(sinφfsinφ0),f=clamp(εpεinitεweakεinit,0,1).

The rate-dependent realization is ηplast=τyield/(2ε˙II), so 2ηplastε˙II=τyield exactly when plasticity is engaged. The composite with the viscous branch is stress-limiting, not harmonic: ηeff=min(ηvisc,ηplast), i.e. 1/ηeff=max(1/ηvisc,1/ηplast). See Rheology for the full VEP composite.

Per-[[rock]] keys: cohesion_init/cohesion_weak (Pa, C0/Cf), friction_init/friction_weak (sinφ0/sinφf), strain_thresh_init/strain_thresh_weak (εinit/εweak). validate_config (src/io/UserHelpers.jl) warns on a reversed ramp (εweak<εinit) and on strain hardening (Cf>C0 or sinφf>sinφ0 — unusual but allowed).

Yield cap

The absolute cap σy,max is the per-rock key yield_stress_max (Pa, default 5e8; set 0 to disable). Without it, C+sinφP grows to many GPa at depth, letting cold strong slab cores accumulate unbounded elastic stress and trigger break-off cascades (Kaus 2010; Glerum et al. 2018). The 500 MPa default matches lithospheric strength estimates (Byerlee envelope at 30–40 km).

Yield-fraction gating of strain accumulation

Weakening strain should only build where the material actually yields — in shear bands, not in distributed viscous flow. Two pieces implement this:

  1. _compute_viscosity_core returns a yielded flag (inv_plast > inv_visc, i.e. the plastic branch governs), propagated through compute_VEP_viscosity. During project_markers_to_cells! the marker-fraction of yielding markers is accumulated per cell into state.yield_frac_c [0,1].

  2. update_marker_strain! accumulates, per marker,

Δεp=Δtε˙II(cell)fyield(cell),

using the host cell's strain-rate invariant state.eii_c and yield fraction state.yield_frac_c — zero where nothing yields, the full rate inside shear bands. Accumulation is also skipped when the cell strain rate is below the global [rheology] threshold str_min (default 1e-18 s⁻¹).

The global switch strain_gate_plastic ([rheology], default true) controls the gate; false recovers the legacy total-strain accumulation (fyield1).

Healing (annealing)

Plastic strain anneals away on an Arrhenius temperature-dependent timescale — healed faults restrengthen, which is essential for episodic tectonics:

dεpdt=εpτheal(T),τheal(T)=τ0exp[EhealR(1T1Tref)].

update_marker_strain! applies this as a multiplicative decay εpεpeΔt/τheal before the accumulation term, with τheal floored at 106 s to avoid exponential underflow at hot temperatures. Hot (deep, or recently annealed) faults therefore lose their weakening memory quickly while cold upper-crustal faults stay weak.

Per-[[rock]] keys: heal_tau0 (s at Tref; default 0.0 = no healing), heal_E (J/mol, default 3e5), heal_Tref (K, default 1000.0).

Viscous strain softening

Ductile shear zones weaken by fabric/CPO development independently of friction. When visc_soft_factor <1, the aggregate viscous viscosity in _compute_viscosity_core ramps from 1 to visc_soft_factor over the same strain interval [εinit,εweak] as the plastic ramp:

ηviscηviscfvisc(εp),fvisc:1visc_soft_factor.

Per-[[rock]] key visc_soft_factor (default 1.0 = off; e.g. 0.1 = 10× softer when fully strained). validate_config requires $0 < $ visc_soft_factor 1.

Reaction softening (divariant eclogitization)

Orthogonal to the strain machinery, MILET applies a reaction–deformation softening tied to the divariant eclogite transition (Phase changes, transition = 3 in a [[phase]] block, src/materials/PhaseChange.jl). The reaction progress is $X = $ phase_drho/Δρmax, the marker's accumulated densification normalized by the transition's drho. During project_markers_to_cells!(src/particles/Projection.jl,_eclogite_softening_params) the marker viscosity is reduced by a fixed number of decades per unit reaction progress:

ηmax(η10ΔdecX,ηmin)

with Δdec = the [[phase]] key weaken_decades (0 = off). This represents grain-size-sensitive diffusion creep in the fine-grained, Zener-pinned reaction product, and combines with shear heating (do_shear_heating) into a thermal–reaction weakening feedback. It is applied in all three projection paths (host, bilinear, general/AMR).

Configuration summary

toml
[rheology]
strain_gate_plastic = true   # yield-fraction gating; false = legacy total strain
str_min             = 1e-18  # minimum cell strain rate for accumulation (1/s)

[[rock]]
cohesion_init        = 20e6  # C0 (Pa)
cohesion_weak        = 4e6   # Cf (Pa)
friction_init        = 0.5   # sin(phi0)
friction_weak        = 0.1   # sin(phif)
strain_thresh_init   = 0.0   # ramp start
strain_thresh_weak   = 0.5   # ramp end
yield_stress_max     = 5e8   # Drucker-Prager cap (Pa); <= 0 disables
visc_soft_factor     = 0.3   # viscous ramp target; 1.0 = off
heal_tau0            = 1e13  # s at heal_Tref; 0 = no healing
heal_E               = 3e5   # J/mol
heal_Tref            = 1000.0 # K

[[phase]]                    # reaction softening (eclogite)
transition      = 3
drho            = 270.0      # full densification (kg/m³)
weaken_decades  = 2.0        # eta reduction at X = 1

Tests

test/smoke/test_softening.jl covers: healing decay (εpεp/2 after t=τhealln2), the viscous-softening ramp endpoint ($\eta(\varepsilon_\mathrm{weak}) = $ visc_soft_factor η(0) for a purely viscous rock), the yield cap, the yield flag / gating behavior (fyield=0 → no accumulation; =1 → full rate), and a defaults regression against the pre-change extension-case rheology.

See also Rheology, Grain-size evolution (an independent, complementary localization mechanism), and Parameter file.