Verification & Validation

Every number, reproduced.

A number someone may build on must be right. This page mirrors the public verification record of KATAI 2D: each row cites its primary source, states its tolerance band and names the automated test that asserts it on every build. The benchmark inputs are plain .k2d files checked into the open repository — nothing here is hand-picked, and all of it can be rerun.

152automated tests in the suite
57declared verification cases
26benchmark .k2d files checked in
3oracle classes — closed form, independent path, published benchmark

How it is verified

The suite is the specification.

Three kinds of oracle are admitted: a closed-form solution, stated in full in the test; an independent computation path that shares no code with the solver; or a published benchmark, with the primary source cited. Self-consistency — the code agreeing with itself — does not count.

The verification matrix and its bibliography are generated from declarations inside the tests themselves, and a suite gate fails the build when they drift. Continuous integration rebuilds and runs the full suite on every push, on a configuration with no proprietary component — so every number below is reproducible from the public tree alone.

01 · Foundations & collapse

The sharpest test: limit loads.

Bearing capacity and stress distribution against the classical solutions — several of them run from benchmark files checked into the repository.

Benchmark Reference KATAI · error Automated test
Prandtl strip footing Nc (φ = 0), loaded past collapse from the checked-in file 2 + π = 5.142 (Prandtl 1921) +0.6% test_input_corpus
Prandtl Nc, structured tri15 mesh (120 elements) 2 + π +1.1% test_prandtl
Rigid strip footing on elastic soil — force at 10 mm settlement, via prescribed displacement and the reaction output Giroud (1972) 15.15 15.32  ·  +1.1% test_input_corpus
Smooth rigid circular footing, axisymmetric — limit pressure from the reaction output at a prescribed 0.35 m punch, from the checked-in file Cox (1962) slip-line 225.6 kPa; PLAXIS publishes 220.0 233.9 kPa  ·  +3.7% test_input_corpus
Strip footing on clay with strength increasing with depth (c = 1 + 2z) — limit pressure via the c/E depth profiles, from the checked-in file Davis & Booker (1973) 7.80 kPa; PLAXIS publishes 7.86 7.91 kPa  ·  +1.4% test_input_corpus
Strip load on incompressible Gibson soil (E = 299 z) — centreline settlement Gibson (1967); half-space 0.050 m, finite layer 0.047 m 0.0454 m  ·  −3.4% test_input_corpus
Boussinesq uniform strip load — σz at depth, from the checked-in file integrated Boussinesq closed form +0.9% … +1.4% test_input_corpus
Flamant line load — σz at depth, tri15, from the checked-in file Flamant (1892) +0.0% … +1.3% test_input_corpus

02 · Slopes & staged construction

Failure mechanisms and construction sequence.

Strength reduction against the published multi-method consensus, staged unloading against the closed form, and the K0 state to round-off.

Benchmark Reference Result Automated test
Griffiths & Lane (1999) Example 1 — the homogeneous 2:1 slope (c′/γH = 0.05, φ′ = 20°), FoS by φ‑c reduction from the checked-in file their FE 1.4; Bishop & Morgenstern (1960) charts 1.380 FoS 1.384  ·  +0.3% vs 1.380 test_input_corpus
Slope factor of safety by φ‑c reduction, run as the file’s initial procedure Griffiths & Lane (1999); Bishop 0.988, Spencer 0.987, Phase2 T6 0.997 FoS 1.010  ·  +2.1% vs 0.99 test_input_corpus
Staged excavation — pit-floor heave and base total stress after deactivating a layer 1D elastic unloading closed form +0.0% / −0.0% test_input_corpus
K0 procedure on a submerged block — effective stresses, pore pressure, residual displacement geostatic equilibrium; Terzaghi effective stress ~5×10−13 kPa residual test_input_corpus

03 · Groundwater flow & consolidation

Seepage and time, verified.

Free-surface flow against the exact discharge theorem, and time-dependent consolidation against the Terzaghi series — from checked-in inputs.

Benchmark Reference Result Automated test
Unconfined rectangular dam with a seepage face — discharge Charny (1951) exact theorem: q = k(h1²−h2²)/2L +1.02%  ·  mass balance 8×10−14 test_input_corpus
Terzaghi 1D consolidation — U(Tv) at Tv = 0.2 / 0.4 / 0.6 / 0.9, from the checked-in file Terzaghi (1943) series −1.2% … −0.4% test_input_corpus
Undrained (A) confined column — settlement and mid-column effective stress Skempton 1D closed form +0.0% / +0.0% test_input_corpus
Terzaghi 1D consolidation — degree of consolidation U against time factor Tv
0 25 50 75 100 0.00.51.01.52.0 Time factor Tₕ Consolidation U (%)
Terzaghi series (analytical) KATAI 2D v0.8.0 wheel, from the checked-in file

04 · Seismic dynamics

Shaking, against closed forms and a real record.

Resonance against the damped shear-column solution, and a checked-in El Centro 1940 digitisation whose identity and response spectrum are pinned against the published values — the accelerogram travels inside the benchmark file.

Benchmark Reference Result Automated test
Resonant column at f1 = Vs/4H — peak |u| and |a| at the surface damped SH closed form (Kramer 1996, ch. 7) −0.6% / −0.2% test_input_corpus
El Centro 1940 NS record identity — PGA and timing of the shipped digitisation published PGA ≈ 0.319 g at t ≈ 2 s 0.31882 g at 2.02 s test_real_record
El Centro 5%-damped response spectrum — peak amplification and long-period ordinate published band: peak Sa/PGA in 2.0–3.5; Sa(3 s) small 2.87× at 0.19 s  ·  Sa(3 s) 0.118 g test_real_record
Two-layer compliant-base site response, the record travelling inside the .k2d file the verified path’s surface response reproduced within 5% test_input_corpus

05 · Published validation cases

Documented cases, reproduced from scratch.

The PLAXIS 2D Validation Manual (Version 8, Bentley Systems) publishes analytic references alongside its own results for a set of canonical problems. Four of those cases are rebuilt from their problem statements and asserted inside the suite — against the analytic solution first, the published finite element value second. All four are also reproduced in depth on a dedicated page: problem statements, formulas, result tables, CLI transcripts and the address of every artefact.

Benchmark Reference KATAI · error vs analytic / published Automated test
§2.1 — Smooth rigid strip footing on elastic soil [kN/m] Giroud (1972) 15.15  ·  PLAXIS 15.24 15.35  ·  +1.4% / +0.8% test_plaxis_validation
§2.2 — Strip load on incompressible Gibson soil [m] Gibson (1967) 0.050 (half-space)  ·  PLAXIS 0.047 (finite layer) 0.0451  ·  −4.0% test_plaxis_validation
§3.1 — Bearing capacity of a smooth circular footing, axisymmetric [kPa] Cox (1962) 225.6  ·  PLAXIS 220.0 234.4  ·  +3.9% test_plaxis_validation
§3.2 — Strip footing on clay with strength increasing with depth [kPa] Davis & Booker (1973) 7.80  ·  PLAXIS 7.86 8.02  ·  +2.8% test_plaxis_validation

Stated plainly, as the record states it: the circular-footing case over-predicts by +3.9% at the fine mesh and +9% at the coarse one (two elements across the radius) — the mesh sensitivity is recorded in the matrix, in the same place as the agreement. All four cases also run end to end from checked-in .k2d files through the command line (+1.1%, −3.4% against the finite-layer PLAXIS value, +3.7% and +1.4% on the files’ own meshes) — see the four cases, input for input, or the write-ups in the repository: the comparison document and three published benchmarks, end to end.

06 · Independent numerics

The machinery, cross-examined.

Below the physics: the linear algebra and the material registry are checked against oracles that share no code with them.

Benchmark Reference Result Automated test
Sparse solves (every backend) against dense FullPivLU on an independent path no shared code, different storage layout 4.4×10−16 test_linsolve
Material registry — every constructed field, per model and drainage class the former inline construction, duplicated verbatim bitwise equal test_material_registry

07 · One contract, every front end

The CLI, Python and the engine agree — bit for bit.

The suite pins the script-built project against the checked-in .k2d byte for byte, and the CLI’s results file against the in-process solve bit for bit. The packaged artifacts are held to the same standard before release.

Measured on the published v0.8.0 artifacts in a clean environment: the wheel installs into a fresh virtual environment, with PYTHONPATH and the DLL search path scrubbed, and the shipped examples reproduce their verification bands there — slope FoS 1.010, Terzaghi |UFEM − Useries| ≤ 0.0061 at the sampled times, staged-excavation heave +0.00% against the closed form, and an anchored excavation built entirely through prj.structures — a diaphragm wall with interfaces on both faces and a prestressed anchor row — holding its own invariants. That last one is a release gate rather than a demonstration: a wheel whose documented API is absent from the build someone downloads passes an import check and fails the first real job, so the gate runs the real job. The release CLI solves the slope corpus case — a safety analysis driven to failure — in about 11 s on a desktop CPU with the vendored Eigen backend, no proprietary component involved.

Rerun it yourself. All of it.

The matrix, the bibliography and every benchmark input on this page are in the open repository — and the suite that asserts them runs on every push.