B6 Operational Energy and Carbon — Module Specification¶
Module spec — domains/energy and lca.b6
Scope: The calculation kernel, climate-data pipeline, spatial interpolation, and carbon
conversion for EN 15978 module B6 (operational energy use), for earth-based construction in
Sub-Saharan Africa. Companion to climate data licence clearance,
which settled which sources may be used; this document settles what is computed with them.
Standards chain: ISO 14040/14044 → EN 15804+A2 → EN 15978 module B6, with EN ISO 52016-1,
EN ISO 13786, ISO 6946, ISO 10456 and EN 16798-1 as the calculation standards.
Date: 2026-08-29
Status: Implementation-ready design specification. No code exists yet — domains/energy,
domains/thermal and lca.b6 are five-line scaffolds. Nothing here is a migration; it is the
shape of a from-scratch build (AR-60).
Conventions: NORMATIVE statements use shall / must. INFORMATIVE statements use
should / may / note. Symbols are defined at first use and collected in §10.
Not a design tool. This is a limited operational-carbon engine carrying the
"simplified — indicative" disclaimer of PROJECT.md decision #17.
See §1.4 for exactly what that disclaimer now excludes.
TL;DR¶
- The kernel is EN ISO 52016-1 (hourly), not ASHRAE RTS/Heat-Balance — and the deciding argument is the functional unit, not accuracy. RTS is a design-day peak-load procedure: ASHRAE Handbook—Fundamentals (2021) Ch. 18 states it "is suitable for peak design load calculations, but it should not be used for annual energy simulations due to its inherent limiting assumptions." B6 is an annual energy figure (kWh/m²·a) under EN 15978. EN ISO 52016-1 is a whole-year 8760-hour dynamic method that answers that question natively and sits inside the same EPB standards family that underpins EN 15978. RTS answers a different question well; it is the wrong question for B6.
- Both candidate methods were already licence-cleared, so licence did not decide this. The climate-data licence clearance cleared RTS/CTF coefficients computed from first principles and an independently implemented EN ISO 52016-1. The choice between them is therefore made on fitness-for-purpose alone — which is why it needed its own determination rather than falling out of the clearance.
- NASA POWER climatology is vendored as versioned local data, not fetched live (decision D-ENERGY-01, §2.5). Deterministic regression fixtures require byte-stable inputs; a live API can change values between POWER releases or be unavailable, and either would make the test suite non-deterministic. An explicitly-invoked refresh path writes a new provenance-stamped artefact rather than mutating results silently.
- Two grids, not one. NASA POWER serves meteorology at 0.5° × 0.625° (MERRA-2) and radiation at 1° × 1° (CERES/SRB). Each parameter is interpolated on its own grid; mixing them is a defect (§3.2).
EF_gridis unset by default and the engine refuses to emit a carbon number without it (§4.11). Thermal and electricity figures are still produced. Same discipline as the A5 site-energy blocker — a missing factor is loud, never a default.- Two worked fixtures on real retrieved values prove the design is not tuned to one climate: Dakar (coastal hot-humid) ≈ 134 kWh/m²·a thermal, ≈ 22 kgCO2e/m²·a; Ouagadougou (Sahelian hot-dry) ≈ 245 kWh/m²·a thermal, ≈ 45 kgCO2e/m²·a.
§1 Method decision — EN ISO 52016-1 (hourly)¶
1.1 Decision [NORMATIVE]¶
The energy kernel shall implement the EN ISO 52016-1:2017 simplified hourly (8760-step)
calculation method for sensible energy need for heating and cooling, per thermal zone. ASHRAE
RTS / Heat-Balance shall not be the primary annual-energy kernel.
1.2 Why not RTS — the functional unit decides it¶
The two methods answer different questions. RTS answers "what is the peak design cooling load (kW) for equipment sizing?". EN ISO 52016-1 answers "what is the annual energy need for heating and cooling (kWh/a)?". Only the second is EN 15978 module B6. That is dispositive, and it closes the method question opened by AR-60.
| Criterion | EN ISO 52016-1 (hourly) | ASHRAE RTS / Heat-Balance |
|---|---|---|
| Fit for the B6 functional unit | Native output is annual energy need for heating and cooling (kWh/a) over 8760 h. Direct match to EN 15978 B6. | A design-day peak cooling load procedure. ASHRAE Handbook—Fundamentals (2021) Ch. 18: it "is suitable for peak design load calculations, but it should not be used for annual energy simulations due to its inherent limiting assumptions." Wrong functional unit for B6. |
| Standards coherence | Part of the EPB suite (EN ISO 52000-1 / 52017-1) that underpins EN 15978; harmonised zoning and boundary-condition definitions. | US design-sizing lineage; not aligned to the EN 15978 / EN 15804 chain. |
| Thermal mass / dynamic response | Per-element RC node network — multiple capacitance nodes per opaque element — captures decrement and time lag of massive earth walls hour by hour. | Captures mass via 24-h periodic response factors plus radiant time factors: dynamic, but only for a repeating design day, not a full annual weather series. |
| Heating and cooling in one engine | Yes — necessary for highland SSA sites (Nairobi, Addis Ababa) that need both. | Cooling-load focused; a separate heating method would be required. |
| Implementation burden | Moderate. A deterministic linear system solved each hour; element node counts fixed by the standard's discretisation; coefficients derived from layer properties (λ, ρ, c_p, thickness). | Comparable or higher — conduction time factors and radiant time factors must be generated from CTF / response-factor theory (state-space or Laplace) — and after that work it still yields only a design day. |
| Maintainability | One hourly engine, one code path for all climates and both hemispheres; the monthly method remains available as a cross-check. | Two methods (cooling load plus a heating method), plus design-day construction logic. |
| Licence | Algorithm implementable from the published structure; standard text and tables not redistributed — cite, do not quote. AGPL-clean. | Coefficients derivable from physics. AGPL-clean. |
Note the licence row: both are clean. The clearance already established that methods are not copyrightable and that first-principles coefficients carry no third-party licence. Nothing in the licence analysis prefers one over the other, which is precisely why this decision could not be read off the clearance document and had to be taken on its own terms.
1.3 Consequence for earth construction¶
Adobe, CEB and rammed earth combine high volumetric heat capacity with modest thermal resistance. Reported ranges for twelve clays are density 1490–2150 kg/m³, c_p 701–999 J/kg·K and λ 0.523–1.209 W/m·K (Manea et al., Materials, PMC10488609); Portuguese thermal regulation assigns adobe, rammed earth and CEB a design λ of 1.10 W/m·K (Energies 13(11):2978).
The practical consequence is that annual cooling energy for a free-running or intermittently-cooled earth building depends strongly on when heat arrives — time lags of roughly 8–12 h for thick dense masonry — and on how much the daily swing is damped. A steady-state, U-value-only model materially mis-estimates these buildings; a degree-day model cannot represent the phase shift at all. The hourly RC method represents both intrinsically.
The harmonic parameters are computable per EN ISO 13786 from the same layer data and should be exposed as diagnostic outputs (§4.7).
1.4 Scope guard [NORMATIVE]¶
This is a limited operational-carbon engine, not an HVAC design tool. It carries the "simplified — indicative" disclaimer of PROJECT.md decision #17.
That disclaimer no longer means "simplified relative to a full dynamic method" — EN ISO 52016-1 hourly is a full dynamic method. It now means exactly three exclusions, and they are the scope boundary of v1:
- Latent loads — de/humidification is out of scope. Relevant, and acknowledged as a real limitation for coastal hot-humid sites such as Dakar at 80 % annual mean RH.
- Multi-zone thermal coupling — the engine computes per thermal zone without inter-zone heat transfer.
- Detailed system part-load curves — plant is represented by a seasonal COP (§4.9), not by a part-load performance map.
A pluggable EnergyPlus / IES VE import remains the v2 step-up for these three specific gaps, not a general replacement for the kernel.
§2 NASA POWER integration [NORMATIVE]¶
2.1 Required parameters¶
The kernel shall request the following POWER parameter identifiers (community RE):
| POWER identifier | Quantity | Unit (POWER) | Grid | Use in chain |
|---|---|---|---|---|
T2M |
Air temperature at 2 m (mean) | °C | 0.5° × 0.625° | Fabric and ventilation ΔT; running-mean comfort |
T2M_MAX |
Air temperature at 2 m (daily max) | °C | 0.5° × 0.625° | Diurnal swing; peak checks |
T2M_MIN |
Air temperature at 2 m (daily min) | °C | 0.5° × 0.625° | Diurnal swing; night ventilation |
RH2M |
Relative humidity at 2 m | % | 0.5° × 0.625° | Comfort context; v2 latent loads |
WS2M |
Wind speed at 2 m | m/s | 0.5° × 0.625° | External surface coefficient h_o; infiltration |
ALLSKY_SFC_SW_DWN |
All-sky global horizontal irradiance | kWh/m²/day (daily) or W/m² (climatology mean flux) | 1° × 1° | Solar gains; sol-air |
ALLSKY_SFC_SW_DIFF |
Diffuse horizontal irradiance | as above | 1° × 1° | Split for tilted/vertical transposition |
ALLSKY_SFC_SW_DNI |
Direct normal irradiance | as above | 1° × 1° | Beam component for vertical façades |
PS |
Surface pressure | kPa | 0.5° × 0.625° | Air density for H_ve |
Unit conventions differ by endpoint and this is a trap. POWER climatology fluxes are reported as
mean W/m²; the daily and hourly APIs report kWh/m²/day. Conversion:
kWh/m²/day = W/m² × 24 / 1000. The kernel shall record which convention each vendored file
uses (§2.6, units).
2.2 Endpoints¶
- Climatology (long-term monthly means plus annual):
GET https://power.larc.nasa.gov/api/temporal/climatology/point?parameters=<list>&community=RE&longitude=<lon>&latitude=<lat>&format=JSON - Daily point (a specific TMY-like year):
.../api/temporal/daily/point?...&start=YYYYMMDD&end=YYYYMMDD - Hourly point (required for the full 8760-h engine):
.../api/temporal/hourly/point?...
2.3 Access constraints — verify at build time¶
Point requests accept up to 20 parameters per call; regional requests are limited to one parameter.
No API key or authentication is required for the point/temporal services. The JSON response header
block echoes the snapped grid-cell latitude and longitude and the fill value for missing data
(-999); both shall be captured into provenance. Requests should be batched — one call per
point covering every needed parameter — to respect informal rate limits.
Note: the direct REST API applies robots.txt restrictions to automated fetchers. A compliant HTTP
client (or the nasapower R package, or the POWER Data Access Viewer) is required for live pulls.
This constraint has already bitten once — see §5.0 and §12.
2.4 Licence and attribution¶
NASA POWER is redistributable. The AWS Registry of Open Data (awslabs/open-data-registry,
nasa-power.yaml) states: "There are no restrictions on the use, access, and/or download of data
from the NASA POWER Project. We request that you cite the NASA POWER Project when using the data
provided from NASA POWER Project. Creative Commons BY 4.0." NASA's Earthdata data-use policy adds
that, unless otherwise marked, "data provided from a NASA-led mission are licensed as Creative
Commons Zero (CC0)."
Redistribution and caching are therefore permitted and attribution is requested as a courtesy. This satisfies AGPL downstream parity — every cloner receives the same rights — which is the test the climate-data clearance applied and the one that eliminated every ASHRAE path.
The acknowledgement string shall be embedded in the docs site, API responses, and exported reports, mirroring the ÖKOBAUDAT attribution discipline (AR-28, AR-61 item (c)):
The data was obtained from the National Aeronautics and Space Administration (NASA) Langley Research Center (LaRC) Prediction of Worldwide Energy Resource (POWER) Project funded through the NASA Earth Science/Applied Science Program.
2.5 Decision D-ENERGY-01 — vendor cached, do not fetch live [NORMATIVE]¶
D-ENERGY-01. Climate data shall be fetched once and vendored as versioned local data. The reference and test paths shall not fetch live at runtime.
Reasoning:
- Determinism. The §5 regression fixtures require byte-stable inputs. A live API can change values between POWER releases (Release 9 → 10) or be transiently unavailable; either makes the test suite non-deterministic, which is the one thing a parity/divergence suite may not be.
- Offline builds and CI. The repository must build and test with no network access.
- Auditability. A committed data file with provenance is a citation. A live fetch is a simulation. The clearance names NASA POWER "the recommended vendorable seed" and vendoring "the only path that keeps the public repo buildable and lawful."
Production refresh path (INFORMATIVE). An optional, explicitly-invoked --refresh-climate mode
may call the live API for a user's real coordinates. Any such fetch shall write a new
vendored artefact with fresh provenance rather than mutate results silently.
2.6 Provenance metadata for vendored climate data [NORMATIVE]¶
Each vendored climate artefact shall carry a sidecar record:
climate_provenance:
source: "NASA POWER"
power_release: "10"
temporal_api: "climatology" # climatology | daily | hourly
community: "RE"
parameters: [T2M, T2M_MAX, T2M_MIN, RH2M, WS2M, ALLSKY_SFC_SW_DWN, ALLSKY_SFC_SW_DIFF, ALLSKY_SFC_SW_DNI, PS]
requested_coord: {lat: 14.7167, lon: -17.4677}
meteo_grid_cell: {lat: 14.75, lon: -17.5} # snapped, from response header
radiation_grid_cell: {lat: 15.0, lon: -17.0} # snapped, 1°x1°
meteo_grid_resolution: {dlat: 0.5, dlon: 0.625}
radiation_grid_resolution: {dlat: 1.0, dlon: 1.0}
units: {ALLSKY_SFC_SW_DWN: "W/m2", T2M: "C"}
fill_value: -999
retrieved_utc: "2026-08-29T00:00:00Z"
source_url: "https://power.larc.nasa.gov/api/temporal/climatology/point?..."
licence: "CC-BY-4.0 / NASA open data"
sha256: "<hash of raw response>"
§3 Spatial interpolation [NORMATIVE]¶
3.1 Method — bilinear¶
Interpolation between the four surrounding grid nodes shall be bilinear. POWER is a continuous regular lat/lon grid; bilinear is the standard low-variance continuous interpolant for such a grid, is exactly reproducible, and yields transparent weights for the audit trail.
Nearest-neighbour is prohibited as a default (METHODOLOGY.md §5a rule 4 — see living methodology document). Bicubic is unwarranted: the grid is already a smoothed reanalysis product.
3.2 Two grids [NORMATIVE]¶
Meteorology (0.5° × 0.625°) and radiation (1° × 1°) have different native resolutions. Each parameter shall be interpolated on its own grid. Mixing grids is a defect, not an approximation.
3.3 Formula¶
For a target point (φ, λ), let the four surrounding nodes lie at latitudes φ₁ < φ₂ and longitudes λ₁ < λ₂, with values Q₁₁(φ₁,λ₁), Q₂₁(φ₁,λ₂), Q₁₂(φ₂,λ₁), Q₂₂(φ₂,λ₂). Normalised fractional distances:
tx = (λ − λ₁) / (λ₂ − λ₁) 0 ≤ tx ≤ 1 (longitude fraction)
ty = (φ − φ₁) / (φ₂ − φ₁) 0 ≤ ty ≤ 1 (latitude fraction)
Bilinear weights (sum ≡ 1):
w₁₁ = (1 − tx)(1 − ty)
w₂₁ = tx(1 − ty)
w₁₂ = (1 − tx)ty
w₂₂ = tx·ty
Q(φ, λ) = w₁₁Q₁₁ + w₂₁Q₂₁ + w₁₂Q₁₂ + w₂₂Q₂₂
3.4 Audit record [NORMATIVE]¶
Every interpolation call shall emit, per METHODOLOGY.md §5a: the four source nodes (coordinates
and values), the four weights, the result, the grid resolution used, and an explicit extrapolation
flag.
interpolation_audit:
parameter: ALLSKY_SFC_SW_DWN
target: {lat: 14.7167, lon: -17.4677}
grid_resolution: {dlat: 1.0, dlon: 1.0}
nodes:
Q11: {lat: 14.0, lon: -18.0, value: <..>}
Q21: {lat: 14.0, lon: -17.0, value: <..>}
Q12: {lat: 15.0, lon: -18.0, value: <..>}
Q22: {lat: 15.0, lon: -17.0, value: <..>}
fractions: {tx: 0.5323, ty: 0.7167}
weights: {w11: <..>, w21: <..>, w12: <..>, w22: <..>} # must sum to 1.0 ± 1e-9
result: <..>
extrapolation: false
method: "bilinear"
3.5 Edge cases [NORMATIVE]¶
- Coastal and ocean nodes. POWER returns valid land-and-ocean values for meteorology and
radiation, so a node "over ocean" is generally still populated. If any of the four nodes is a fill
value (
-999), the engine shall (a) exclude fill nodes and renormalise the remaining weights, (b) set apartial_gridwarning, and (c) refuse and raise if fewer than two valid nodes remain. No silent nearest-neighbour fallback. This is a pedigree/DQI event, recorded on the Weidema axes. - Antimeridian (λ near ±180°). Longitude interpolation shall be performed in a wrapped coordinate, so that λ₁ = 179.375° and λ₂ = −180° are treated as adjacent (compute Δλ modulo 360). A naïve subtraction produces a ~360° denominator and a corrupt weight.
- Poles (|φ| → 90°). Latitude bands converge; the topmost and bottommost cell centres bound the interpolation. Beyond the last centre toward the pole, treat as extrapolation.
- Extrapolation. If the target lies outside the convex hull of the four nearest cell centres —
tx or ty ∉ [0,1] after node selection — the engine shall set
extrapolation: true, emit an explicit warning to both the audit trail and the report, clamp to the boundary cell value, and downgrade the pedigree score. It shall not silently return a nearest value without the warning.
§4 The calculation chain [NORMATIVE]¶
The NORMATIVE engine is the EN ISO 52016-1 hourly method (§4.8). Sections §4.1–§4.7 define the physical inputs feeding it, and together constitute the INFORMATIVE Tier-0 monthly quasi-steady cross-check used for the §5 fixtures. Symbols are collected in §10.
4.0 Functional units¶
- Cooling / heating energy need (thermal): Q″ = kWh/m²·a, per m² conditioned floor area per year.
- Delivered electricity: E″_del = kWh/m²·a.
- Operational carbon (B6): g″ = kgCO2e/m²·a, and over the reference study period: kgCO2e/m² over RSP.
Note on RSP: the reference study period is 30 a, per PROJECT.md decision #15 — the project default for the Sahel context, parametric per project. RSP is an engine input, not a constant; the worked fixtures in §5 state the value they used. EN 15978's generic 60 a default does not apply here: the project's own locked value governs.
4.1 Fabric transmission (opaque and glazed)¶
Steady conduction through element j:
U_j [W/m²·K] is the element transmittance per ISO 6946, U = 1 / (R_si + Σ d_i/λ_i + R_se); A_j
[m²] its area; T_int [°C] the internal set-point. T_x is the driving temperature — dry-bulb T_out
for glazing and ventilation, sol-air T_sa for sunlit opaque elements (§4.3).
Zone transmission coefficient: H_tr = Σ_j U_j · A_j [W/K].
4.2 Ventilation and infiltration¶
ρ_a·c_a ≈ 1200 J/m³·K at sea level, corrected with PS via ρ_a = PS / (R_specific · T_K);
n [1/h] air-change rate; V [m³] zone volume.
4.3 Sol-air temperature (opaque solar gain)¶
α solar absorptance [–] (earth and render ≈ 0.5–0.7); I_s surface irradiance [W/m²]; h_o external
surface coefficient [W/m²·K], h_o ≈ 5.7 + 3.8 · WS2M, or a fixed 17 W/m²·K screening value;
ε·ΔR/h_o the long-wave sky correction, ≈ 4 K for horizontal roofs and ≈ 0 K for vertical walls.
Opaque solar-driven gain folds into Q_tr,j via T_x = T_sa.
4.4 Solar gain through glazing¶
g total solar energy transmittance [–]; F_f frame factor (glazed fraction) [–]; F_sh shading factor [–]; I_s,vert irradiance on the glazed plane, transposed from GHI/DNI/DIFF.
4.5 Solar transposition to a tilted or vertical plane (INFORMATIVE default)¶
From ALLSKY_SFC_SW_DWN (GHI), _DNI, _DIFF and solar geometry (declination δ, hour angle ω,
latitude φ → incidence angle θ):
β surface tilt (90° for walls); ρ_g ground albedo, default 0.2 and data-driven. A screening
approximation I_s,vert ≈ 0.5 · GHI may be used for Tier-0 fixtures and shall be flagged as
such wherever it is used.
4.6 Internal gains¶
q_int [W/m²] occupancy plus equipment plus lighting density, schedule-weighted; default screening value 4 W/m².
4.7 Thermal mass and dynamic effects¶
In the NORMATIVE hourly engine, mass is represented by the EN ISO 52016-1 per-element capacitance nodes. For diagnostics and for the Tier-0 cross-check, the EN ISO 13786 harmonic parameters shall be computable:
Y_ie is the periodic thermal transmittance [W/m²·K] from the layer transfer matrix. Massive earth walls give f ≈ 0.1–0.4 and Δt ≈ 6–12 h.
4.8 Aggregation¶
NORMATIVE — hourly summation over 8760 h of positive cooling need and, separately, positive heating need:
Q_C = Σ_{h=1..8760} max(0, Φ_cool,h) · Δτ [Wh] (Δτ = 1 h)
Q_H = Σ_{h=1..8760} max(0, Φ_heat,h) · Δτ [Wh]
INFORMATIVE Tier-0 monthly cross-check, used for the §5 fixtures:
Φ_m = H_tr·(T_x,m − T_int) + H_ve·(T_out,m − T_int) + Q_sol,gl,m + Q_int [W]
Q_C = Σ_{m=1..12} max(0, Φ_m) · h_m / 1000 [kWh]
h_m is the number of hours in month m.
4.9 Energy need → delivered electricity¶
SCOP_c is user-supplied; default screening value 3.0 W/W. Note SEER[Btu/Wh] = 3.412 × COP[W/W].
Fan and pump auxiliary energy may be added as a user-supplied fraction.
4.10 Delivered electricity → operational carbon¶
g_B6 = (E_del,C + E_del,H) · EF_grid [kgCO2e/a]
g″_B6 = g_B6 / A_f [kgCO2e/m²·a]
G_B6,RSP = g″_B6 · RSP [kgCO2e/m² over the study period]
4.11 Grid emission factor [NORMATIVE] — BLOCKED until sourced¶
EF_grid [kgCO2e/kWh] shall be a user- or data-supplied parameter carrying provenance: year,
source, location-based versus market-based, and whether life-cycle or combustion-only. It shall
not be hardcoded, and there is no national default.
Default is unset. The engine refuses to emit a carbon number without a sourced factor, but still reports thermal and electricity figures. This is the same discipline as the A5 site-energy blocker (AR-54) and follows decision #26 on per-stage geographic provenance: a missing factor is loud, and a partial result that is honest about what it omits beats a complete result resting on an uncited number.
A suitable source family is the IEA Emission Factors dataset, which from its 2023 edition added detailed national data for both Senegal (an IEA Association country since June 2023) and Burkina Faso, alongside the IEA Life Cycle Upstream Emission Factors database (150 countries, 2015–latest). It is not yet sourced — that is AR-65, and the IEA licence is restrictive, so the value is user-provided and never vendored (§9).
§5 Worked numerical fixtures [NORMATIVE for fixture values]¶
5.0 Data source¶
Inputs are real, retrieved NASA POWER climatology values (community RE, long-term monthly
means plus annual), retrieved 2026-08-29 from the POWER v9 climatology grid services.
ALLSKY_SFC_SW_DWN is reported as mean W/m²; convert to kWh/m²/day by × 0.024. Values were
cross-checked against profileSOLAR's NASA-POWER-derived Dakar figures (annual GHI ≈ 5.8
kWh/m²/day — consistent). Raw grid float32 artefacts (24.3125, 5.2656 and similar) are retained:
they are exactly what makes the fixtures byte-stable.
The direct REST API is robots.txt-restricted to automated fetchers, which is why the grid services
were used and why T2M_MAX / T2M_MIN are missing from the tables below (§12).
5.1 Reference building REF-EARTH-100¶
Both fixtures share one deliberately worst-case building: unshaded, single-glazed, under continuous 26 °C cooling.
| Property | Value |
|---|---|
| Conditioned floor area A_f | 100 m² (10 m × 10 m) |
| Storey height / volume | 3.0 m / V = 300 m³ |
| Wall construction | 0.30 m rammed earth or CEB; λ = 0.90 W/m·K, ρ = 1800 kg/m³, c_p = 900 J/kg·K |
| Wall U (ISO 6946: R_si 0.13 + 0.30/0.90 + R_se 0.04 = 0.5033) | 1.99 W/m²·K |
| Gross wall area (perimeter 40 m × 3 m) | 120 m²; net opaque 108 m² |
| Windows A_gl | 12 m² (WWR 10 %), g = 0.70, U_gl = 5.7 W/m²·K (single glazing), F_f = 0.70, F_sh = 0.90 |
| Roof A_r | 100 m², U_roof = 0.50 W/m²·K (insulated light roof), α = 0.60 |
| Ground floor | excluded from cooling (ground sink) |
| Ventilation | n = 0.5 ACH → H_ve = 50 W/K |
| Internal gains q_int | 4 W/m² → Q_int = 400 W |
| Cooling set-point T_int | 26 °C (data-driven; see §6 item 4) |
| Wall/roof absorptance α, h_o | 0.60, 17 W/m²·K |
| SCOP_c | 3.0 W/W |
| Reference study period RSP | 30 a (PROJECT.md decision #15) |
Derived coefficients:
H_tr(opaque wall) = 1.99 × 108 = 214.9 W/K
H_tr(roof) = 0.50 × 100 = 50.0 W/K
H_tr(glazing) = 5.70 × 12 = 68.4 W/K
window solar aperture A_sol = A_gl · g · F_f · F_sh = 5.29 m²
I_vert ≈ 0.5 · GHI (Tier-0 screening, §4.5)
sol-air uplift, wall = 0.6 · I_vert / 17 = 0.01765 · GHI [K]
sol-air uplift, roof = 0.6 · GHI / 17 − 4 = 0.03529 · GHI − 4 [K]
5.2 Interpolation fixture — Dakar, meteorology grid 0.5° × 0.625°¶
Target φ = 14.7167, λ = −17.4677. Surrounding meteorology nodes: φ₁ = 14.5, φ₂ = 15.0; λ₁ = −17.5, λ₂ = −16.875 (0.625° steps).
tx = (−17.4677 − (−17.5)) / 0.625 = 0.0323 / 0.625 = 0.05168
ty = (14.7167 − 14.5) / 0.5 = 0.2167 / 0.5 = 0.43340
w11 = (1 − tx)(1 − ty) = 0.94832 · 0.56660 = 0.53732
w21 = tx(1 − ty) = 0.05168 · 0.56660 = 0.02928
w12 = (1 − tx)ty = 0.94832 · 0.43340 = 0.41100
w22 = tx · ty = 0.05168 · 0.43340 = 0.02240
Σw = 1.00000 ✓
The radiation grid (1° × 1°) uses different nodes — φ 14/15, λ −18/−17 — and produces a separate audit record (§3.2). Expected weights are fixture assertions at ±1e-4.
5.3 Fixture A — Dakar, Senegal (14.7167 N, 17.4677 W): coastal hot-humid¶
Retrieved NASA POWER climatology, grid cell ≈ 14.75 N, 17.5 W:
| Month | T2M °C | GHI W/m² | RH2M % | WS2M m/s |
|---|---|---|---|---|
| Jan | 21.875 | 212.5 | 69.5 | 5.13 |
| Feb | 20.500 | 238 | 76.0 | 5.27 |
| Mar | 20.438 | 273 | 83.0 | 5.02 |
| Apr | 20.563 | 285 | 87.5 | 5.09 |
| May | 22.188 | 279 | 88.3 | 4.66 |
| Jun | 24.813 | 258 | 86.3 | 4.19 |
| Jul | 26.625 | 237.5 | 83.5 | 4.08 |
| Aug | 27.313 | 233 | 83.5 | 3.95 |
| Sep | 27.750 | 227 | 83.0 | 3.41 |
| Oct | 28.188 | 235 | 79.0 | 3.61 |
| Nov | 26.875 | 216 | 72.5 | 4.61 |
| Dec | 24.250 | 202 | 69.3 | 5.03 |
| ANN | 24.31 | 241.5 (5.80 kWh/m²/day) | 80 | 4.50 |
Worked October step (the hottest month), Tier-0:
I_vert = 0.5 · 235 = 117.5 W/m²
T_sa,wall = 28.188 + 0.01765 · 235 = 32.335 °C → 214.9 · (32.335 − 26) = 1361.5 W
T_sa,roof = 28.188 + (0.03529 · 235 − 4) = 32.481 °C → 50.0 · ( 6.481) = 324.0 W
glazing conduction = 68.4 · (28.188 − 26) = 149.6 W
ventilation = 50.0 · (28.188 − 26) = 109.4 W
window solar = 5.29 · 117.5 = 621.6 W
internal = 400.0 W
Φ_Oct = 1361.5 + 324.0 + 149.6 + 109.4 + 621.6 + 400.0 = 2966.1 W
× 744 h = 2206.8 kWh
All twelve months are positive for this unshaded single-glazed case:
| Month | Φ_m (W) | h_m | kWh |
|---|---|---|---|
| Jan | 361.9 | 744 | 269.3 |
| Feb | 44.1 | 672 | 29.6 |
| Mar | 307.5 | 744 | 228.8 |
| Apr | 453.5 | 720 | 326.5 |
| May | 1027.2 | 744 | 764.2 |
| Jun | 1861.1 | 720 | 1340.0 |
| Jul | 2387.8 | 744 | 1776.5 |
| Aug | 2614.4 | 744 | 1945.1 |
| Sep | 2732.9 | 720 | 1967.7 |
| Oct | 2966.1 | 744 | 2206.8 |
| Nov | 2307.1 | 720 | 1661.1 |
| Dec | 1186.1 | 744 | 882.5 |
| Σ | 8760 | 13 398 kWh |
Q_C = 13 398 kWh/a → Q″_C = 133.98 ≈ 134 kWh/m²·a (thermal)
E_del,C = 13 398 / 3.0 = 4 466 kWh/a → E″_del = 44.7 kWh/m²·a
g_B6 = 4 466 · EF_grid(Senegal, indicative 0.5 kgCO2e/kWh) ≈ 2 233 kgCO2e/a
g″_B6 ≈ 22.3 kgCO2e/m²·a
G_B6,RSP ≈ 670 kgCO2e/m² over 30 a
Fixture A expected values (tolerance ±2 % on the Tier-0 hand calculation): Q″_C = 134.0 kWh/m²·a; E″_del = 44.7 kWh/m²·a; g″_B6 = 22.3 kgCO2e/m²·a at EF_grid = 0.5. Carbon scales linearly with the user-supplied factor; the 0.5 is indicative and not a sourced value (AR-65).
5.4 Fixture B — Ouagadougou, Burkina Faso (12.3714 N, 1.5197 W): Sahelian hot-dry¶
Retrieved NASA POWER climatology, grid cell ≈ 12.25 N, 1.5625 W:
| Month | T2M °C | GHI W/m² | RH2M % | WS2M m/s |
|---|---|---|---|---|
| Jan | 22.938 | 233.5 | 24.1 | 2.22 |
| Feb | 26.563 | 247.5 | 20.0 | 2.20 |
| Mar | 30.188 | 256 | 20.9 | 1.92 |
| Apr | 32.375 | 262 | 35.5 | 1.91 |
| May | 32.000 | 258 | 49.8 | 2.25 |
| Jun | 29.688 | 245 | 61.1 | 1.95 |
| Jul | 27.438 | 235.5 | 72.8 | 1.42 |
| Aug | 26.313 | 225.5 | 80.3 | 1.07 |
| Sep | 26.563 | 241 | 78.8 | 0.94 |
| Oct | 27.500 | 249 | 67.8 | 1.06 |
| Nov | 25.813 | 239.5 | 45.3 | 1.36 |
| Dec | 23.250 | 231 | 32.8 | 1.93 |
| ANN | 27.56 | 243.5 (5.84 kWh/m²/day) | 49.25 | 1.68 |
Monthly Tier-0 results — same building, same method:
| Month | Φ_m (W) | h_m | kWh |
|---|---|---|---|
| Jan | 941.6 | 744 | 700.6 |
| Feb | 2445.8 | 672 | 1643.6 |
| Mar | 3904.9 | 744 | 2905.2 |
| Apr | 4792.7 | 720 | 3450.7 |
| May | 4616.1 | 744 | 3434.4 |
| Jun | 3623.1 | 720 | 2608.6 |
| Jul | 2682.8 | 744 | 1995.4 |
| Aug | 2169.6 | 744 | 1614.2 |
| Sep | 2392.4 | 720 | 1722.5 |
| Oct | 2817.4 | 744 | 2096.1 |
| Nov | 2092.8 | 720 | 1506.8 |
| Dec | 1040.7 | 744 | 774.3 |
| Σ | 8760 | 24 452 kWh |
Q_C = 24 452 kWh/a → Q″_C = 244.5 kWh/m²·a (thermal)
E_del,C = 24 452 / 3.0 = 8 151 kWh/a → E″_del = 81.5 kWh/m²·a
g_B6 = 8 151 · EF_grid(Burkina Faso, indicative 0.55 kgCO2e/kWh) ≈ 4 483 kgCO2e/a
g″_B6 ≈ 44.8 kgCO2e/m²·a
G_B6,RSP ≈ 1 345 kgCO2e/m² over 30 a
Fixture B expected values (tolerance ±2 %): Q″_C = 244.5 kWh/m²·a; E″_del = 81.5 kWh/m²·a; g″_B6 = 44.8 kgCO2e/m²·a at EF_grid = 0.55 — again indicative, not sourced.
5.5 Interpretation — what these numbers are, and what they are not¶
Ouagadougou's cooling need is ≈ 1.8× Dakar's despite near-identical annual GHI (243.5 vs 241.5 W/m²). The driver is air temperature — 27.6 °C annual mean against 24.3 °C — and the absence of Dakar's maritime moderation. That the two sites separate on temperature rather than irradiance is the point of having both fixtures: a kernel tuned to one Sahelian climate would not show it.
Both figures are high because REF-EARTH-100 is deliberately worst-case. They are INDICATIVE
Tier-0 bounds, not the NORMATIVE 8760-h EN ISO 52016-1 output, which will be lower, because
(a) thermal mass shifts peak gains into cooler night hours where free cooling and night ventilation
offset them, and (b) adaptive comfort raises the effective set-point (§6 item 4).
The implementation shall assert the Tier-0 numbers exactly — they are deterministic — and, once the hourly engine exists, shall assert that hourly cooling energy falls within a documented band (e.g. 0.5–1.0 ×) of the Tier-0 bound for the same building and site.
§6 Genericity requirements — no hardcoded region [NORMATIVE]¶
The AGENTS.md no-hardcoded-region rule applies throughout. The following shall be generic and
data-driven:
- Hemisphere. Cooling and heating seasons are derived from the sign of the monthly balance, not from calendar months. A −14.7° site whose coolest month is July shall run the same code path as a +14.7° site. There is no northern-hemisphere month-shift table — the ASHRAE hemisphere problem is moot with continuous POWER data, as AR-60 already recorded.
- Heating as well as cooling. Highland SSA sites — Nairobi at ~1795 m, Addis Ababa — can require heating. The engine shall compute Q_C and Q_H from the same hourly balance and report them separately. Neither may be assumed zero.
- Grid emission factor. User- or data-supplied with provenance (§4.11). No embedded national default.
- Set-point and comfort model. Set-points shall be parameters. An adaptive-comfort option
(EN 16798-1 / ASHRAE 55) shall be available, with the neutral operative temperature a
function of the exponentially-weighted running-mean outdoor temperature T_rm:
T_comf = a · T_rm + b. EN 16798-1 gives slope 0.33 with a comfort width of ±7 K over a T_rm applicability range of 10–30 °C (T_comf = 0.33 · T_rm + 18.8); ASHRAE 55-2020's central line isT_comf = 0.31 · T_rm + 17.8bounded to ≈ 20.9–28.2 °C. The running-mean weighting factor α is itself configurable: the ISO/EN default is 0.80 (the McCartney & Nicol (2002) TRM80 adaptive- control index underpinning EN 16798-1), while ASHRAE suggests up to 0.9 for tropical climates with low day-to-day variation. Applicability bounds shall be enforced with a warning outside range. - Timezone and solar geometry. Solar position — declination, hour angle, incidence — shall be computed from latitude, longitude and day-of-year with the site's actual UTC offset and solar time. No fixed timezone.
- Ground albedo, absorptance, surface coefficients shall be inputs with documented defaults, not constants.
- Unit system. SI internally. Any IP exposure (Btu, °F, SEER) shall be a presentation-layer
conversion:
SEER[Btu/Wh] = 3.412 × COP[W/W],°C = (°F − 32) / 1.8. - Any lookup table — material λ/ρ/c_p per ISO 10456, RSL values, comfort coefficients — shall be a versioned data file consumed through the interpolation service with its audit trail. Never embedded literals.
- Grid definitions (0.5° × 0.625° meteorology, 1° × 1° radiation) shall be configuration, so that a future POWER release changing resolution is a data change and not a code change.
§7 Interfaces and data flow¶
- Input: project coordinates (lat, lon); reference-building parameters; set-point and comfort
configuration; SCOP;
EF_gridwith provenance; RSP. thermal(ISO 10456 / 6946 / 13786) supplies U_j, the dynamic parameters f and Δt, and node capacities per element → feedsenergy.energy: climate service (vendored NASA POWER plus interpolation audit) → EN ISO 52016-1 hourly kernel → Q_C, Q_H, E_del.lca.b6: E_del × EF_grid → g_B6, reported per EN 15978 B6, per indicator, separately from embodied A–C and from module D. Carries the "simplified — indicative" disclaimer.services.uncertainty: climate resolution and microclimate limits, EF_grid uncertainty, SCOP and comfort assumptions propagate as pedigree/DQI on the Weidema axes → Monte Carlo, 10 000 iterations.
See data flow for the whole-pipeline view.
§8 Test and acceptance criteria [NORMATIVE]¶
- Interpolation weights sum to 1 ± 1e-9; a unit test rejects a nearest-neighbour default.
- Extrapolation and partial-grid (ocean fill) events raise the documented warnings. No silent fallback.
- Fixtures A and B reproduce the §5 values within ±2 % as byte-stable regression fixtures with vendored inputs.
- Southern-hemisphere mirror test: a synthetic site at −14.7167 with a hemisphere-flipped monthly series yields the same Q_C as Fixture A. This is the test that proves no hardcoded hemisphere.
- Carbon output is refused when
EF_gridis unset; thermal and electricity figures are still produced. - The NASA POWER attribution string is present in the API response and in the exported report.
§9 Licence compliance summary¶
| Element | Source | AGPL status |
|---|---|---|
| Climate data | NASA POWER (CC-BY-4.0 / NASA open data) | Vendorable — redistribution and caching permitted; attribution embedded |
| Calculation method | EN ISO 52016-1 (algorithm) | Implementable; standard text and tables NOT redistributed — describe and cite only |
| Dynamic parameters | EN ISO 13786 / ISO 6946 (algorithm) | Implementable; text not vendored |
| Comfort model | EN 16798-1 / ASHRAE 55 (equations) | Equations usable; standard text not vendored |
| Grid emission factor | User/data-supplied (e.g. IEA — licence-restricted) | Not vendored; the user provides it, provenance recorded (AR-65) |
| ASHRAE CLTD/CLF/SCL | — | BLOCKED / not used — superseded and licence-incompatible (AR-31 resolved) |
§10 Symbol table¶
A_f floor area (m²) · A_gl glazing area (m²) · A_j element area (m²) · U_j transmittance (W/m²·K) · R_si / R_se surface resistances (m²·K/W) · H_tr transmission coefficient (W/K) · H_ve ventilation coefficient (W/K) · n air-change rate (1/h) · V volume (m³) · ρ_a·c_a volumetric heat capacity of air (J/m³·K) · T_int set-point (°C) · T_out dry-bulb (°C) · T_sa sol-air (°C) · α solar absorptance (–) · I_s surface irradiance (W/m²) · h_o external surface coefficient (W/m²·K) · ε·ΔR long-wave correction (W/m²) · g total solar energy transmittance (–) · F_f frame factor (–) · F_sh shading factor (–) · q_int internal gain density (W/m²) · f decrement factor (–) · Δt time lag (h) · Y_ie periodic thermal transmittance (W/m²·K) · Q_C / Q_H cooling / heating need (kWh) · SCOP_c / SCOP_h seasonal COP (W/W) · E_del delivered electricity (kWh) · EF_grid grid emission factor (kgCO2e/kWh) · g_B6 operational carbon (kgCO2e) · RSP reference study period (a) · GHI / DNI / DIFF irradiance components (W/m² or kWh/m²/day) · tx / ty interpolation fractions (–) · w₁₁…w₂₂ bilinear weights (–).
§11 Recommended path¶
- Build the EN ISO 52016-1 hourly kernel as the B6 engine. Keep the Tier-0 monthly method (§4.8) permanently, as a cheap regression cross-check and as the fallback "indicative" path. Do not invest in RTS — it answers the wrong question for B6.
- Vendor NASA POWER climatology now for the project's real sites, Dakar first, with the §2.6
provenance sidecar. Wire the optional
--refresh-climateproduction path later. Gate public release on the AR-61 attribution wording. - Implement the interpolation service against two grid definitions (0.5° × 0.625° and 1° × 1°) with the §3.4 audit record and the §3.5 edge cases. Write the nearest-neighbour-rejection and antimeridian tests first — they are the ones that encode the policy.
- Treat
EF_gridand the comfort set-point as required, sourced inputs. Ship no national defaults; refuse carbon output without a sourced factor. SourceEF_gridfrom the IEA Emission Factors / Life Cycle Upstream Emission Factors datasets — which cover Senegal and Burkina Faso from the 2023 edition — with year and basis recorded in provenance (AR-65). - Lock the §5 fixtures (Dakar, Ouagadougou) as the initial regression suite. Add a highland
heating case (Nairobi) and a southern-hemisphere mirror case before v1. Retrieve
T2M_MAXandT2M_MINmonthly climatologies through arobots.txt-compliant client before wiring the diurnal-swing inputs. - What would change these choices. If v2 requires latent loads, multi-zone coupling, or sub-hourly control, escalate to a full EnergyPlus import rather than extending the simplified kernel — that is the §1.4 boundary doing its job. If a future NASA POWER release changes grid resolution, update the grid configuration only (§6 item 9).
§12 Caveats¶
- The §5 numbers are INDICATIVE Tier-0 monthly bounds, not NORMATIVE 8760-h engine output. The hourly engine with thermal mass and adaptive comfort will generally return lower cooling energy. They are valid as deterministic fixtures. They are not design figures and must not be quoted as results.
EF_gridis not sourced. The 0.5 and 0.55 kgCO2e/kWh used in §5.3 and §5.4 are indicative placeholders that make the arithmetic checkable, nothing more. Carbon output scales linearly with the factor, and the engine refuses to emit carbon until a sourced value exists (AR-65).- Microclimate is not resolved. NASA POWER's 0.5° × 0.625° meteorology cell is ≈ 55 × 60 km at these latitudes, so coastal and topographic microclimates — Dakar's peninsula above all — are averaged away. This is a pedigree/DQI matter propagated through Monte Carlo, not a reason to reject the data.
T2M_MAX/T2M_MINwere not retrieved. They were not available from the accessible POWER grid services during drafting and must be pulled from the direct REST API, or thenasapowerclient, when the diurnal-swing inputs are wired. The §5 fixtures use only T2M and GHI, which were retrieved.- No standard text is reproduced. This document describes standard algorithms and cites the standards. It does not reproduce EN ISO 52016-1, EN ISO 13786 or EN 16798-1 text, which is copyright-protected and not redistributable under AGPL (§9).
- Not legal advice. The AGPL and attribution items remain subject to AR-61 counsel sign-off.