docs: initialize project wiki from production hardening session
12 pages covering architecture, findings, and metrics from the
rotatingMachine + machineGroupControl hardening work:
- Overview: node inventory, what works/doesn't, current scale
- Architecture: 3D pump curves, group optimization algorithm
- Findings: BEP-Gravitation proof (0.1% of optimum), NCog behavior,
curve non-convexity, pump switching stability
- Metrics: test counts, power comparison table, performance numbers
- Knowledge graph: structured YAML with all data points and provenance
- Session log: 2026-04-07 production hardening
- Tools: query.py, search.sh, lint.sh
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:36:08 +02:00
|
|
|
|
---
|
|
|
|
|
|
title: 3D Pump Curve Architecture
|
|
|
|
|
|
created: 2026-04-07
|
|
|
|
|
|
updated: 2026-04-07
|
|
|
|
|
|
status: proven
|
|
|
|
|
|
tags: [predict, curves, interpolation, rotatingMachine]
|
|
|
|
|
|
sources: [nodes/generalFunctions/src/predict/predict_class.js, nodes/rotatingMachine/src/specificClass.js]
|
|
|
|
|
|
---
|
|
|
|
|
|
|
wiki: audit + archive stale pages; refresh Home for 2026-05-11 wave
- Archived 20 pre-refactor pages to wiki/Archive/ with standard banners:
- All 6 architecture/ pages (old _loadConfig/_setupSpecificClass internals,
pre-refactor S88 hierarchy, deployment blueprint)
- All 3 sessions/ logs (Apr-07 + Apr-13 session summaries)
- findings/open-issues-2026-03.md (issues 1-5 all resolved by refactor)
- concepts/generalfunctions-api.md (missing BaseDomain/BaseNodeAdapter)
- concepts/sources-readme.md (empty PDF placeholder, never populated)
- manuals/nodes/rotatingMachine.md + measurement.md (superseded by per-repo wikis)
- Top-level SCHEMA.md, index.md, log.md, metrics.md, overview.md,
knowledge-graph.yaml (all Apr-07 snapshot, pre-refactor)
- Kept wiki/concepts/ domain pages (ASM, PID, pump-affinity, settling, etc.)
- Kept wiki/findings/ proven results (BEP, NCog, curve-non-convexity, stability)
- Kept wiki/manuals/node-red/* (FlowFuse + Node-RED runtime docs, still current)
- Kept wiki/tools/* (utility scripts)
- Updated wiki/Archive.md index with 20 rows
- Fixed wiki/Home.md: Tier 6 was wrongly marked done; corrected to pending;
Tier 9 updated to reflect 2026-05-11 in-progress wave
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 21:07:48 +02:00
|
|
|
|
> **⚠️ ARCHIVED — pre-refactor (Tier 1–4, 2026-05)**
|
|
|
|
|
|
>
|
|
|
|
|
|
> This page describes the architecture before the platform refactor.
|
|
|
|
|
|
> The current page is the per-node wiki on **[gitea.wbd-rd.nl/RnD](https://gitea.wbd-rd.nl/RnD)** or **[Home](../Home)**.
|
|
|
|
|
|
>
|
|
|
|
|
|
> Kept for historical reference only. **Do not update.**
|
|
|
|
|
|
|
|
|
|
|
|
|
docs: initialize project wiki from production hardening session
12 pages covering architecture, findings, and metrics from the
rotatingMachine + machineGroupControl hardening work:
- Overview: node inventory, what works/doesn't, current scale
- Architecture: 3D pump curves, group optimization algorithm
- Findings: BEP-Gravitation proof (0.1% of optimum), NCog behavior,
curve non-convexity, pump switching stability
- Metrics: test counts, power comparison table, performance numbers
- Knowledge graph: structured YAML with all data points and provenance
- Session log: 2026-04-07 production hardening
- Tools: query.py, search.sh, lint.sh
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:36:08 +02:00
|
|
|
|
# 3D Pump Curve Prediction
|
|
|
|
|
|
|
|
|
|
|
|
## Data Structure
|
|
|
|
|
|
A family of 2D curves indexed by pressure (f-dimension):
|
|
|
|
|
|
- **X-axis**: control position (0-100%)
|
|
|
|
|
|
- **Y-axis**: flow (nq) or power (np) in canonical units
|
|
|
|
|
|
- **F-dimension**: pressure (Pa) — the 3rd dimension
|
|
|
|
|
|
|
|
|
|
|
|
Raw curves are in curve units (m3/h, kW, mbar). `_normalizeMachineCurve()` converts to canonical (m3/s, W, Pa).
|
|
|
|
|
|
|
|
|
|
|
|
## Interpolation
|
|
|
|
|
|
Monotonic cubic spline (Fritsch-Carlson) in both dimensions:
|
|
|
|
|
|
- **X-Y splines**: at each discrete pressure level
|
|
|
|
|
|
- **F-splines**: across pressure levels for intermediate pressure interpolation
|
|
|
|
|
|
|
|
|
|
|
|
## Prediction Flow
|
|
|
|
|
|
```
|
|
|
|
|
|
predict.y(x):
|
|
|
|
|
|
1. Clamp x to [currentFxyXMin, currentFxyXMax]
|
|
|
|
|
|
2. Normalize x to [normMin, normMax]
|
|
|
|
|
|
3. Evaluate spline at normalized x for current fDimension
|
|
|
|
|
|
4. Return y in canonical units (m3/s or W)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Unit Conversion Chain
|
|
|
|
|
|
```
|
|
|
|
|
|
Raw curve (m3/h, kW, mbar)
|
|
|
|
|
|
→ _normalizeMachineCurve → canonical (m3/s, W, Pa)
|
|
|
|
|
|
→ predict class → canonical output
|
|
|
|
|
|
→ MeasurementContainer.getCurrentValue(outputUnit) → output units
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
No double-conversion. Clean separation: specificClass handles units, predict handles normalization/interpolation.
|
|
|
|
|
|
|
|
|
|
|
|
## Three Predict Instances per Machine
|
|
|
|
|
|
- `predictFlow`: control % → flow (nq curve)
|
|
|
|
|
|
- `predictPower`: control % → power (np curve)
|
|
|
|
|
|
- `predictCtrl`: flow → control % (reversed nq curve)
|
|
|
|
|
|
|
|
|
|
|
|
## Boundary Behavior
|
|
|
|
|
|
- Below/above curve X range: flat extrapolation (clamped)
|
|
|
|
|
|
- Below/above f-dimension range: clamped to min/max pressure level
|
|
|
|
|
|
|
|
|
|
|
|
## Performance
|
|
|
|
|
|
- `y(x)`: O(log n), effectively O(1) for 5-10 data points
|
|
|
|
|
|
- `buildAllFxyCurves`: sub-10ms for typical curves
|
|
|
|
|
|
- Full caching of normalized curves, splines, and calculated curves
|