Module: vernastruct.modules.walls.service.WallDesignService
Code basis: SBC 902-2024 §806 (unburned clay masonry / adobe), TMS 402 simplified
axial capacity, ASCE 41 / ICOMOS ISCARSAH damage-factor capacity reduction,
SBC 902-2024 §705.2 heritage lateral-load reduction.
Status: ✅ PASS — software matches hand calculation exactly after fixing a
defect this case uncovered (see §5).
An existing single-storey adobe bearing wall in moderate condition carries a roof line load and a wind pressure. This case exercises the full heritage chain: damage-factor reduction, the §705.2 lateral reduction, the §806.3 H/t limit, and (by confirming it is not binding) the §806.7 shear cap.
| Input | Symbol | Value |
|---|---|---|
| Wall length | L | 4.00 m |
| Wall height | h | 3.00 m |
| Wall thickness | t | 0.55 m |
| Material | — | Mud brick / Adobe (regional handmade) |
| Compressive strength | f_m | 0.12 MPa (field rupture testing, 2024) |
| Shear strength | f_v | 0.07 MPa |
| Design state / damage | — | Existing / Moderate |
| Damage reduction factor | k_d | 0.75 (ASCE 41 / ISCARSAH) |
| Axial line load (roof) | p | 0.80 t/m |
| Wind pressure (SBC 301 basis) | w | 0.50 kPa |
| Heritage lateral reduction | — | §705.2 → 75% applied |
| Storeys | — | 1 (H/t ≤ 6 per §806.3) |
| Moisture protection | — | Provided (§806.2 satisfied) |
Unit convention: the walls module converts kN → tonne with 9.81 kN/t
(hardcoded in service.py), not core.units.TON_TO_KN = 9.80665. Hand-calc
tonne values below use 9.81 to match. Utilization ratios are unaffected
(the factor cancels). Unifying this convention is a known cleanup item.
Effective strengths (damage factor k_d = 0.75):
f_m,eff = 0.12 × 0.75 = 0.09 MPa
f_v,eff = 0.07 × 0.75 = 0.0525 MPa
§806.7 cap check: 0.0525 MPa < 0.0827 MPa → cap NOT binding ✓
Slenderness (§806.3, single storey):
h/t = 3.00 / 0.55 = 5.45455 ≤ 6 → OK
Axial (TMS 402 simplified):
A = L t = 4.00 × 0.55 = 2.20 m²
P_cap = 0.80 f_m,eff A (1 − (h/(40t))²)
= 0.80 × 0.09e6 × 2.20 × (1 − (3.00/22.0)²)
= 158 400 × 0.981405 = 155 454.5 N = 155.455 kN = 15.8465 t
P = p L = 0.80 × 4.00 = 3.20 t
util = 3.20 / 15.8465 = 0.20194 ← governs
Out-of-plane bending (per metre width, applied wind = 0.50 × 0.75 = 0.375 kPa):
M = w h²/8 = 0.375 × 3.00²/8 = 0.421875 kN·m/m = 0.0430046 t·m/m
S = t²/6 = 0.55²/6 = 0.0504167 m³/m
M_cap = f_m,eff × S = 90 kPa × 0.0504167 = 4.5375 kN·m/m = 0.4625382 t·m/m
util = 0.421875 / 4.5375 = 0.09298
In-plane shear:
V = w (h/2) L = 0.375 × 1.50 × 4.00 = 2.25 kN = 0.2293578 t
V_cap = f_v,eff A = 52.5 kPa × 2.20 = 115.50 kN = 11.77370 t
util = 2.25 / 115.50 = 0.01948
| Check | Hand calc | Software (WallDesignService) |
Match | Pass? |
|---|---|---|---|---|
| Slenderness h/t | 5.45455 | 5.45455 | ✅ exact | ≤ 6 → PASS |
| Axial P_applied | 3.20000 t | 3.20000 t | ✅ exact | — |
| Axial P_capacity | 15.8465 t | 15.8465 t | ✅ exact | util 0.202 → PASS |
| Bending M_applied | 0.0430046 t·m/m | 0.0430046 t·m/m | ✅ exact | — |
| Bending M_capacity | 0.4625382 t·m/m | 0.4625382 t·m/m | ✅ exact (after fix, §5) | util 0.093 → PASS |
| Shear V_applied | 0.2293578 t | 0.2293578 t | ✅ exact | — |
| Shear V_capacity | 11.77370 t | 11.77370 t | ✅ exact | util 0.019 → PASS |
| §806.7 shear cap | not binding | adobe_shear_cap_applied=False |
✅ | — |
| §705.2 reduction | 0.375 kPa | lateral_reduction_applied=True |
✅ | — |
Axial compression governs at 20% utilization — a healthy margin typical of massive adobe walls, where slenderness and moisture, not stress, are the real constraints.
from vernastruct.modules.walls.models import WallInput
from vernastruct.modules.walls.service import WallDesignService
result = WallDesignService().design(WallInput(
design_state="Existing", existing_damage="Moderate",
length_m=4.0, height_m=3.0, thickness_m=0.55,
material_id="mud_brick",
axial_load_ton_per_m=0.80, lateral_load_kPa=0.50,
moisture_protection_provided=True,
))
assert result.ok
Pinned as
tests/test_verification_cases.py::test_vc03_adobe_wall_compression.
The first run of this hand calculation exposed a units defect in
walls/service.py: the out-of-plane bending capacity was computed as
f_m [MPa] × 1e6 × S [m³/m], which yields N·m/m, but the value was
treated as kN·m/m — overstating bending capacity by a factor of 1000
(software reported M_cap = 462.5 t·m/m against the correct 0.4625 t·m/m).
The error was in the unconservative direction: the out-of-plane bending check
could never realistically fail. The pre-existing unit test only asserted
M_capacity > 0 and could not catch it.
Fix (2026-07-09): conversion corrected to f_m × 1e3 × S (kPa × m³ = kN·m);
all 72 tests pass and the exact-match comparison above is post-fix. The
in-plane shear path was checked for the same class of error and is correct.
This is precisely why the verification library exists — and why every case is pinned as a regression test.
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.