Skip to content

Commit 5a1c025

Browse files
committed
Make synthetic thermal relationships explicit
1 parent dbdaf99 commit 5a1c025

9 files changed

Lines changed: 1969 additions & 1581 deletions

File tree

README.md

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,41 @@ an engineering software project.
1919
- Configurable sample count, interval, random seed, and ISO 8601 start time
2020
- CSV and JSON output
2121
- Scenario and ground-truth anomaly labels in every row
22-
- Coupled flow, pump, pressure-loss, heat-load, and temperature relationships
22+
- A clearly named `synthetic_heat_load_w` model input in every output row
23+
- Coupled flow, pump, resistance, pressure-loss, and temperature relationships
2324
- Fixed default start time and seeded randomness for full reproducibility
2425
- Committed example datasets and a matplotlib plotting script
2526

2627
## Technical approach
2728

2829
The simulator uses Python's standard `random.Random` class with a local seeded
29-
generator. Pump speed influences flow, pipe resistance and flow influence
30-
pressure loss, and the outlet temperature rise is calculated from a simplified
31-
heat balance using water's approximate specific heat. Each scenario changes a
32-
small number of those variables so its behavior remains understandable.
30+
generator. Each scenario first sets pump speed, relative hydraulic resistance,
31+
synthetic heat load, and any downstream delivery loss. The generator then
32+
calculates flow, pressure drop, and outlet temperature in that order. This keeps
33+
the reported pump, flow, and pressure values tied to one simplified model.
3334

34-
These relationships are simplified and are not a complete physical model.
35+
The core relationships are:
36+
37+
```text
38+
flow = 0.39 kg/s × (pump speed / 60%) × downstream delivery fraction
39+
/ sqrt(relative resistance) × (1 + seeded flow noise)
40+
41+
pressure drop = 35 kPa × relative resistance × (flow / 0.39 kg/s)²
42+
43+
temperature rise = synthetic_heat_load_w / (flow × 4180 J/(kg·K))
44+
```
45+
46+
Relative resistance is 1.0 in normal operation. Restricted-flow and
47+
pressure-drop-increase scenarios raise it; their synthetic pump controller also
48+
raises pump speed. Pump failure reduces commanded pump speed and the imposed
49+
heat load. The leak scenario reduces the fraction of flow delivered past the
50+
modeled leak location and lowers inlet pressure.
51+
52+
`synthetic_heat_load_w` is an imposed ground-truth value created by the model.
53+
It is not measured electrical power, a calibrated sensor reading, or evidence
54+
from real cooling equipment. The relationships above are intentionally
55+
simplified and are not a pump curve, hydraulic solver, or complete physical
56+
model.
3557

3658
## Installation
3759

@@ -84,8 +106,9 @@ Every output row contains:
84106

85107
```text
86108
timestamp, inlet_temperature_c, outlet_temperature_c, flow_rate_kg_s,
87-
inlet_pressure_kpa, outlet_pressure_kpa, relative_humidity_percent,
88-
pump_speed_percent, leak_detected, scenario, is_anomaly, anomaly_type
109+
synthetic_heat_load_w, inlet_pressure_kpa, outlet_pressure_kpa,
110+
relative_humidity_percent, pump_speed_percent, leak_detected, scenario,
111+
is_anomaly, anomaly_type
89112
```
90113

91114
Committed datasets:
@@ -95,7 +118,7 @@ Committed datasets:
95118
- `data/pump_failure.csv`
96119
- `data/leak_event.json`
97120

98-
Plot the restricted-flow dataset:
121+
Plot the restricted-flow dataset, including its imposed synthetic heat load:
99122

100123
```bash
101124
python examples/plot_session.py
@@ -111,22 +134,29 @@ python -m ruff check .
111134
python -m ruff format --check .
112135
```
113136

114-
The tests cover all scenarios, physical relationships, timestamps, file output,
115-
invalid inputs, CLI behavior, and exact reproducibility for equal seeds.
137+
The tests cover all eight scenarios, rounded heat-balance consistency, expected
138+
scenario trends, timestamps, file output, invalid inputs, CLI behavior, and
139+
exact reproducibility for equal seeds.
116140

117141
## Assumptions
118142

119143
- Water has a constant approximate specific heat of 4180 J/(kg·K).
120-
- A steady synthetic heat load is applied within each sample.
121-
- Flow is related to pump speed with small measurement noise.
122-
- Pressure loss follows a simplified resistance-times-flow-squared relationship.
144+
- The exported heat load is synthetic ground truth imposed by the generator.
145+
- Flow scales with pump speed and inverse square-root relative resistance, with
146+
small seeded noise.
147+
- Pressure loss follows a simplified relative-resistance-times-flow-squared
148+
relationship.
123149
- Scenario transitions are intentionally smooth enough to inspect in a chart.
124150

125151
## Limitations
126152

127153
- All values are synthetic and have not been measured on physical equipment.
128154
- The model omits control-loop dynamics, fluid-property variation, pipe geometry,
129-
sensor calibration curves, and detailed pump performance.
155+
sensor calibration curves, pump curves, and detailed pump performance.
156+
- Relative resistance and downstream delivery fraction are illustrative scenario
157+
controls, not identified parameters from real equipment.
158+
- The sensor-drift scenario deliberately biases reported outlet temperature, so
159+
its measured temperature rise no longer closes the underlying heat balance.
130160
- Ground-truth labels are known because the generator creates the anomalies; they
131161
do not represent the output of a detection algorithm.
132162
- The ranges are plausible examples, not specifications for a real system.

0 commit comments

Comments
 (0)