Seismology: units, equations and validation#
Conventions and model limits#
Moduli are Pa, density kg/m^3, distances m and wave speeds m/s. Reflection and transmission coefficients refer to acoustic pressure amplitudes at normal incidence. Transmitted energy includes an impedance ratio; pressure amplitudes alone need not sum in quadrature to one. Oblique elastic mode conversion is outside this model.
Moment is N m and magnitude uses (2/3)(log10(M0)-9.1). Switching to dyne cm without changing the intercept is an error. Ricker time is centred at zero and frequency is Hz. Constant-Q attenuation excludes geometrical spreading. Oscillator Q gives damping ratio 1/(2Q); its natural frequency is in Hz.
Layered models are flat (head waves, Love waves) or spherically symmetric (ray parameter, in s/rad with incidence measured from the radius). Local magnitude takes Wood-Anderson amplitude in m and hypocentral distance in m. Vertical travel time integrates a tabulated profile exactly for speeds that vary linearly between its depths.
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#
p_wave_speed#
earthsciencekit.seismology.p_wave_speed()
Output: m/s. Homogeneous isotropic small-strain medium; shear modulus may vanish in a fluid.
np.sqrt((bulk_modulus + 4 * shear_modulus / 3) / density)
s_wave_speed#
earthsciencekit.seismology.s_wave_speed()
Output: m/s. Homogeneous isotropic medium; zero shear modulus returns zero speed.
np.sqrt(shear_modulus / density)
poisson_ratio#
earthsciencekit.seismology.poisson_ratio()
Output: 1. Requires positive bulk modulus: vp squared must exceed 4 vs squared over 3.
(p_speed**2 - 2 * s_speed**2) / (2 * (p_speed**2 - s_speed**2))
travel_time#
earthsciencekit.seismology.travel_time()
Output: s. Straight path in a homogeneous medium; not a ray tracer.
distance / speed
seismic_impedance#
earthsciencekit.seismology.seismic_impedance()
Output: kg/(m^2 s). Scalar acoustic impedance; elastic mode conversion is excluded.
density * speed
reflection_coefficient#
earthsciencekit.seismology.reflection_coefficient()
Output: 1. Pressure amplitude convention at normal incidence; coefficient can be negative.
(impedance2 - impedance1) / (impedance2 + impedance1)
transmission_coefficient#
earthsciencekit.seismology.transmission_coefficient()
Output: 1. Normal-incidence acoustic pressure amplitudes, not displacement amplitudes.
2 * impedance2 / (impedance2 + impedance1)
critical_angle#
earthsciencekit.seismology.critical_angle()
Output: rad. Incidence from the slower medium; second speed must exceed first.
np.arcsin(speed1 / speed2)
seismic_moment#
earthsciencekit.seismology.seismic_moment()
Output: N m. Scalar mean-slip estimate; no spatial rupture distribution.
rigidity * area * slip
moment_magnitude#
earthsciencekit.seismology.moment_magnitude()
Output: 1. Uses the 9.1 intercept with moment in N m, not dyne cm.
(2 / 3) * (np.log10(moment) - 9.1)
moment_from_magnitude#
earthsciencekit.seismology.moment_from_magnitude()
Output: N m. Same SI convention as moment_magnitude; very large inputs can overflow.
10 ** (1.5 * magnitude + 9.1)
gutenberg_richter#
earthsciencekit.seismology.gutenberg_richter()
Output: count. Expected cumulative count for the fitted catalogue interval; completeness matters.
10 ** (a - b * magnitude)
omori_rate#
earthsciencekit.seismology.omori_rate()
Output: count/s. Empirical fitted rate; no earthquake timing or location prediction.
productivity / (offset + time)**exponent
ricker_wavelet#
earthsciencekit.seismology.ricker_wavelet()
Output: 1. Unit peak at zero time; frequency is the peak-spectrum convention.
(1 - 2 * (np.pi * frequency * time)**2) * np.exp(-(np.pi * frequency * time)**2)
attenuated_amplitude#
earthsciencekit.seismology.attenuated_amplitude()
Output: same amplitude units as input. Constant-Q narrowband attenuation; geometric spreading is separate.
amplitude * np.exp(-np.pi * frequency * time / quality_factor)
rayleigh_wave_speed#
earthsciencekit.seismology.rayleigh_wave_speed()
Output: m/s. Homogeneous half-space with a free surface; requires positive bulk modulus.
s_speed * np.sqrt(xi) # xi in (0, 1): xi**3 - 8 xi**2 + (24 - 16 gamma) xi - 16 (1 - gamma) = 0, gamma = (s_speed / p_speed)**2
head_wave_travel_time#
earthsciencekit.seismology.head_wave_travel_time()
Output: s. Flat layer over a faster half-space; distance must reach the critical distance.
distance / speed2 + 2 * thickness * np.sqrt(speed2**2 - speed1**2) / (speed1 * speed2)
crossover_distance#
earthsciencekit.seismology.crossover_distance()
Output: m. Flat layer over a faster half-space; direct and head-wave times are equal there.
2 * thickness * np.sqrt((speed2 + speed1) / (speed2 - speed1))
love_wave_angular_frequency#
earthsciencekit.seismology.love_wave_angular_frequency()
Output: rad/s. Fundamental mode of one layer over a half-space; phase speed between the two shear speeds.
phase_speed * np.arctan(halfspace_rigidity * s2 / (layer_rigidity * s1)) / (thickness * s1)
# s1 = np.sqrt(phase_speed**2 / layer_s_speed**2 - 1), s2 = np.sqrt(1 - phase_speed**2 / halfspace_s_speed**2)
ray_parameter#
earthsciencekit.seismology.ray_parameter()
Output: s/rad. Spherically symmetric Earth; incidence angle from the radial direction, conserved along a ray.
radius * np.sin(incidence_angle) / speed
local_magnitude#
earthsciencekit.seismology.local_magnitude()
Output: 1. Wood-Anderson amplitude in m, hypocentral distance in m; Hutton-Boore correction for about 10-700 km.
np.log10(amplitude / 1e-3) + 1.11 * np.log10(distance / 1e5) + 1.89e-6 * (distance - 1e5) + 3
vertical_travel_time#
earthsciencekit.seismology.vertical_travel_time()
Output: s. Tabulated profile, speed linear between points; a repeated depth marks a discontinuity.
cumsum(dz * np.log(v2 / v1) / (v2 - v1)) # dz / v1 where v2 == v1
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.