Plate Tectonics: units, equations and validation#

Conventions and model limits#

Rates use m/s and times use seconds. Convert cm/year explicitly with units.convert. Euler-vector components and positions are Earth-fixed Cartesian coordinates; their cross product gives Cartesian velocity, not local north/east components. Scalar convergence is positive toward the supplied boundary normal. Half-spreading rate is one-sided.

Cooling profiles use depth positive downward, absolute temperatures and positive diffusivity. Heat flux is positive upward. The half-space solution holds the surface fixed while periodic diffusion conserves the mean; those boundary conditions describe different experiments. Flexural rigidity uses an ideal stable isotropic elastic plate with -1 < nu < 0.5. Flexural deflection and ocean depth are positive downward. Hotspot track length is measured along the small circle about the Euler pole, and pole_distance is the angular distance of the hotspot from that pole. Euler vectors passed to compose_euler_vectors carry their three Cartesian components on the last axis; omega_ab is the motion of plate A relative to plate B.

Input contracts#

Algebraic models accept finite real scalars or nonempty arrays. Booleans, complex inputs, nonnumeric values and NaN/Inf are rejected. Physical bounds apply element by element; NumPy broadcasting applies between arguments. No unit metadata are carried in raw numbers. Bounds protect mathematical domains and obvious physical contradictions, but do not establish model applicability.

Equation and output map#

angular_speed#

earthsciencekit.plate_tectonics.angular_speed()

Output: rad/s. Constant angular rate; angular input is radians and output radians per second.

rotation_angle / time

plate_speed#

earthsciencekit.plate_tectonics.plate_speed()

Output: m/s. Spherical rigid plate, magnitude only; angular distance must be at most pi.

angular_speed * radius * np.sin(angular_distance)

euler_velocity_x#

earthsciencekit.plate_tectonics.euler_velocity_x()

Output: m/s. Earth-fixed Cartesian axes; x is not the local east component.

omega_y * position_z - omega_z * position_y

euler_velocity_y#

earthsciencekit.plate_tectonics.euler_velocity_y()

Output: m/s. Same Earth-fixed Cartesian convention as euler_velocity_x.

omega_z * position_x - omega_x * position_z

euler_velocity_z#

earthsciencekit.plate_tectonics.euler_velocity_z()

Output: m/s. Earth-fixed components, not local vertical motion or deformation.

omega_x * position_y - omega_y * position_x

plate_displacement#

earthsciencekit.plate_tectonics.plate_displacement()

Output: m. Constant signed speed along a local coordinate; not a finite Euler rotation.

speed * time

spreading_age#

earthsciencekit.plate_tectonics.spreading_age()

Output: s. Distance on one side and half-spreading rate; changes in rate are omitted.

distance / half_spreading_rate

full_spreading_rate#

earthsciencekit.plate_tectonics.full_spreading_rate()

Output: m/s. Symmetric spreading; asymmetric velocities require their own relative-vector calculation.

2 * half_spreading_rate

convergence_rate#

earthsciencekit.plate_tectonics.convergence_rate()

Output: m/s. Positive normal component denotes convergence; negative denotes divergence.

relative_speed * np.cos(obliquity)

fault_slip_rate#

earthsciencekit.plate_tectonics.fault_slip_rate()

Output: m/s. Supplied obliquity is oriented from the positive convergence normal.

relative_speed * np.sin(obliquity)

subduction_travel_time#

earthsciencekit.plate_tectonics.subduction_travel_time()

Output: s. Straight slab at constant speed; zero dip cannot reach depth and is rejected.

vertical_depth / (slab_speed * np.sin(dip))

slab_pull_force#

earthsciencekit.plate_tectonics.slab_pull_force()

Output: N. Simple buoyancy force magnitude; drag, phase changes and mantle flow are excluded.

density_excess * slab_volume * gravity

airy_root#

earthsciencekit.plate_tectonics.airy_root()

Output: m. Local compensation without plate flexure; mantle must be denser than crust.

elevation * crust_density / (mantle_density - crust_density)

flexural_rigidity#

earthsciencekit.plate_tectonics.flexural_rigidity()

Output: N m. Thin isotropic elastic plate with stable Poisson ratio, not a yielding viscoelastic lithosphere.

young_modulus * elastic_thickness**3 / (12 * (1 - poisson_ratio**2))

flexural_parameter#

earthsciencekit.plate_tectonics.flexural_parameter()

Output: m. Infinite beam-like plate convention alpha to the fourth equals 4D over density contrast times g.

(4 * rigidity / (density_contrast * gravity))**0.25

halfspace_temperature#

earthsciencekit.plate_tectonics.halfspace_temperature()

Output: K. Semi-infinite conduction with fixed surface temperature; no hydrothermal or advective heat transfer.

surface_temperature + (mantle_temperature - surface_temperature) * erf(depth / (2 * np.sqrt(diffusivity * age)))

halfspace_heat_flux#

earthsciencekit.plate_tectonics.halfspace_heat_flux()

Output: W/m^2. Positive upward flux; semi-infinite conductive model excludes the zero-age singularity.

conductivity * (mantle_temperature - surface_temperature) / np.sqrt(np.pi * diffusivity * age)

mantle_rayleigh_number#

earthsciencekit.plate_tectonics.mantle_rayleigh_number()

Output: 1. Layer heated from below with uniform properties; convection starts above about 657.5 (free slip) or 1708 (rigid walls).

thermal_expansivity * density * gravity * temperature_difference * thickness**3 / (diffusivity * viscosity)

flexural_deflection#

earthsciencekit.plate_tectonics.flexural_deflection()

Output: m. Unbroken infinite thin elastic plate, deflection positive downward; density contrast is mantle minus infill.

alpha = (4 * rigidity / (density_contrast * gravity))**0.25
x = abs(distance) / alpha
line_load * alpha**3 / (8 * rigidity) * np.exp(-x) * (np.cos(x) + np.sin(x))

hotspot_age#

earthsciencekit.plate_tectonics.hotspot_age()

Output: s. Fixed hotspot and constant Euler rotation of the plate over it; track length is measured along the small circle.

track_length / (angular_speed * radius * np.sin(pole_distance))

ocean_depth#

earthsciencekit.plate_tectonics.ocean_depth()

Output: m. Isostatic half-space cooling, depth positive downward; it overestimates depth on sea floor older than about 70 million years.

ridge_depth + 2 * mantle_density * thermal_expansivity * (mantle_temperature - surface_temperature)
/ (mantle_density - water_density) * np.sqrt(diffusivity * age / np.pi)

compose_euler_vectors#

earthsciencekit.plate_tectonics.compose_euler_vectors()

Output: rad/s. Instantaneous rotations only; inputs and output have three Cartesian components on the last axis.

omega_ab + omega_bc

Independent validation#

Every algebraic API has a fixed-value check, broadcasting check and invalid-input contracts. The shared suite adds cross-model identities, energy/conservation checks and independent analytic solutions for dynamics. See Validation policy for the exact evidence and Numerical methods and sampled results for numerical conventions.