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 |
| The same Example 1 on a nested mesh family of 142, 568 and 2272 elements — how far the factor moves with the mesh | grid-convergence procedure (Celik et al. 2008) | 1.4210 → 1.3867 → 1.3645 · band ±3.7% | test_slope_fos_convergence |
| 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 |
| Partial stage, ΣMstage = 1 / 0.5 / 0.25 on a linear soil — proportionality of the response | linear superposition | to 10−12 | test_staged_options |
| 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 |
| Consolidation phase asked to stop at 90% degree of consolidation — the time it stops | closed form: 14.566 day | 14.776 day · +1.45% | test_consolidation_stop |
| Drain line in a confined aquifer — drawdown and extracted discharge | Dupuit–Forchheimer 1D closed form | −0.00% / +0.00% | test_wells_drains |
| Flow across a semi-permeable barrier — discharge | Darcy in series | −0.10% / −0.15% | test_flow_barrier |
| Lowering the water table in a staged phase — settlement | Terzaghi effective stress, closed form | +0.01% | test_phase_water |
Constitutive models
Each soil and rock model, on a problem with a known answer.
Hardening Soil, HS small, Soft Soil, Soft Soil Creep and Hoek–Brown, each through the whole path from a project file to a boundary value problem — with the equations they are checked against.
| Benchmark | Reference | Result | Automated test |
|---|---|---|---|
| Hardening Soil oedometer column, 50 → 200 kPa — settlement, from the checked-in file | the Eoed power law, integrated in closed form | −0.93% | test_input_corpus |
| HS small — heave of an excavated floor at three points of the stiffness-degradation curve | inverted secant law (Santos & Correia 2001) with Masing’s rule | −0.14% / −0.30% / −0.72% | test_input_corpus |
| Soft Soil oedometer — primary loading, swelling and reloading over the same stress range | λ* and κ* logarithmic laws | −0.01% / −1.01% / −1.63% | test_input_corpus |
| Soft Soil Creep column — settlement after 100 days at constant load | μ* ln(1 + t/τ) H = 0.018460 m | +1.81% | test_input_corpus |
| Hoek–Brown — circular tunnel under 28 MPa, radial stress through the plastic annulus and the elastic field | closed-form elasto-plastic solution (Carranza-Torres & Fairhurst 1999) | 0.59% · 0.72% | test_hoek_brown_tunnel |
| Hoek–Brown — triaxial plateau from a project file at two cell pressures | the 2002 criterion | −0.0000% | test_hoek_brown_gui |
| Mohr–Coulomb dilatancy cut-off — volumetric strain at which dilation stops | ln((1+emax)/(1+einit)) = 0.018576 | 0.018635 · then isochoric to 10−16 | test_dilatancy_cutoff |
| Undrained (A) against Undrained (C) for one soil — ratio of settlements | 2(1 + νu)/3, exact | +0.00% at three νu | test_undrained_c |
| Two-layer undrained column, νu below and Skempton B above | closed form per layer | +0.00% on four quantities | test_undrained_stiffness |
Structural elements
Walls, anchors, piles and reinforcement.
Every structural element verified on a problem small enough to have an exact answer, then used unchanged in the full model.
| Benchmark | Reference | Result | Automated test |
|---|---|---|---|
| Two beams in bending — mid-span deflection and peak moment from one run | beam theory; published 50 kNm | −0.000% · +0.00% / +1.04% | test_input_corpus |
| Prestressed anchor locked off at 500 kN on a stiff block | equivalent point load, independent path | 499.919 kN · 0.016% | test_anchor_prestress |
| Block sliding on an interface — horizontal failure force | Coulomb joint closed form | −0.59%, converging with refinement | test_input_corpus |
| Pile row loaded far above its capacity — axial force at the head | skin + base capacity | 600.0000 kN/m · −0.00% | test_input_corpus |
| Geogrid in tension, and the cut-off it stops at | plane-strain closed form | 2.000000 kN/m · +0.000% | test_input_corpus |
| Plate, anchor and geogrid at the end of a consolidation phase | the same model solved as a drained phase | moment 21.621032 = 21.621032 kNm/m | test_consolidation_structures |
| Raft in a fully coupled phase, saturated limit | the consolidation phase and the drained reference | +0.00000% | test_fully_coupled_structures |
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 |
| Grid Convergence Index — observed order and Richardson extrapolation on manufactured triplets | φ = φexact + C hp (Roache 1994; Celik et al. 2008) | to 10−14 | test_grid_convergence |
| Time-step refinement of the Terzaghi column — observed order of the scheme | backward Euler: 1 | 0.985 / 0.992 · band ±0.25% | test_phase_numerics |
| Factor of safety against the tolerated force residual, 10−3 … 10−8 | independence of the stopping rule | 1.421021, bit-identical | test_tolerance_independence |
| Hardening Soil oedometer against the number of load increments, 10 → 160 | independence of the load path | 0.020% | test_phase_numerics |
| Local against global convergence error when only the global criterion is enforced | the stress-point error of the constitutive law | factor 63 000 · 0.0048% with both | test_convergence_criteria |
| Mesh quality — minimum angle of every generated element against the 20° bound | Ruppert (1995) termination guarantee | bound met and reported | test_mesh_quality_signal |
| No input dropped in silence — one perturbed field per diagnostic, with equilibrium of what remains | the same problem drawn where the mesh takes it | exact on code · 10−13 on equilibrium | test_no_silent_drop |
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.9.0 artifacts in a clean environment: the wheel installs
into a fresh virtual environment, Python runs isolated from the user’s paths,
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 8 s on a 2017 laptop 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.