Stokes + energy with markers-in-cell
Inf-sup stable Taylor–Hood (Q2/Q1) Stokes coupled to heat transport; RK4 marker advection carries composition, temperature, stress, plastic strain, grain size and porosity.
A thermomechanical finite-element framework for lithosphere and mantle dynamics, developed entirely in Julia on top of Gridap and named after Miletus, a historic center of early scientific thought.
Every animation below comes from a case file shipped in cases/; open a card's page for the full parameter file and the command to run it.
Modeling in Lithospheric Evolution Tectonics is a thermo-mechanical finite-element code for lithospheric and mantle dynamics. It solves the coupled Stokes and energy equations with a mixed, inf-sup stable Taylor–Hood discretisation (
MILET is a flat-include research code: main.jl includes the sources under src/ in dependency order and drives one simulation per run, fully specified by a single TOML parameter file (deep-merged onto cases/_defaults.toml).
Stokes flow, Boussinesq or compressible (TALA, King et al. 2010), in 2-D and 3-D Cartesian plus spherical-chunk geometry — Governing equations, Compressibility
Visco-elasto-plastic composite rheology with calibrated dislocation-creep flow laws (Ranalli 1995 catalogue), grain-size-sensitive diffusion creep, and Drucker–Prager yield — Rheology
Marker-in-cell transport: RK4 advection, reseeding, and subgrid-scale temperature diffusion after Gerya & Yuen (2003) — Markers
Divariant, rate-limited (Arrhenius) phase transitions with reaction-progress-dependent softening — Phase changes
Melting parameterisations and melt weakening — Melting
Heat transport with shear, adiabatic, and radiogenic heating, plus SUPG / entropy-viscosity stabilisation options — Heat transport
Sticky-air free surface with FSSA stabilisation and an ALE surface-tracking option — Free surface
Direct (MUMPS) and iterative (GMG, PETSc) solvers with cached factorisations and warm starts — Linear solvers
Picard and Newton nonlinear loops, CFL-limited time stepping, checkpoint/restart, VTK output — Time stepping
Adaptive mesh refinement and ALE — AMR & ALE
Geometric multigrid 3-D Stokes solver — Geometric multigrid. Right-preconditioned FGMRES on the monolithic saddle-point system; the velocity block is preconditioned by V-cycles of a Galerkin geometric multigrid ([solver] type = "gmg" (gmg_levels, gmg_cheb_degree, gmg_cycles, gmg_coarse_dofs); shipped 3-D cases: cases/plume3d_cube_gmg.toml, cases/plume3d_slab_gmg.toml. Implementation: src/solvers/GMG.jl, src/solvers/BlockMG.jl.
Two-phase (McKenzie) flow — Two-phase flow. Porous melt migration through a compacting viscous matrix, as a 3-field extension of the Stokes solve (Katz 2008; Rhebergen, Wells & Katz 2014):
discretised as [twophase] do_two_phase = true (k0, phi0, n_perm, mu_fluid, rho_fluid, alpha_phi, phi_min, pf_surface0, …). Implementation: src/physics/TwoPhase.jl.
Grain-size evolution (paleowattmeter) — Grain-size evolution. Per-marker grain size
integrated with exact operator-split sub-flows (update_grain_size, src/materials/GrainSize.jl) and two-way coupled to the composite diffusion + dislocation rheology. Per-rock keys grain_G0, grain_p, grain_Eg, grain_Vg, grain_lambda, grain_gamma, grain_c, grain_init (grain_G0 = 0 freezes the grain size).
Strain softening & healing — Softening & healing. Linear cohesion/friction weakening over [strain_thresh_init, strain_thresh_weak], now with plastic-strain gating ([rheology] strain_gate_plastic = true: weakening strain accumulates only where the cell actually yields), temperature-dependent Arrhenius healing (heal_tau0, heal_E, heal_Tref), optional viscous strain softening (visc_soft_factor), and a configurable yield-stress cap (yield_stress_max).
# install dependencies (once)
julia --project=. -e 'using Pkg; Pkg.instantiate()'
# verification benchmark: SolCx (variable-viscosity Stokes, analytic solution)
julia --project=. main.jl cases/solcx_fixed.toml
# convection benchmark: Blankenbach case 1a
julia --project=. main.jl cases/blankenbach_1a.toml
# a worked geodynamic example: thermo-mechanical subduction
julia --project=. main.jl cases/subduction.toml
# 3-D plume with the geometric-multigrid solver
julia -t auto --project=. main.jl cases/plume3d_cube_gmg.tomlResults are written as VTK files (solution fields, markers, topography) to output/<case>/, viewable in ParaView — see Getting started for output formats and the depth-positive-down camera setup. Every TOML key is documented in the parameter-file reference.
SolCx (Duretz et al. 2011): grid convergence of the variable-viscosity Stokes solution (cases/solcx_fixed_n*.toml)
Blankenbach et al. (1989) case 1a: steady convection diagnostics (cases/blankenbach_*.toml)
Smoke and benchmark tests under test/ (julia --project=. test/runtests.jl) — see Benchmarks and Testing
The multi-species volatile transport module is part of a separate study in preparation and is not included in this release; shipped cases run with volatiles disabled.
3-D and spherical-chunk support are functional but less exercised than the 2-D Cartesian path.
If you use MILET in your work, please cite the paper that describes the code and its application to eclogite foundering on Venus, together with the archived simulations and inputs:
Karagoz, O. (2026). A mantle viscosity threshold for eclogite foundering on Venus. Journal of Geophysical Research: Planets, in revision.
Karagoz, O. (2026). MILET simulations, inputs and figure scripts for the eclogite-foundering study [Data set]. Zenodo. doi:10.5281/zenodo.20932417
Until the paper is published, please also cite the repository, github.com/okaragoz/MILET. The reference will be updated with volume, pages and DOI on publication.
@article{Karagoz2026Venus,
author = {Karagoz, Oguzcan},
title = {A Mantle Viscosity Threshold for Eclogite Foundering on {Venus}},
journal = {Journal of Geophysical Research: Planets},
year = {2026},
note = {In revision}
}
@misc{Karagoz2026Zenodo,
author = {Karagoz, Oguzcan},
title = {{MILET} simulations, inputs and figure scripts for the
eclogite-foundering study on {Venus}},
year = {2026},
publisher = {Zenodo},
doi = {10.5281/zenodo.20932417},
url = {https://doi.org/10.5281/zenodo.20932417}
}