FAILURE MAP
← Case archive

FA-71396 / Seismic magnitude estimation / Open access

Moment magnitude from fault dimensions: rupture area units · case 01

Scenario magnitudes are two units low.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Only one of the two km dimensions is converted to metres.

VERIFIED REPAIR

Convert both dimensions: area = (L*1e3)*(W*1e3) m^2.

Unsuccessful approach: Scaling by 1e9 over-converts and is one unit high.

Case contract

Rigidity in GPa, rupture length and width in km, average slip in m; any non-positive value returns None. M0 = mu * area * slip in N*m (SI), Mw = 2/3 (log10 M0 - 9.1). Return [M0 formatted %.3e, Mw rounded 0.01].

Why this case matters

Scenario ruptures for hazard studies convert fault geometry into moment magnitude.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(mu_gpa, length_km, width_km, slip_m):
    if min(mu_gpa, length_km, width_km, slip_m) <= 0:
        return None
    area = length_km * width_km * 1e3
    m0 = mu_gpa * 1e9 * area * slip_m
    mw = (2.0 / 3.0) * (math.log10(m0) - 9.1)
    return ["%.3e" % m0, round(mw, 2)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['mu 30 GPa L 1 W 1 D 0.05', [30, 1, 1, 0.05], ['1.500e+15', 4.05]], ['mu 30 GPa L 10 W 8 D 0.5', [30, 10, 8, 0.5], ['1.200e+18', 5.99]], ['mu 30 GPa L 50 W 20 D 2.0', [30, 50, 20, 2.0], ['6.000e+19', 7.12]], ['mu 30 GPa L 400 W 100 D 8.0', [30, 400, 100, 8.0], ['9.600e+21', 8.59]], ['mu 30 GPa L 0.5 W 0.3 D 0.01', [30, 0.5, 0.3, 0.01], ['4.500e+13', 3.04]], ['mu 32 GPa L 1 W 1 D 0.05', [32, 1, 1, 0.05], ['1.600e+15', 4.07]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 32 GPa L 50 W 20 D 2.0', [32, 50, 20, 2.0], ['6.400e+19', 7.14]]], [['mu 30 GPa L 400 W 100 D 8.0', [30, 400, 100, 8.0], ['9.600e+21', 8.59]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 32 GPa L 50 W 20 D 2.0', [32, 50, 20, 2.0], ['6.400e+19', 7.14]], ['mu 32 GPa L 400 W 100 D 8.0', [32, 400, 100, 8.0], ['1.024e+22', 8.61]], ['mu 32 GPa L 0.5 W 0.3 D 0.01', [32, 0.5, 0.3, 0.01], ['4.800e+13', 3.05]], ['mu 40 GPa L 1 W 1 D 0.05', [40, 1, 1, 0.05], ['2.000e+15', 4.13]], ['mu 40 GPa L 10 W 8 D 0.5', [40, 10, 8, 0.5], ['1.600e+18', 6.07]], ['mu 40 GPa L 50 W 20 D 2.0', [40, 50, 20, 2.0], ['8.000e+19', 7.2]]], [['mu 30 GPa L 1 W 1 D 0.05', [30, 1, 1, 0.05], ['1.500e+15', 4.05]], ['mu 30 GPa L 10 W 8 D 0.5', [30, 10, 8, 0.5], ['1.200e+18', 5.99]], ['mu 30 GPa L 50 W 20 D 2.0', [30, 50, 20, 2.0], ['6.000e+19', 7.12]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 40 GPa L 10 W 8 D 0.5', [40, 10, 8, 0.5], ['1.600e+18', 6.07]], ['mu 40 GPa L 0.5 W 0.3 D 0.01', [40, 0.5, 0.3, 0.01], ['6.000e+13', 3.12]], ['zero slip', [30, 10, 5, 0], None], ['negative width', [30, 10, -5, 1], None]], [['mu 30 GPa L 10 W 8 D 0.5', [30, 10, 8, 0.5], ['1.200e+18', 5.99]], ['mu 30 GPa L 0.5 W 0.3 D 0.01', [30, 0.5, 0.3, 0.01], ['4.500e+13', 3.04]], ['mu 32 GPa L 1 W 1 D 0.05', [32, 1, 1, 0.05], ['1.600e+15', 4.07]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 32 GPa L 50 W 20 D 2.0', [32, 50, 20, 2.0], ['6.400e+19', 7.14]], ['mu 32 GPa L 400 W 100 D 8.0', [32, 400, 100, 8.0], ['1.024e+22', 8.61]], ['mu 32 GPa L 0.5 W 0.3 D 0.01', [32, 0.5, 0.3, 0.01], ['4.800e+13', 3.05]], ['mu 40 GPa L 1 W 1 D 0.05', [40, 1, 1, 0.05], ['2.000e+15', 4.13]]], [['mu 30 GPa L 1 W 1 D 0.05', [30, 1, 1, 0.05], ['1.500e+15', 4.05]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 40 GPa L 10 W 8 D 0.5', [40, 10, 8, 0.5], ['1.600e+18', 6.07]], ['mu 40 GPa L 50 W 20 D 2.0', [40, 50, 20, 2.0], ['8.000e+19', 7.2]], ['mu 40 GPa L 400 W 100 D 8.0', [40, 400, 100, 8.0], ['1.280e+22', 8.67]], ['mu 40 GPa L 0.5 W 0.3 D 0.01', [40, 0.5, 0.3, 0.01], ['6.000e+13', 3.12]], ['zero slip', [30, 10, 5, 0], None], ['negative width', [30, 10, -5, 1], None]]]
for label, args, expected in fixtures[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
mu 30 GPa L 1 W 1 D 0.05['1.500e+12', 2.05]['1.500e+15', 4.05]Failed
mu 30 GPa L 10 W 8 D 0.5['1.200e+15', 3.99]['1.200e+18', 5.99]Failed
mu 30 GPa L 50 W 20 D 2.0['6.000e+16', 5.12]['6.000e+19', 7.12]Failed
mu 30 GPa L 400 W 100 D 8.0['9.600e+18', 6.59]['9.600e+21', 8.59]Failed
mu 30 GPa L 0.5 W 0.3 D 0.01['4.500e+10', 1.04]['4.500e+13', 3.04]Failed
mu 32 GPa L 1 W 1 D 0.05['1.600e+12', 2.07]['1.600e+15', 4.07]Failed
mu 32 GPa L 10 W 8 D 0.5['1.280e+15', 4.0]['1.280e+18', 6.0]Failed
mu 32 GPa L 50 W 20 D 2.0['6.400e+16', 5.14]['6.400e+19', 7.14]Failed

SHA-256 / 5a314e1d3fc6cf88a1deaeaad06c321bffa2447dc6656768dc3f72a9a3dbce76

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(mu_gpa, length_km, width_km, slip_m):
    if min(mu_gpa, length_km, width_km, slip_m) <= 0:
        return None
    area = length_km * width_km * 1e9
    m0 = mu_gpa * 1e9 * area * slip_m
    mw = (2.0 / 3.0) * (math.log10(m0) - 9.1)
    return ["%.3e" % m0, round(mw, 2)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['mu 30 GPa L 1 W 1 D 0.05', [30, 1, 1, 0.05], ['1.500e+15', 4.05]], ['mu 30 GPa L 10 W 8 D 0.5', [30, 10, 8, 0.5], ['1.200e+18', 5.99]], ['mu 30 GPa L 50 W 20 D 2.0', [30, 50, 20, 2.0], ['6.000e+19', 7.12]], ['mu 30 GPa L 400 W 100 D 8.0', [30, 400, 100, 8.0], ['9.600e+21', 8.59]], ['mu 30 GPa L 0.5 W 0.3 D 0.01', [30, 0.5, 0.3, 0.01], ['4.500e+13', 3.04]], ['mu 32 GPa L 1 W 1 D 0.05', [32, 1, 1, 0.05], ['1.600e+15', 4.07]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 32 GPa L 50 W 20 D 2.0', [32, 50, 20, 2.0], ['6.400e+19', 7.14]]], [['mu 30 GPa L 400 W 100 D 8.0', [30, 400, 100, 8.0], ['9.600e+21', 8.59]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 32 GPa L 50 W 20 D 2.0', [32, 50, 20, 2.0], ['6.400e+19', 7.14]], ['mu 32 GPa L 400 W 100 D 8.0', [32, 400, 100, 8.0], ['1.024e+22', 8.61]], ['mu 32 GPa L 0.5 W 0.3 D 0.01', [32, 0.5, 0.3, 0.01], ['4.800e+13', 3.05]], ['mu 40 GPa L 1 W 1 D 0.05', [40, 1, 1, 0.05], ['2.000e+15', 4.13]], ['mu 40 GPa L 10 W 8 D 0.5', [40, 10, 8, 0.5], ['1.600e+18', 6.07]], ['mu 40 GPa L 50 W 20 D 2.0', [40, 50, 20, 2.0], ['8.000e+19', 7.2]]], [['mu 30 GPa L 1 W 1 D 0.05', [30, 1, 1, 0.05], ['1.500e+15', 4.05]], ['mu 30 GPa L 10 W 8 D 0.5', [30, 10, 8, 0.5], ['1.200e+18', 5.99]], ['mu 30 GPa L 50 W 20 D 2.0', [30, 50, 20, 2.0], ['6.000e+19', 7.12]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 40 GPa L 10 W 8 D 0.5', [40, 10, 8, 0.5], ['1.600e+18', 6.07]], ['mu 40 GPa L 0.5 W 0.3 D 0.01', [40, 0.5, 0.3, 0.01], ['6.000e+13', 3.12]], ['zero slip', [30, 10, 5, 0], None], ['negative width', [30, 10, -5, 1], None]], [['mu 30 GPa L 10 W 8 D 0.5', [30, 10, 8, 0.5], ['1.200e+18', 5.99]], ['mu 30 GPa L 0.5 W 0.3 D 0.01', [30, 0.5, 0.3, 0.01], ['4.500e+13', 3.04]], ['mu 32 GPa L 1 W 1 D 0.05', [32, 1, 1, 0.05], ['1.600e+15', 4.07]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 32 GPa L 50 W 20 D 2.0', [32, 50, 20, 2.0], ['6.400e+19', 7.14]], ['mu 32 GPa L 400 W 100 D 8.0', [32, 400, 100, 8.0], ['1.024e+22', 8.61]], ['mu 32 GPa L 0.5 W 0.3 D 0.01', [32, 0.5, 0.3, 0.01], ['4.800e+13', 3.05]], ['mu 40 GPa L 1 W 1 D 0.05', [40, 1, 1, 0.05], ['2.000e+15', 4.13]]], [['mu 30 GPa L 1 W 1 D 0.05', [30, 1, 1, 0.05], ['1.500e+15', 4.05]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 40 GPa L 10 W 8 D 0.5', [40, 10, 8, 0.5], ['1.600e+18', 6.07]], ['mu 40 GPa L 50 W 20 D 2.0', [40, 50, 20, 2.0], ['8.000e+19', 7.2]], ['mu 40 GPa L 400 W 100 D 8.0', [40, 400, 100, 8.0], ['1.280e+22', 8.67]], ['mu 40 GPa L 0.5 W 0.3 D 0.01', [40, 0.5, 0.3, 0.01], ['6.000e+13', 3.12]], ['zero slip', [30, 10, 5, 0], None], ['negative width', [30, 10, -5, 1], None]]]
for label, args, expected in fixtures[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
mu 30 GPa L 1 W 1 D 0.05['1.500e+18', 6.05]['1.500e+15', 4.05]Failed
mu 30 GPa L 10 W 8 D 0.5['1.200e+21', 7.99]['1.200e+18', 5.99]Failed
mu 30 GPa L 50 W 20 D 2.0['6.000e+22', 9.12]['6.000e+19', 7.12]Failed
mu 30 GPa L 400 W 100 D 8.0['9.600e+24', 10.59]['9.600e+21', 8.59]Failed
mu 30 GPa L 0.5 W 0.3 D 0.01['4.500e+16', 5.04]['4.500e+13', 3.04]Failed
mu 32 GPa L 1 W 1 D 0.05['1.600e+18', 6.07]['1.600e+15', 4.07]Failed
mu 32 GPa L 10 W 8 D 0.5['1.280e+21', 8.0]['1.280e+18', 6.0]Failed
mu 32 GPa L 50 W 20 D 2.0['6.400e+22', 9.14]['6.400e+19', 7.14]Failed

SHA-256 / 9dffeaabf96c160ca88725ee4c398d9d4093517c367d28cda621336f9bf0dcb9

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(mu_gpa, length_km, width_km, slip_m):
    if min(mu_gpa, length_km, width_km, slip_m) <= 0:
        return None
    area = (length_km * 1e3) * (width_km * 1e3)
    m0 = mu_gpa * 1e9 * area * slip_m
    mw = (2.0 / 3.0) * (math.log10(m0) - 9.1)
    return ["%.3e" % m0, round(mw, 2)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['mu 30 GPa L 1 W 1 D 0.05', [30, 1, 1, 0.05], ['1.500e+15', 4.05]], ['mu 30 GPa L 10 W 8 D 0.5', [30, 10, 8, 0.5], ['1.200e+18', 5.99]], ['mu 30 GPa L 50 W 20 D 2.0', [30, 50, 20, 2.0], ['6.000e+19', 7.12]], ['mu 30 GPa L 400 W 100 D 8.0', [30, 400, 100, 8.0], ['9.600e+21', 8.59]], ['mu 30 GPa L 0.5 W 0.3 D 0.01', [30, 0.5, 0.3, 0.01], ['4.500e+13', 3.04]], ['mu 32 GPa L 1 W 1 D 0.05', [32, 1, 1, 0.05], ['1.600e+15', 4.07]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 32 GPa L 50 W 20 D 2.0', [32, 50, 20, 2.0], ['6.400e+19', 7.14]]], [['mu 30 GPa L 400 W 100 D 8.0', [30, 400, 100, 8.0], ['9.600e+21', 8.59]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 32 GPa L 50 W 20 D 2.0', [32, 50, 20, 2.0], ['6.400e+19', 7.14]], ['mu 32 GPa L 400 W 100 D 8.0', [32, 400, 100, 8.0], ['1.024e+22', 8.61]], ['mu 32 GPa L 0.5 W 0.3 D 0.01', [32, 0.5, 0.3, 0.01], ['4.800e+13', 3.05]], ['mu 40 GPa L 1 W 1 D 0.05', [40, 1, 1, 0.05], ['2.000e+15', 4.13]], ['mu 40 GPa L 10 W 8 D 0.5', [40, 10, 8, 0.5], ['1.600e+18', 6.07]], ['mu 40 GPa L 50 W 20 D 2.0', [40, 50, 20, 2.0], ['8.000e+19', 7.2]]], [['mu 30 GPa L 1 W 1 D 0.05', [30, 1, 1, 0.05], ['1.500e+15', 4.05]], ['mu 30 GPa L 10 W 8 D 0.5', [30, 10, 8, 0.5], ['1.200e+18', 5.99]], ['mu 30 GPa L 50 W 20 D 2.0', [30, 50, 20, 2.0], ['6.000e+19', 7.12]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 40 GPa L 10 W 8 D 0.5', [40, 10, 8, 0.5], ['1.600e+18', 6.07]], ['mu 40 GPa L 0.5 W 0.3 D 0.01', [40, 0.5, 0.3, 0.01], ['6.000e+13', 3.12]], ['zero slip', [30, 10, 5, 0], None], ['negative width', [30, 10, -5, 1], None]], [['mu 30 GPa L 10 W 8 D 0.5', [30, 10, 8, 0.5], ['1.200e+18', 5.99]], ['mu 30 GPa L 0.5 W 0.3 D 0.01', [30, 0.5, 0.3, 0.01], ['4.500e+13', 3.04]], ['mu 32 GPa L 1 W 1 D 0.05', [32, 1, 1, 0.05], ['1.600e+15', 4.07]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 32 GPa L 50 W 20 D 2.0', [32, 50, 20, 2.0], ['6.400e+19', 7.14]], ['mu 32 GPa L 400 W 100 D 8.0', [32, 400, 100, 8.0], ['1.024e+22', 8.61]], ['mu 32 GPa L 0.5 W 0.3 D 0.01', [32, 0.5, 0.3, 0.01], ['4.800e+13', 3.05]], ['mu 40 GPa L 1 W 1 D 0.05', [40, 1, 1, 0.05], ['2.000e+15', 4.13]]], [['mu 30 GPa L 1 W 1 D 0.05', [30, 1, 1, 0.05], ['1.500e+15', 4.05]], ['mu 32 GPa L 10 W 8 D 0.5', [32, 10, 8, 0.5], ['1.280e+18', 6.0]], ['mu 40 GPa L 10 W 8 D 0.5', [40, 10, 8, 0.5], ['1.600e+18', 6.07]], ['mu 40 GPa L 50 W 20 D 2.0', [40, 50, 20, 2.0], ['8.000e+19', 7.2]], ['mu 40 GPa L 400 W 100 D 8.0', [40, 400, 100, 8.0], ['1.280e+22', 8.67]], ['mu 40 GPa L 0.5 W 0.3 D 0.01', [40, 0.5, 0.3, 0.01], ['6.000e+13', 3.12]], ['zero slip', [30, 10, 5, 0], None], ['negative width', [30, 10, -5, 1], None]]]
for label, args, expected in fixtures[N - 1]:
    check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
mu 30 GPa L 1 W 1 D 0.05['1.500e+15', 4.05]['1.500e+15', 4.05]Passed
mu 30 GPa L 10 W 8 D 0.5['1.200e+18', 5.99]['1.200e+18', 5.99]Passed
mu 30 GPa L 50 W 20 D 2.0['6.000e+19', 7.12]['6.000e+19', 7.12]Passed
mu 30 GPa L 400 W 100 D 8.0['9.600e+21', 8.59]['9.600e+21', 8.59]Passed
mu 30 GPa L 0.5 W 0.3 D 0.01['4.500e+13', 3.04]['4.500e+13', 3.04]Passed
mu 32 GPa L 1 W 1 D 0.05['1.600e+15', 4.07]['1.600e+15', 4.07]Passed
mu 32 GPa L 10 W 8 D 0.5['1.280e+18', 6.0]['1.280e+18', 6.0]Passed
mu 32 GPa L 50 W 20 D 2.0['6.400e+19', 7.14]['6.400e+19', 7.14]Passed

SHA-256 / 611bbcc7494d4d96677f08382f3038695897a06a5eabe5aff0f662980ec13bdc

Verification & scope

Stipulated deterministic teaching model of a seismological magnitude procedure; constants and tables are fixed by the contract and no claim of agency or standards conformance is made. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:48:29.251919+00:00.

Case digest / 2be416a28dc56d78ee30b001fb3970b291209386b9f0a459d3985cbabc8a7080