Stagnant lid that fails: Arrhenius viscosity and a yield stress (2-D)
When viscosity falls steeply with temperature, the cold top boundary layer becomes too stiff to take part in the flow. It stops moving and thickens into a conductive lid, and convection continues underneath it in a nearly isoviscous interior, driven by the small part of the temperature drop the mobile sublayer at the base of the lid can carry. This is the one-plate regime of terrestrial planets without plate tectonics. A real lid is not infinitely strong, though: once the stresses in it reach the strength of rock it can break, sink into the mantle and be replaced, which is the episodic regime. The example sets up both ingredients, an Arrhenius viscosity and a yield stress, in the spherical annulus, at a strength where the lid holds for hundreds of Myr and then fails. The viscosity-contrast example shows how the same shell moves from a mobile to a stagnant lid as the contrast grows, without yielding.
The model
Boussinesq, heated uniformly from within, with the core held at a fixed temperature, free slip and isothermal walls, in the common shell. The internal heating is what lets the lid reach a steady thickness: the lid grows until it conducts away what the mantle produces. Heated from below alone, the interior sits just under the core temperature, the bottom boundary layer carries a Nusselt number of about one at this Rayleigh number and activation energy (Solomatov & Moresi 2000), and the lid thickens by conduction without levelling off. The viscosity comes from the simple path, compute_viscosity in physics/compute_viscosity.jl, which main_SphCon uses whenever cfg.useCompositeRheology is false:
with every layer reference viscosity (mat.*_eta0) set to mat.E_act_scale mat.V_act_scale
Between the 300 K surface and the 1600 K interior the unclamped law spans about forty orders of magnitude, so the lid sits on the clamp and the effective viscosity contrast is
On top of that, cfg.useSimpleYield caps the stress at a yield stress
with simple_yield! in physics/compute_viscosity.jl, which reads the cohesion, friction and mat.maxYieldStress; the driver sets the cohesion and the cap to
Which Arrhenius law
The time loop applies the Arrhenius law in compute_viscosity, driven by mat.E_act_scale and mat.T_ref, which is what this example sets. The separate cfg.useArrhenius helper (utils/arrhenius_viscosity.jl) is not used by main_SphCon.
| parameter | value |
|---|---|
300 kJ/mol (mat.E_act_scale = 36 080 K) | |
| 1600 K | |
| clamps | |
| yield stress | cfg.useSimpleYield) |
| internal heating | cfg.useInternalHeating, cfg.internalHeating_H), about 20 mW/m² of heat production per unit surface |
| 1700 K (held fixed), 300 K | |
| initial state | interior at 1600 K, exponential boundary layers of 100 km (top) and 50 km (CMB), a degree-4 CMB perturbation of 20 K and 5 K noise |
| grid | Nr × 8 Nr (default 64 × 512) |
| run length | 1500 Myr (cfg.maxTimeMyr) |
| solver | MUMPS direct, markers for temperature |


The driver as documented (

The same run at 1, 214, 846 and 1497 Myr, same colour range: the lid before it fails, the first failure (a cold slab of lid sinking at the left), the second, and the regrown lid over an interior still cooler than before the first failure.
Running it
export GKSwstype=nul
julia --project=. -t 4 examples/annulus_stagnant_lid_2d.jl 1e6 64 1e4 1e-11 8Arguments are Ra_i Nr Δη H τ_y, with H = 0 heats the shell from below only and τ_y = 0 switches yielding off. These are also the defaults, so the bare command runs the documented case. At 64 × 512 the run above took about 14 h of wall time on two threads (5.7 s per step, Picard sweeps included) with another long run sharing the machine; the smoke test below gives an uncontended timing. At the end the driver prints the means of lid_mobility, lid_thick_km and Nu_top over the last third of the rows of diagnostics.csv.
Diagnostics
The lid is read from diagnostics.csv (utils/diagnostics_csv.jl):
| column | meaning |
|---|---|
lid_mobility | rms surface velocity over rms velocity of the whole mantle, in the no-net-rotation frame |
lid_thick_km | depth at which the horizontally averaged temperature crosses 1300 K, interpolated between cell centres |
Vsurf_rms_cmyr, Vrms_cmyr | the two velocities behind the mobility |
Nu_top, Nu_bot | wall heat flux over the conductive flux of the same shell |
What to expect
Whether the lid survives depends on how its stresses compare with
| lid failures | behaviour | |
|---|---|---|
| 10 MPa | none | stagnant; the lid levels off at 252 km after about 1300 Myr, lid_mobility |
| 8 MPa (documented) | 214 Myr, 841 to 856 Myr, shorter bursts at 868 and 987 Myr | episodic; the lid regrows to 290 km by 1500 Myr |
| 7 MPa | 164 Myr, 1017 Myr, and a smaller burst at 309 Myr | episodic |
| 5 MPa | 131 Myr, repeatedly between 283 and 454 Myr, 1150 Myr | episodic, failures more frequent |
| 3 MPa | 112 Myr, 1003 Myr, with bursts until about 1075 Myr | episodic; the lid regrows to 257 km by 1500 Myr |
| 2 MPa | from 99 Myr on, without pause | mobile; surface velocity 2 to 10 cm/yr over 1000 to 1500 Myr |
| 1 MPa | from 73 Myr on, without pause | mobile; surface velocity 4 to 9 cm/yr over 1000 to 1500 Myr |
In the documented case each failure shows as a burst in every column of diagnostics.csv: Vrms_cmyr rises from about 0.01 to 100 cm/yr at the first failure, the surface moves with the mantle (lid_mobility near 1), lid_thick_km collapses from 191 to 15 km, and q_surf_mWm2 peaks at about 410 mW/m². The sinking lid then fills the mantle with cold rock: the mean temperature falls from 1380 K at the first failure to 1160 K after the second, below the 1700 K core, so heat now flows out of the core. While the new lid is still thin, between about 350 and 420 Myr, the surface keeps moving at a few cm/yr before the lid stiffens again. In the quiet stretches the whole mantle is nearly still, which makes lid_mobility, a ratio of two tiny velocities, read 0.5 or so; read Vsurf_rms_cmyr (0.02 cm/yr or less) to see that the surface is not moving. Over 1000 to 1500 Myr the documented case gives:
| quantity | value |
|---|---|
lid_thick_km (1300 K isotherm) | 243 km, growing |
Vsurf_rms_cmyr | 0.0075 cm/yr |
Vrms_cmyr | 0.013 cm/yr |
q_surf_mWm2 | 25.4 mW/m² |
q_cmb_mWm2 | 17.4 mW/m² (out of the core) |
The energy budget closes to better than one part in a thousand per sample between failures (budget_resid); during a failure the steps are so short that the sampled interval misses most of the change and the residual rises to about 0.2 for a few samples. On 178 steps, during the failures and the recoveries after them, the Picard iteration stopped at its 50-sweep cap with the residual above its tolerance of picard_n and picard_rel in diagnostics.csv record it. With no yield stress (τ_y = 0) the lid can only thin by convective erosion, and the run sits in the stagnant column of the table at any contrast of
Lower yield stresses: from episodic to mobile

Below 3 MPa the lid never re-forms. Once it first fails, at 99 Myr for 2 MPa and 73 Myr for 1 MPa, the surface keeps moving with the mantle for the rest of the run (lid_mobility 0.8 to 1.1) and the shell becomes a mobile lid that recycles its cold top boundary layer continuously:


Temperature between 700 and 1800 K over 1500 Myr. The sinking lid cools the whole mantle: over 1000 to 1500 Myr the mean temperature is 843 K at 2 MPa and 771 K at 1 MPa, far below the 1700 K core, which therefore loses 240 and 290 mW/m². Since the mantle is colder than 1300 K almost everywhere, lid_thick_km has no isotherm to find and reports the whole shell; read Vsurf_rms_cmyr and lid_mobility instead. Wall time was 31 h (1 MPa) and 54 h (2 MPa) on two threads with other runs sharing the machine.
Smoke test
A quick check that the driver runs:
MILEVA_MAXSTEPS=6 julia --project=. -t 2 examples/annulus_stagnant_lid_2d.jl 1e6 166 steps at 16 × 128 with the default contrast, heating and yield stress in 37 s of wall time (mostly compilation), 2.2 GB; the driver reports a lid of 153 km and a lid mobility of