Softening & healing
Strain localization in MILET is driven by a per-marker accumulated plastic strain 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:
Cohesion
The rate-dependent realization is
Per-[[rock]] keys: cohesion_init/cohesion_weak (Pa, friction_init/friction_weak (strain_thresh_init/strain_thresh_weak (validate_config (src/io/UserHelpers.jl) warns on a reversed ramp (
Yield cap
The absolute cap yield_stress_max (Pa, default 5e8; set
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:
_compute_viscosity_corereturns ayieldedflag (inv_plast > inv_visc, i.e. the plastic branch governs), propagated throughcompute_VEP_viscosity. Duringproject_markers_to_cells!the marker-fraction of yielding markers is accumulated per cell intostate.yield_frac_c. update_marker_strain!accumulates, per marker,
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 (
Healing (annealing)
Plastic strain anneals away on an Arrhenius temperature-dependent timescale — healed faults restrengthen, which is essential for episodic tectonics:
update_marker_strain! applies this as a multiplicative decay
Per-[[rock]] keys: heal_tau0 (s at 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 _compute_viscosity_core ramps from visc_soft_factor over the same strain interval
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
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_drhodrho. 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:
with [[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
[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 = 1Tests
test/smoke/test_softening.jl covers: healing decay (visc_soft_factor
See also Rheology, Grain-size evolution (an independent, complementary localization mechanism), and Parameter file.