# Lydmera internal worked examples

Evidence pack: `internal-worked-cases-2026-09-22-v1`. Prepared 22 September 2026.

These are **internal equation-agreement checks**, prepared from synthetic fixed inputs. They are not independent professional validation, measured operating performance, equipment recommendations or a standards-compliance certificate. A separately written reference can still share the same modelling assumptions and errors as the implementation. The outdoor evaporation example specifically does not validate the adapted outdoor model.

The accompanying [JSON](methodology-cases.json) contains the complete application inputs, expected values, actual values, actual-minus-expected differences, absolute tolerances and SHA-256 source hashes. Line endings are normalised to LF before hashing. The three cases are heating-only or fixed-flow checks: they do not establish cooling, covered-pool, moisture-balance ventilation, variable-speed pump or complete network accuracy.

## How the reference is kept separate

The reference arithmetic is in `scripts/methodology-evidence/reference.ts`. It imports no production calculation functions, constants, fixture outputs or property helpers. Inputs are frozen separately in `fixtures.ts`; `cases.ts` obtains the actual outputs from the real `calculate` and `computePump` functions and compares them with the separate arithmetic. Expected numbers are never populated from actual outputs.

The absolute comparison tolerance is **0.001 of each displayed unit** (kW, m, m/s or m³/h). This is an internal numerical-agreement threshold, chosen to expose calculation/unit drift beyond the published rounding. It is not an engineering accuracy, model uncertainty, design margin or project acceptance tolerance. Values in the JSON retain floating-point precision. Tiny binary rounding differences may display as zero in the table.

## Shared thermal geometry and properties

Rectangular basin: 10 × 5 × 1.5 m. Surface 50 m²; volume 75 m³; wetted walls plus floor 95 m². Water rises from 15 to 28 °C in 48 hours. Mean transition temperature is 21.5 °C. No cover, no solar credit, sea level, annual-mean surrounding ground assumption 10 °C. Uninsulated concrete uses the internal default U = 2.5 W/(m²·K).

The water-property expressions are the documented Lydmera polynomial fits, evaluated here separately; this pack does not independently assess the fit against IAPWS data:

```text
rho(T) = 0.0000335198 T³ - 0.00748648 T² + 0.0544126 T + 999.85811 kg/m³
cp(T)  = -0.000000698057 T³ + 0.0000836037 T² - 0.00316924 T + 4.21687 kJ/(kg·K)
p_sat(T) = 0.6108 exp[17.27 T/(T + 237.3)] kPa
Q1 = 75 rho(21.5) cp(21.5) (28 - 15)/(48 × 3600) kW
Q8 = 2.5 × 95 × (21.5 - 10)/1000 kW
```

Q1 is the water sensible-energy balance. Q8, the default U-value and the use of annual mean as a ground boundary are stated application assumptions, not a site-specific ground model.

## Case 1 — Outdoor heating

Air 5 °C, RH 0.6, wind already at pool surface 1.227 m/s. Public-pool activity factor 1.0. Pipe run 15 m, linear U = 3.03 W/(m·K). Q2 uses the cited external-flow relation with fixed air properties; this case falls in its mixed-flow branch:

```text
Re = 1.227 sqrt(50)/0.0000148
Nu = (0.037 Re^0.8 - 871) × 0.7156^(1/3)
Q2 = Nu × 0.0262/sqrt(50) × 50 × (28 - 5)/1000 kW
Q3 = 50 × [p_sat(28) - 0.6 p_sat(5)] × (0.089 + 0.0782 × 1.227) kW
Q4 = 15 × 3.03 × (21.5 - 5)/1000 kW
Q6 = 0.95 × 5.67e-8 × 50 × [(28 + 273.15)^4 - (5 - 12 + 273.15)^4]/1000 kW
Q5 = Q7 = 0
Pool-water duty = Q1 + Q2 + Q3 + Q4 + Q6 + Q8
```

Q3 is the adapted historical wind correlation, **not** the current ASHRAE natural/forced evaporation method. Its agreement here is only arithmetic consistency. Q6 uses the Stefan–Boltzmann form with the internal fixed sky offset of 12 K. The total is approximately **68.256485 kW**, before any equipment-selection margin. Manufacturer duty at the actual design condition is a separate question.

## Case 2 — Indoor pool water

Same basin and heat-up conditions. Room 30 °C, RH 0.6, air speed 0.14 m/s, activity factor 0.8; 15 m indoor pipework with linear U = 0.85 W/(m·K). Q1 and Q8 are unchanged. In this case the forced-convection relation is laminar:

```text
Re = 0.14 sqrt(50)/0.0000148
Nu = 0.664 sqrt(Re) × 0.7156^(1/3)
Q2 = Nu × 0.0262/sqrt(50) × 50 × (28 - 30)/1000 kW
Q3 = 4.16e-5 × 50 × [p_sat(28) - 0.6 p_sat(30)] × 0.8 × 2450 kW
Q4 = 15 × 0.85 × (21.5 - 30)/1000 kW
Q6 = 0.95 × 5.67e-8 × 50 × [(28 + 273.15)^4 - (30 + 273.15)^4]/1000 kW
Q5 = Q7 = 0
Pool-water duty = Q1 + Q2 + Q3 + Q4 + Q6 + Q8
Separate ventilation heating = 0.72 × 50 × 1.5 × 0.0012 × (30 - 5) = 1.620 kW
```

The indoor Q3 form is the simplified low-air-speed ASHRAE pool relation, with constant latent heat 2450 kJ/kg. Negative Q2/Q4/Q6 are heat gains. The entered ventilation rate 0.72 L/(s·m²), deck factor 1.5 and zero heat recovery are example inputs, not a claim of compliance with ASHRAE 62.1. Ventilation heating is **not added** to the pool-water heater total. This is not a full dehumidifier or natatorium HVAC design.

## Case 3 — Circulation head and available suction head

Flow 171.4 m³/h; flooded skimmer circuit, pump 1 m below water; water 28 °C; pressure 101.3 kPa. PVC C = 150 is a preliminary assumption. Suction is 8 m long with actual bore 0.2 m and sum K = 2.5; discharge is 15 m with bore 0.16 m and sum K = 6.5. Source fitting counts are in the JSON; their K values are internal adapted defaults. Suction devices lose 15 kPa and return nozzles 15 kPa. Other devices lose 45 kPa. Filter losses are 30 kPa clean and 70 kPa dirty, at the entered flow.

```text
q = 171.4/3600 m³/s; rho = 998 kg/m³; g = 9.81 m/s²
v = q/(pi D²/4)
h_f = 10.67 L q^1.852/(150^1.852 D^4.8704) m  [Hazen–Williams]
h_minor = K v²/(2g) m
h_device = dp_kPa × 1000/(998 × 9.81) m
TDH_clean = suction loss + discharge loss + h_device(45 + 30)
TDH_dirty = suction loss + discharge loss + h_device(45 + 70)
Required head = TDH_dirty × 1.10
NPSHa = h_device(101.3) + 1 - suction loss - h_device(p_vap)
p_vap = 0.61078 exp[17.27 × 28/(28 + 237.3)] kPa
Backwash flow = 4 m² × 37 m/h = 148 m³/h
Governing flow = max(171.4, 148) = 171.4 m³/h
```

Reference dirty head is about **17.432148 m**, head with the internal 10% allowance **19.175362 m**, NPSHa **9.064181 m**. The entered NPSHr of 3 m is illustrative only. No manufacturer curve or complete assurance checks are supplied, so the actual combined result correctly remains **INDETERMINATE**. Filter velocity 171.4/4 = **42.85 m/h** exceeds the current configured preliminary caps; the full application would need that failure resolved. A numerical match must never be described as a passing equipment selection.

## Sources and applicability

- [ASHRAE 2023 HVAC Applications, Chapter 6](https://handbook.ashrae.org/Handbooks/A23/SI/A23_Ch06/a23_ch06_si.aspx): named indoor evaporation relation and the distinction between water and room design.
- [ASHRAE 2025 Fundamentals, Chapter 4](https://handbook.ashrae.org/Handbooks/F25/SI/F25_Ch04/F25_Ch04_si.aspx): named heat-transfer relations. The fixed sky offset and pool application assumptions remain Lydmera assumptions.
- `docs/engineering-calculation-specification.md`, sections 13–15: controlled internal thermal/hydraulic worked arithmetic, source classification and scope limits; the Hazen–Williams equation and adapted fitting defaults here are internal reference arithmetic.
- [NASA POWER methodology](https://power.larc.nasa.gov/docs/methodology/): provenance for fetched archive conditions in the application. **These cases do not fetch or validate weather.**

## Reproduction in the source repository

```text
node --import tsx scripts/methodology-evidence/run.ts --check
```

This reruns the current engines, checks the comparisons and verifies that the published artifact matches the calculation source hashes. A source change fails the freshness check even if rounded results are unchanged. To regenerate **after reviewing any changes**, run the same command without `--check`. A failed numerical or assurance comparison stops generation. Update this evidence version when changing the case basis or references; do not adjust expected values merely to make a failing implementation agree.

`thermal-phase1-v2` is the thermal engine’s returned method identifier. `hazen-williams-fixed-duty-internal-v1` identifies this hydraulic case basis, not an independent manufacturer certification or a separately versioned production solver. Exact source hashes provide its implementation provenance. Deployment verification is separate: this artifact alone does not identify which release is live.
