Skip to content

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.toml

Full 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