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.
.k2d files checked inHow 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 |
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.