Mid-ocean ridge with a transform (3-D)
Two ridge segments offset by a 40 km transform spread at 3 cm/yr per side above half-space-cooling plates. The seafloor is a free-slip surface; its deformation is shown as dynamic topography, h = -(σyy - <σyy>)/((ρm - ρw) g), which develops axial valleys along both segments and relief at the ridge-transform intersections.
Run it with:
bash
julia -t auto --project=. main.jl cases/mor3d.tomlFull case file — cases/mor3d.toml:
toml
# ══════════════════════════════════════════════════════════════════════════════
# 3D mid-ocean ridge with a transform offset.
#
# Two ridge segments, offset by 40 km across a transform at z = zsize/2, spread
# at 3 cm/yr per side. The plates are the half-space-cooling thermal boundary
# layer (initial_temperature_mor3d). The top is a free-slip seafloor; surface
# deformation is shown as dynamic topography, h = -(σyy - <σyy>)/((ρm - ρw) g)
# with σyy = -p + 2η ∂vy/∂y at the top (docs/scripts/render_mor3d.py).
#
# Kinematics: the side walls pull the top 30 km of rock outward ("prescribed"
# depth window), the seafloor and the front/back walls are free slip and the
# bottom is open (traction-free) so the asthenosphere wells up under the
# axes. y = depth, positive down.
# ══════════════════════════════════════════════════════════════════════════════
[model]
case = "mor3d"
dim = 3
xsize = 240000.0 # spreading direction
ysize = 80000.0
zsize = 120000.0 # along the ridge axis
nx = 29
ny = 17
nz = 15
mnx = 2
mny = 2
mnz = 2
gx = 0.0
gy = 9.81
gz = 0.0
pinit = 0.0
eta_min = 1e18
eta_max = 1e24
maxxystep = 0.5
maxtkstep = 20.0
maxtmstep = 3.1556e12 # 100 kyr cap
ntot = 40
do_stokes = true
do_heat = true
do_advect = true
do_adiabatic = false
do_shear_heating = false
do_friction = false
do_phase_change = false
do_melting = false
do_free_surface = false
do_radiogenic = false
fe_order_v = 2
fe_order_p = 1
fe_order_T = 1
n_picard = 3
picard_tol = 1e-3
solver_type = "mumps"
krylov_tol = 1e-7
krylov_maxit = 200
output_dir = "output/mor3d"
output_every = 2
str_min = 1e-18
T_top = 273.0
T_bot = 1623.0
air_thick = 0.0 # no sticky air: the seafloor is the free-slip top
air_rock_id = 1
# Walls: "prescribed" drives vx_plate (left) / vx_plate_right (right) inside
# the depth window [air_thick, air_thick + plate_thickness]; zero elsewhere.
bc_left = "prescribed"
bc_right = "prescribed"
bc_surface = "free_slip"
bc_deep = "traction" # open bottom: passive upwelling
bc_front = "free_slip"
bc_back = "free_slip"
vx_plate = -9.5129e-10 # m/s = -3 cm/yr (left plate moves left)
vx_plate_right = 9.5129e-10 # m/s = +3 cm/yr (right plate moves right)
plate_thickness = 30000.0
continent_thickness = 30000.0
# placeholder values for unused subduction fields
trench_x = 0.0
plate_age = 1.0
x_plate_left = 0.0
x_plate_right = 0.0
surface_smooth = 0.0
# ── Rocks: 1 = unused (air slot), 2 = oceanic crust, 3 = mantle ──────────────
[[rock]]
nu0 = 1e18
mm = 1.0
dh = 0.0
ro0 = 1.0
alpha = 0.0
cp = 1000.0
kt = 20.0
eta_min = 1e18
eta_max = 1e18
immobile = false
[[rock]]
disl_prof = "Dry_Maryland_Diabase-Mackwell_1998"
reference_density = 2900.0
thermal_expansion = 3e-5
specific_heat = 1250.0
thermal_conductivity = 2.5
cohesion_init = 20e6
cohesion_weak = 2e6
friction_init = 0.4
friction_weak = 0.05
strain_thresh_init = 0.0
strain_thresh_weak = 0.5
eta_min = 1e19
eta_max = 1e24
[[rock]]
disl_prof = "Dry_Olivine-Ranalli_1995"
reference_density = 3300.0
thermal_expansion = 3e-5
specific_heat = 1250.0
thermal_conductivity = 3.0
cohesion_init = 20e6
cohesion_weak = 2e6
friction_init = 0.4
friction_weak = 0.05
strain_thresh_init = 0.0
strain_thresh_weak = 0.5
eta_min = 1e19
eta_max = 1e24