Module: vernastruct.modules.foundations.service.FoundationDesignService
Code basis: Meyerhof's effective-area method for eccentric loading
(B′ = B − 2e, kern limit e ≤ B/6); applied pressure vs presumptive allowable
bearing pressure (FS = 3 already included in the soil library values);
simplified elastic settlement Δ = q_net·B·Iw / E_s.
Status: ✅ PASS — software matches hand calculation exactly after fixing a
defect this case uncovered (see §5).
A square pad footing under a heritage building column, on medium dense sand, carries a vertical service load with a moment (e.g. from roof eccentricity or lateral action), engaging Meyerhof's effective-width method.
| Input | Symbol | Value |
|---|---|---|
| Footing type | — | Pad (isolated) |
| Width | B | 1.50 m |
| Length | L | 1.50 m |
| Embedment depth | Df | 0.80 m |
| Soil | — | Medium Dense Sand (library) |
| Allowable bearing pressure | q_all | 200 kPa (presumptive, FS = 3) |
| Soil modulus | E_s | 35 MPa |
| Vertical service load | P | 25.0 t |
| Moment | M | 2.50 t·m |
Module conventions (documented, matched in the hand calc): tonne → kN with 9.81; settlement influence factor Iw = 0.82 (flexible rectangular); soil unit weight 18 kN/m³ for overburden relief; settlement computed on the full width B (not B′); settlement limit 25 mm (heritage default); eccentricity assumed in the B direction only.
Eccentricity (kern check):
e = M / P = 2.50 / 25.0 = 0.1000 m
e_limit = B/6 = 1.50 / 6 = 0.2500 m → e within kern ✓ (no uplift)
Bearing (Meyerhof effective area):
B′ = B − 2e = 1.50 − 0.20 = 1.30 m ; L′ = L = 1.50 m
A′ = 1.30 × 1.50 = 1.95 m²
P = 25.0 × 9.81 = 245.25 kN
q = P / A′ = 245.25 / 1.95 = 125.7692 kPa
util = 125.7692 / 200 = 0.62885 ← governs
Elastic settlement:
q_net = q − γ·Df = 125.7692 − 18 × 0.80 = 111.3692 kPa
Δ = q_net × B × Iw / E_s = 111.3692 × 1.50 × 0.82 / 35 000 kPa
= 3.9138 mm ≤ 25 mm ✓
| Check | Hand calc | Software (FoundationDesignService) |
Match | Pass? |
|---|---|---|---|---|
| Eccentricity e | 0.1000 m | 0.1000 m | ✅ exact | ≤ 0.25 → PASS |
| Applied pressure q | 125.7692 kPa | 125.7692 kPa | ✅ exact (after fix, §5) | — |
| Bearing utilization | 0.62885 | 0.62885 | ✅ exact | ≤ 1.0 → PASS |
| Settlement Δ | 3.9138 mm | 3.9138 mm | ✅ exact | ≤ 25 → PASS |
Bearing governs at 63% utilization — a sensible working level for a serviceably loaded heritage column footing.
Documented limitations: allowable pressure is presumptive (from the soil library, not computed from φ/c via the full Meyerhof N-factor equation); settlement is a one-layer elastic estimate; eccentricity in one direction only. Real projects require a geotechnical report — stated in the soil library header and the report disclaimer.
from vernastruct.modules.foundations.models import FoundationInput
from vernastruct.modules.foundations.service import FoundationDesignService
result = FoundationDesignService().design(FoundationInput(
type="pad", width_m=1.50, length_m=1.50, depth_m=0.80,
soil_id="medium_sand",
vertical_load_ton=25.0, moment_ton_m=2.50,
))
assert result.ok
Pinned as
tests/test_verification_cases.py::test_vc04_meyerhof_pad_footing.
The first run of this hand calculation exposed a units defect in
foundations/service.py, in the pad branch only: the applied pressure was
computed as (P [kN] × 1000) / A [m²], yielding Pa, but treated as
kPa — overstating the applied bearing pressure by a factor of 1000
(software reported q = 125 769 kPa against the correct 125.77 kPa). The error
was in the conservative direction — any realistic pad footing would fail the
bearing check — but it made the pad option unusable, and it dragged the
settlement estimate up by the same factor. The strip branch was and is
correct (kN/m ÷ m = kPa). Every pre-existing unit test used type="strip",
so the pad branch had never been numerically exercised.
Fix (2026-07-09): pad pressure corrected to q = P [kN] / A′ [m²] (kPa
directly); all 73 tests pass and the exact-match comparison above is post-fix.
Together with VC-03 (walls, 1000× in the opposite direction), this is the second units defect caught by the verification library in two consecutive cases — hand-calculation cross-checking is doing exactly the job the roadmap assigned to it.
Every case in this manual is pinned as an automated regression test that runs on every build — no future change can silently break a verified result. © 2026 Hesham Salama.