diff --git a/README.md b/README.md index 0795be1..b33de32 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ cargo run -p entropyk-cli -- run \ --output result.json ``` -Sortie console : statut (converged / non-converged / timeout), résidu final, nombre d'itérations, temps de calcul, équilibre DoF, états des arêtes (pression en bar, enthalpie en kJ/kg) et performances (puissance frigorifique, puissance absorbée, COP). +Sortie console : statut (converged / non-converged / timeout), résidu final, nombre d'itérations, temps de calcul, équilibre DoF, états des tronçons (pression en bar, enthalpie en kJ/kg) et performances (puissance frigorifique, puissance absorbée, COP). --- @@ -111,7 +111,7 @@ Config JSON / SystemBuilder / UI web create_component -> System (graphe) | v - finalize() + porte DoF -> vecteur d'état [débit, pression, enthalpie] par arête + finalize() + porte DoF -> vecteur d'état [débit, pression, enthalpie] par tronçon | v Newton / Picard / fallback @@ -124,17 +124,23 @@ Config JSON / SystemBuilder / UI web ## 5. Le modèle : composants et câblage -### Vecteur d'état +### Ce que le solveur cherche -Chaque **arête** du graphe (une liaison entre deux ports) porte trois inconnues : +Pour chaque tuyau reliant deux composants, le solveur doit trouver trois valeurs : -| Rang | Grandeur | Unité SI | -|------|----------|----------| -| 0 | débit massique ṁ | kg/s | -| 1 | pression P | Pa | -| 2 | enthalpie massique h | J/kg | +| Grandeur | Unité SI | Sens | +|----------|----------|------| +| débit massique ṁ | kg/s | combien de frigorigène circule | +| pression P | Pa | pression régnant dans ce tronçon | +| enthalpie massique h | J/kg | énergie portée par le fluide | -Sur une branche série (un composant à une entrée et une sortie), les arêtes partagent généralement le **même débit** ṁ : le solveur fusionne alors ces inconnues et réduit la taille du système. +Ces trois valeurs sont les **inconnues** du système. Le moteur en assemble une liste (le « vecteur d'état ») et cherche les valeurs qui annulent toutes les équations en même temps. + +### Une seule variable de débit pour toute la boucle + +Dans un cycle simple, les composants sont branchés en boucle les uns derrière les autres, sans bifurcation : le frigorigène qui sort du compresseur entre intégralement dans le condenseur, puis dans le détendeur, puis dans l'évaporateur, puis revient au compresseur. Le débit est donc **le même partout dans la boucle**. + +Plutôt que d'avoir une variable de débit par tuyau, le solveur en utilise **une seule pour toute la boucle**. Cela réduit le nombre d'inconnues et accélère la résolution. (S'il y a un branchement — débit qui se partage entre deux circuits — alors chaque branche reçoit sa propre variable de débit.) ### Câblage @@ -144,7 +150,8 @@ Les liaisons s'écrivent `nom:port`. Par exemple : { "from": "comp:outlet", "to": "cond:inlet" } ``` -Le moteur construit le graphe, attribue un index à chaque inconnue d'arête, puis assemble résidus et jacobienne. +Le moteur construit le graphe à partir de ces liaisons, puis assemble les équations de chaque composant et leurs dérivées. + --- @@ -181,6 +188,8 @@ Tolérance typique : `1e-6`. Itérations : `300` par défaut ; à augmenter pour ### Boucle de résolution +Un **résidu** est l'écart entre le membre gauche et le membre droit d'une équation : il vaut zéro quand l'équation est satisfaite. Le but du solveur est de rendre tous les résidus nuls en même temps. La **matrice jacobienne** est l'ensemble des dérivées des résidus par rapport aux inconnues ; elle indique dans quelle direction corriger les inconnues. + ```text 1. Estimation initiale (frontières + pressions haute/basse initialisées par étages si emergent_pressure) 2. Calcul des résidus r(x) de tous les composants @@ -446,11 +455,11 @@ cargo run -p entropyk-cli -- schema -o model-ir.schema.json 1. Lecture de `ScenarioConfig`. 2. Pour chaque composant : `create_component(...)` (CoolProp, params, modes orifice / emergent). -3. Ajout des arêtes nommées `nom:port`. +3. Ajout des liaisons nommées `nom:port`. 4. `finalize()` + contrôle DoF (système carré obligatoire). 5. Estimation initiale (frontières + pressions par étages). 6. Résolution selon `solver.strategy`. -7. Sérialisation JSON : états d'arêtes, performances, `dof`, `failure_diagnostics` en cas d'échec. +7. Sérialisation JSON : états des tronçons, performances, `dof`, `failure_diagnostics` en cas d'échec. ### Contrôles (régulation / calibration)