mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
feat(modelling): shared gross heat-loss wall area geometry helper
domain/building_geometry.gross_heat_loss_wall_area(epc, identifier) sums heat_loss_perimeter x room_height across a building part's storeys — the heat-loss wall area (party walls excluded by construction), not total wall area. Lives outside the calculator so Modelling cost quantities can reuse it; the calculator computes the same quantity inline today and should be DRY'd onto this later (coordinated with the calculator branch). Pinned at 45.93 m^2 against the 000490 MAIN part. Toward #1155 cost (behaviour 4). pyright strict clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
214b38ff78
commit
0ba0575877
2 changed files with 55 additions and 0 deletions
33
domain/building_geometry.py
Normal file
33
domain/building_geometry.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
"""Building geometry derived purely from an EpcPropertyData.
|
||||
|
||||
Reusable outside the SAP calculator (e.g. for Modelling cost quantities).
|
||||
Today this re-derives the heat-loss wall area; the calculator computes the
|
||||
same quantity inline (`heat_transmission._part_geometry`). A later, calculator-
|
||||
branch-coordinated refactor should DRY the two onto this module so there is a
|
||||
single source of truth. See the project memory on calculator geometry.
|
||||
"""
|
||||
|
||||
from datatypes.epc.domain.epc_property_data import (
|
||||
BuildingPartIdentifier,
|
||||
EpcPropertyData,
|
||||
)
|
||||
|
||||
|
||||
def gross_heat_loss_wall_area(
|
||||
epc: EpcPropertyData, identifier: BuildingPartIdentifier
|
||||
) -> float:
|
||||
"""Gross external wall area of one building part, in m^2: the sum over its
|
||||
storeys of heat-loss perimeter x room height. This is the heat-loss area
|
||||
(party walls are excluded — they are not on the heat-loss perimeter); it is
|
||||
not netted of window/door openings.
|
||||
"""
|
||||
part = next(
|
||||
candidate
|
||||
for candidate in epc.sap_building_parts
|
||||
if candidate.identifier is identifier
|
||||
)
|
||||
area = sum(
|
||||
fd.heat_loss_perimeter_m * fd.room_height_m
|
||||
for fd in part.sap_floor_dimensions
|
||||
)
|
||||
return round(area, 2)
|
||||
22
tests/domain/test_building_geometry.py
Normal file
22
tests/domain/test_building_geometry.py
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
"""Behaviour of shared building geometry derived from EpcPropertyData —
|
||||
reusable outside the SAP calculator (e.g. for Modelling cost quantities)."""
|
||||
|
||||
from datatypes.epc.domain.epc_property_data import BuildingPartIdentifier
|
||||
from domain.building_geometry import gross_heat_loss_wall_area
|
||||
from tests.domain.sap10_calculator.worksheet._elmhurst_worksheet_000490 import (
|
||||
build_epc,
|
||||
)
|
||||
|
||||
|
||||
def test_gross_heat_loss_wall_area_sums_perimeter_times_height_per_storey() -> None:
|
||||
# Arrange
|
||||
# 000490 MAIN: floor 0 (perimeter 7.42 m x height 2.95 m) + floor 1
|
||||
# (7.42 m x 3.24 m) = 21.889 + 24.0408 = 45.93 m^2. Party walls are
|
||||
# excluded by construction (heat-loss perimeter, not total perimeter).
|
||||
epc = build_epc()
|
||||
|
||||
# Act
|
||||
area: float = gross_heat_loss_wall_area(epc, BuildingPartIdentifier.MAIN)
|
||||
|
||||
# Assert
|
||||
assert abs(area - 45.93) <= 0.01
|
||||
Loading…
Add table
Reference in a new issue