How we verify OGR Slip2D
Before relying on a factor of safety, you need some evidence that the program behind it calculates correctly. We validate OGR Slip2D against published cases, closed-form solutions and analytic identities. Stored snapshots of the program's own output are not used as references, because a snapshot would preserve any bug present when it was taken.
What counts as a reference
Methods, solvers and formulas are all checked against results that the program did not produce. Four kinds of reference are accepted; a recording of today's output is not one of them.
Published cases
Factors of safety from comparative surveys, papers and reference manuals, stored with their source and a tolerance of their own.
Closed-form solutions
For the groundwater engine: Darcy flow, layered media and the error-function response to a step change in head.
Analytic identities
Results that must hold exactly. For example, active and passive support forces coincide when the target factor is 1.0.
Consistency
A long transient has to reproduce the steady state, and a mesh has to keep the area of its region.
A failing case is not edited to make it pass. The fault is either in the code or in the expected value, and the case is there to find out which. Each case carries its own tolerance, set by the quality of its source: a value read off a figure cannot be held to the precision of a tabulated one.
Results of the seven published cases
The repository holds each case with its model, its expected values and their source, and the test suite runs all of them. The values below were recomputed with OGR Slip2D 0.1.235, running each case the same way the suite does.
| Case | What it checks | Method | Reference | OGR Slip2D | Difference | Tolerance |
|---|---|---|---|---|---|---|
| ACADS 1(a) Giam & Donald (1989) | The grid search finds the critical circle; homogeneous slope, total stress. Reference: mean of 33 programs. | Bishop | 0.991 | 0.9885 | −0.25 % | 2.0 % |
| Janbu corrected | 0.991 | 0.9897 | −0.14 % | |||
| Yamagami & Ueta (1988) | Two methods at once, so the difference between them is checked as well. | Bishop | 1.348 | 1.3502 | +0.16 % | 1.5 % |
| Ordinary | 1.282 | 1.2852 | +0.25 % | |||
| ACADS 1(c) Giam & Donald (1989) | Three layers: regions and material assignment. Reference: Bishop mean of 16 programs. | Bishop | 1.406 | 1.4083 | +0.16 % | 1.5 % |
| Arai & Tagyo (1985), ex. 1 | A 20 m slope at 1V:1.5H. | Bishop | 1.451 | 1.4123 | −2.67 % | 3.5 % |
| Arai & Tagyo (1985), ex. 3 | The same slope with a water table, which isolates the effect of pore pressure. | Bishop | 1.138 | 1.1200 | −1.58 % | 2.5 % |
| Reinforcement example (1999) | The minimum-depth surface filter reaches the engine. | Bishop | 0.764 | 0.7660 | +0.26 % | 1.0 % |
| ACADS 2(b), Talbingo dam Giam & Donald (1989) | The methods alone, on the circle the problem states. Bishop against its 11-program mean; the rigorous methods against the referee value. | Bishop | 2.204 | 2.2088 | +0.22 % | 2.0 % |
| Spencer | 2.29 | 2.2918 | +0.08 % | |||
| GLE / Morgenstern–Price | 2.29 | 2.3019 | +0.52 % | |||
| Janbu corrected | 2.073 | 2.0739 | +0.05 % |
Differences are computed from the unrounded factors of safety.
Modern reanalyses of both Arai & Tagyo examples agree with each other and give values about 2–3 % below those published in 1985. A search in 1985 used fewer slices and fewer circles, and a finer search finds a lower minimum. The cases keep the published value, with a tolerance that covers that known gap, so they still catch a gross regression without treating the source as more precise than it is.
Corps of Engineers #1 and #2 are checked slice by slice against the worked example in Appendix G of USACE EM 1110-2-1902, whose tables give the interslice forces and the normal forces on the slice bases. The test suite contains further checks of the methods on given surfaces.
Checks with a known exact answer
The groundwater engine and several tools are checked against results whose exact value is known. The last column gives the difference from that value in each check.
| What | Check | Result |
|---|---|---|
| Confined seepage | Closed-form Darcy solution | 0.000 % |
| Layered media | Harmonic and arithmetic averages of conductivity | 0.000 % |
| Anisotropy | Patch test with Kxy ≠ 0 | machine precision |
| Transient seepage | Error-function response to a step in head | 0.11 % |
| Transient at long time | Must reproduce the steady state | 0.0000 m |
| Finite-element mesh | Area equals the area of the region, at every refinement | exact |
| Back analysis of support force | Active and passive forces coincide at a target factor of 1.0 | exact |
| Hoek–Brown parameters | GSI = 100, D = 0 gives mb = mi, s = 1, a = 0.5 | exact |
| DXF round trip | Same area, vertices on the originals | < 10⁻⁶ |
Rapid drawdown also reproduces the classical result, although nothing in the model imposes it: the factor of safety is lowest just after the water level drops, and it recovers as the pore pressures dissipate.
How the 5 265 tests are organised
- There is one test file per feature area, and its header states which invariant it protects and why.
- Each configurable setting has a test that checks it changes the result.
- Tests restore any state they change, such as the language, the units or the caches. Otherwise unrelated tests could fail, and only when the whole suite is run.
- The full suite runs before each release. A filtered run says so in its output and does not count as evidence for a release.
- Continuous integration runs on Python 3.11, 3.12 and 3.13 and also checks the licence header of every file.
Contributing a validation case
For us, the most useful contribution is a validation case: a slope whose factor of safety you know from a publication or a hand calculation, together with its source.