mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-07-12 13:29:04 +00:00
An uninsulated stone wall of lodged thickness, age bands A-E, is billed by the RdSAP 10 §5.6 Table-12 formula on its measured thickness — sandstone / limestone U = 54.876·W^-0.561, granite / whinstone U = 45.315·W^-0.513. Two bugs suppressed it: 1. CAP: the as-built branch capped the formula result at the Table-6 typical-thickness default (`if u0 >= 1.7: return 1.7`). But the formula only dips below 1.7 past ~488 mm (sandstone) / ~640 mm (granite), so the cap nullified §5.6 for essentially every real-thickness stone wall, under-counting fabric loss and over-rating. A measured 400 mm sandstone age-B wall is 1.90 (Elmhurst-confirmed), not 1.70. 2. NO INSULATION-STATE GATE: the branch fired for any stone wall with a lodged thickness, including ones whose insulation is "Unknown". RdSAP treats an unknown-insulation wall via the Table-6 typical-thickness default, NOT as bare stone of the lodged thickness — so a 50 mm granite wall with Unknown insulation must read 1.70 (worksheet), not the formula's 6.09. Gated on `wall_insulation_type is not None`. Fixes the 2 long-standing stone-U unit tests (granite 120 mm → 3.8871, sandstone 120 mm → 3.7408 — they were correct red tests, not "known fails"). Corpus within-0.5 70.3% -> 71.6% (MAE 0.833 -> 0.822); ratcheted floors to 0.71 / 0.83. Worksheet fixture 000565 (granite 50 mm Unknown → 1.70) still passes via the insulation gate. The two stone groups (sandstone/limestone vs granite/whinstone) keep their distinct §5.6 coefficients. pyright not installed in this codespace (strict gate not run locally). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| tests | ||
| __init__.py | ||
| demand.py | ||
| ecf.py | ||
| envelope.py | ||
| rdsap_uvalues.py | ||
| sap_efficiencies.py | ||
| schema.py | ||
| transform.py | ||
| ucl.py | ||
| ventilation.py | ||