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,158 @@
# ExpansionValve (legacy, port-based)
Config type: `"ExpansionValve"`
Source: `crates/components/src/expansion_valve.rs`
> Distinct from `IsenthalpicExpansionValve` / `EXV`. Port-object based, with On/Off/Bypass operational states.
> Distinct de `IsenthalpicExpansionValve` / `EXV`. Basé sur objets Port, avec états On/Off/Bypass.
---
## EN
### Purpose & physical model
2-port isenthalpic throttling valve for refrigeration systems:
```
h_out = h_in (isenthalpic)
ṁ_out = ṁ_in (mass continuity, with z_flow scale)
P_out < P_in (throttling — pressure not closed by a flow law here)
Q = 0, W = 0 (adiabatic, no work)
```
Operational states:
| State | Behaviour |
|-------|-----------|
| **On** | isenthalpy + mass continuity |
| **Off** | zero mass flow (`opening` < 0.01 also forces off) |
| **Bypass** | adiabatic pipe: `P_out = P_in`, `h_out = h_in` |
`opening` does **not** enter the On residual set as a continuous flow coefficient; it only gates `is_effectively_off` below a 1 % threshold. For a free continuous opening + orifice law, use `IsenthalpicExpansionValve` with `orifice_kv`.
### Residuals & `n_equations()`
```
n_equations = 2 (always)
local state: state[0]=ṁ_in, state[1]=ṁ_out
```
| Row | On | Off | Bypass |
|-----|----|-----|--------|
| r0 | `h_out h_in` | `ṁ_in = 0` | `P_out P_in` (with isenthalpy pairing) |
| r1 | `ṁ_out z_flow·ṁ_in` | 0 | `h_out h_in` |
### Ports
| Role | Description |
|------|-------------|
| inlet | high pressure, typically subcooled liquid |
| outlet | low pressure, typically two-phase |
Type-state: `ExpansionValve<Disconnected>``.connect()``ExpansionValve<Connected>`.
### Calibration
| Factor | Effect | Default |
|--------|--------|---------|
| `z_flow` | `ṁ_eff = z_flow · ṁ_in` | **1.0** |
`set_calib_indices` supports a dynamic `z_flow` state index.
### Emergent pressure / orifice
**Not available** on this component. Prefer `"IsenthalpicExpansionValve"` / `"EXV"`.
### energy_transfers
`(Q, W) = (0, 0)` always.
### JSON parameters
| Key | Meaning | Unit | Default |
|-----|---------|------|---------|
| `fluid` | refrigerant | | **required** |
| `opening` | valve position (off if < 0.01) | | 1.0 |
| `p_inlet_bar` / `h_inlet_kj_kg` | inlet IC | bar / kJ/kg | 12.0 / 260.0 |
| `p_outlet_bar` / `h_outlet_kj_kg` | outlet IC | bar / kJ/kg | 3.5 / 260.0 |
### Known limitations
- Legacy port-based residual path; less integrated with CM1.4 edge ṁ sharing than EXV.
- No emergent-pressure or orifice actuator.
- Production cycles should use `IsenthalpicExpansionValve`.
---
## FR
### But & modèle physique
Vanne de laminage isenthalpique 2-port :
```
h_out = h_in
ṁ_out = ṁ_in (avec échelle z_flow)
Q = 0, W = 0
```
États opérationnels :
| État | Comportement |
|------|--------------|
| **On** | isenthalpie + continuité de masse |
| **Off** | débit nul (`opening` < 0.01 force aussi l'arrêt) |
| **Bypass** | tube adiabatique : `P_out = P_in`, `h_out = h_in` |
`opening` ne rentre **pas** dans les résidus On comme coefficient de débit continu ; il ne sert qu'au seuil d'arrêt. Pour une ouverture libre + orifice, utiliser `IsenthalpicExpansionValve` avec `orifice_kv`.
### Résiduels & `n_equations()`
```
n_equations = 2 (toujours)
état local : state[0]=ṁ_in, state[1]=ṁ_out
```
| Ligne | On | Off | Bypass |
|-------|----|-----|--------|
| r0 | `h_out h_in` | `ṁ_in = 0` | `P_out P_in` |
| r1 | `ṁ_out z_flow·ṁ_in` | 0 | `h_out h_in` |
### Ports
| Rôle | Description |
|------|-------------|
| entrée | haute pression, liquide sous-refroidi typique |
| sortie | basse pression, biphasique typique |
Typestate : `Disconnected``.connect()``Connected`.
### Calibration
| Facteur | Effet | Défaut |
|---------|-------|--------|
| `z_flow` | `ṁ_eff = z_flow · ṁ_in` | **1.0** |
### Pression émergente / orifice
**Non disponibles.** Préférer `"IsenthalpicExpansionValve"` / `"EXV"`.
### energy_transfers
`(Q, W) = (0, 0)` toujours.
### Paramètres JSON
| Clé | Signification | Unité | Défaut |
|-----|---------------|-------|--------|
| `fluid` | frigorigène | | **requis** |
| `opening` | position (off si < 0.01) | | 1.0 |
| `p_inlet_bar` / `h_inlet_kj_kg` | CI entrée | bar / kJ/kg | 12.0 / 260.0 |
| `p_outlet_bar` / `h_outlet_kj_kg` | CI sortie | bar / kJ/kg | 3.5 / 260.0 |
### Limites connues
- Chemin legacy port-object, moins intégré au partage ṁ CM1.4 que l'EXV.
- Pas de pression émergente ni d'actionneur orifice.
- Les cycles de production doivent utiliser `IsenthalpicExpansionValve`.