Add diagram workbench UI with Modelica DoF coaching and ISO glyphs.

Ship the Next.js cycle editor with CAD chrome, technical HX symbols, Fixed/Free boundary guidance, and secondary water/air pressure drop support in the solver stack.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-17 22:46:46 +02:00
parent 62efea0646
commit 3358b74342
275 changed files with 70187 additions and 5230 deletions

View File

@@ -0,0 +1,214 @@
# IsentropicCompressor
Config type: `"IsentropicCompressor"`
Source: `crates/components/src/isentropic_compressor.rs`
---
## EN
### Purpose & physical model
Vapor-compression compressor for cycle simulation. Two operating families:
| Mode | When | Mass / pressure behaviour |
|------|------|---------------------------|
| **Fixed-pressure** (default) | `emergent_pressure: false` | Pins `P_dis = P_sat(T_cond)`; mass continuity across suction/discharge |
| **Emergent-pressure** | `emergent_pressure: true` | Closes ṁ with a **volumetric displacement law**; `P_dis` floats from the condenser ↔ secondary balance |
True isentropic path via CoolProp: `(P,h)→s` then `(P,s)→h_is`, corrected by isentropic efficiency:
```
h_dis = h_suc + (h_is h_suc) / η_is,eff
```
Swept mass flow (emergent only):
```
ṁ_calc = ρ_suc · V_s · N · η_vol(P_dis/P_suc) · f_VSD,vol
ṁ = σ · z_flow · ṁ_calc
```
Volumetric efficiency models:
| Model | Formula |
|-------|---------|
| Constant | `η_vol = const` (default 1.0) |
| Clearance | `η_vol = 1 + C C · (P_dis/P_suc)^(1/n)` |
Optional **VSD speed map** (quadratic, identity default `[1,0,0]`):
```
f(r) = c0 + c1·r + c2·r² , r = N / N_ref , clamped ∈ [0.1, 1.2]
η_vol,eff = η_vol · f_vol(r) ; η_is,eff = η_is · f_is(r)
```
Optional **liquid injection** desuperheat (no extra equation; φ from controls):
```
h_dis,eff = h_dis φ_inj · (h_dis h_f(P_dis)) , φ_inj ∈ [0, φ_max]
```
Design anchors `t_cond_k`, `t_evap_k`, `superheat_k` are used for fixed-pressure pins and as initial-condition helpers; in emergent mode the live suction `(P,h)` drives the isentropic path.
### Residuals & `n_equations()`
```
n_equations = (2 if same_branch else 3) + (1 if slide_valve active else 0)
```
| Row | Fixed-pressure | Emergent-pressure |
|-----|----------------|-------------------|
| r0 | `P_dis P_sat(T_cond)` | `ṁ σ·z_flow·ṁ_calc` |
| r1 | `H_dis h_dis` | `H_dis h_dis,eff` |
| r2 | `ṁ_dis ṁ_suc` (dropped if same-branch) | same |
| r3 | — | (slide) `T_sat(P_suc) SST_target` |
### Ports
| Index | Role |
|-------|------|
| 0 | suction (inlet) |
| 1 | discharge (outlet) |
Edge-wired via `set_system_context` (CM1.3 ṁ/P/h triples). `get_ports()` may be empty.
### Emergent pressure & actuators
- Requires `displacement_m3` and `speed_hz` when `emergent_pressure: true`.
- **Slide valve** (`slide_valve_sst_target_k` / `_c`): free actuator σ ∈ [σ_min, 1] scales swept volume and holds SST.
- **Liquid injection** (`liquid_injection: true`): φ_inj on the `actuator` / control factor `"injection"`; closing equation from a user `controls[]` loop (e.g. max DGT), not hard-coded.
### Calibration
| Factor | Effect | Default |
|--------|--------|---------|
| `z_flow` | scales swept ṁ (emergent r0) | **1.0** |
| `actuator` | slide σ **or** injection φ | |
### measure_output / energy_transfers
- `measure_output(Temperature)` → discharge gas temperature (DGT) for injection control.
- `energy_transfers`: `(Q, W) = (0, −ṁ·(h_dis,work h_suc))` — adiabatic; shaft work negative. With liquid injection, work uses un-desuperheated compression enthalpy.
### JSON parameters
| Key | Meaning | Unit | Default |
|-----|---------|------|---------|
| `isentropic_efficiency` | η_is | | 0.75 |
| `t_cond_k` | condensing sat. T (fixed pin / design) | K | 323.15 |
| `t_evap_k` | evaporating sat. T (design) | K | 275.15 |
| `superheat_k` | suction superheat design | K | 5.0 |
| `fluid` | refrigerant | | primary |
| `emergent_pressure` | enable displacement closure | bool | false |
| `displacement_m3` | swept volume V_s | m³/rev | 0.0 |
| `speed_hz` | rotational speed N | rev/s | 0.0 |
| `volumetric_efficiency` | constant η_vol | | 1.0 |
| `clearance` | clearance ratio C (enables clearance model) | | |
| `polytropic_n` | re-expansion exponent | | 1.1 |
| `vsd_reference_speed_hz` | VSD N_ref (enables map) | rev/s | |
| `vsd_volumetric_coeffs` | `[c0,c1,c2]` η_vol map | | [1,0,0] |
| `vsd_isentropic_coeffs` | `[c0,c1,c2]` η_is map | | [1,0,0] |
| `slide_valve_sst_target_k` / `_c` | slide SST setpoint | K / °C | |
| `liquid_injection` | enable injection desuperheat | bool | false |
| `slide_position_init` / `min` / `max` | free-actuator bounds | | 1.0 / 0.1 / 1.0 |
### Notes
Preferred cycle compressor for physics-based machines. For manufacturer AHRI maps use `"Compressor"`; for economized screws use `"ScrewEconomizerCompressor"`.
---
## FR
### But & modèle physique
Compresseur à compression de vapeur. Deux familles de fonctionnement :
| Mode | Quand | Comportement |
|------|-------|--------------|
| **Pression fixée** (défaut) | `emergent_pressure: false` | Impose `P_dis = P_sat(T_cond)` ; continuité de masse |
| **Pression émergente** | `emergent_pressure: true` | Ferme ṁ par une **loi volumétrique** ; `P_dis` flotte via le condenseur |
Chemin isentropique CoolProp + rendement :
```
h_dis = h_suc + (h_is h_suc) / η_is,eff
```
Débit balayé (émergent) :
```
ṁ_calc = ρ_suc · V_s · N · η_vol(P_dis/P_suc) · f_VSD,vol
ṁ = σ · z_flow · ṁ_calc
```
Modèles de rendement volumétrique : constant, ou volume mort `η_vol = 1 + C C·Pr^(1/n)`.
Carte VSD optionnelle (quadratique, identité `[1,0,0]`).
Injection liquide optionnelle : `h_dis,eff = h_dis φ_inj·(h_dis h_f(P_dis))` (pas d'équation interne).
### Résiduels & `n_equations()`
```
n_equations = (2 si même branche sinon 3) + (1 si tiroir actif)
```
| Ligne | Pression fixée | Pression émergente |
|-------|----------------|--------------------|
| r0 | `P_dis P_sat(T_cond)` | `ṁ σ·z_flow·ṁ_calc` |
| r1 | `H_dis h_dis` | `H_dis h_dis,eff` |
| r2 | `ṁ_dis ṁ_suc` (supprimée si même branche) | idem |
| r3 | — | (tiroir) `T_sat(P_suc) SST_cible` |
### Ports
| Index | Rôle |
|-------|------|
| 0 | aspiration (entrée) |
| 1 | refoulement (sortie) |
Câblage par arêtes (`set_system_context`, triples ṁ/P/h CM1.3).
### Pression émergente & actionneurs
- `displacement_m3` et `speed_hz` obligatoires en mode émergent.
- **Tiroir** (`slide_valve_sst_target_k` / `_c`) : actionneur libre σ pour tenir la SST.
- **Injection liquide** : φ_inj via boucle `controls[]` (ex. DGT max), facteur `"injection"`.
### Calibration
| Facteur | Effet | Défaut |
|---------|-------|--------|
| `z_flow` | échelle le débit balayé | **1.0** |
| `actuator` | position tiroir σ **ou** ratio d'injection φ | |
### measure_output / energy_transfers
- `Temperature` → température des gaz de refoulement (DGT).
- `(Q, W) = (0, −ṁ·(h_dis,work h_suc))` — adiabatique ; travail sur le compresseur négatif.
### Paramètres JSON
| Clé | Signification | Unité | Défaut |
|-----|---------------|-------|--------|
| `isentropic_efficiency` | η_is | | 0.75 |
| `t_cond_k` | T sat. condensation (pin / design) | K | 323.15 |
| `t_evap_k` | T sat. évaporation (design) | K | 275.15 |
| `superheat_k` | surchauffe aspiration design | K | 5.0 |
| `fluid` | fluide frigorigène | | primaire |
| `emergent_pressure` | active la fermeture volumétrique | bool | false |
| `displacement_m3` | cylindrée V_s | m³/tr | 0.0 |
| `speed_hz` | vitesse N | tr/s | 0.0 |
| `volumetric_efficiency` | η_vol constant | | 1.0 |
| `clearance` | rapport volume mort C | | |
| `polytropic_n` | exposant de détente | | 1.1 |
| `vsd_reference_speed_hz` | N_ref carte VSD | tr/s | |
| `vsd_volumetric_coeffs` | `[c0,c1,c2]` carte η_vol | | [1,0,0] |
| `vsd_isentropic_coeffs` | `[c0,c1,c2]` carte η_is | | [1,0,0] |
| `slide_valve_sst_target_k` / `_c` | consigne SST tiroir | K / °C | |
| `liquid_injection` | active la désurchauffe par injection | bool | false |
| `slide_position_init` / `min` / `max` | bornes actionneur libre | | 1.0 / 0.1 / 1.0 |
### Notes
Compresseur de cycle préféré pour les machines physiques. Cartes fabricant AHRI → `"Compressor"` ; vis économisée → `"ScrewEconomizerCompressor"`.