Entropyk/demo/macro_chiller_schema.html
2026-02-21 10:43:55 +01:00

910 lines
37 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Entropyk — FlowSplitter & FlowMerger Schema</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
:root {
--bg: #0d1117;
--surface: #161b22;
--border: #30363d;
--text: #e6edf3;
--dim: #7d8590;
--cyan: #39d0d8;
--cyan-bg: rgba(57, 208, 216, .06);
--green: #3fb950;
--green-bg: rgba(63, 185, 80, .06);
--orange: #f0883e;
--orange-bg: rgba(240, 136, 62, .06);
--blue: #58a6ff;
--blue-bg: rgba(88, 166, 255, .06);
--purple: #bc8cff;
--purple-bg: rgba(188, 140, 255, .06);
--red: #f85149;
--yellow: #e3b341;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: var(--bg);
color: var(--text);
font-family: 'Inter', sans-serif;
min-height: 100vh;
padding: 40px 20px 80px;
display: flex;
flex-direction: column;
align-items: center;
}
h1 {
font-size: 1.5rem;
font-weight: 700;
color: var(--cyan);
margin-bottom: 4px;
letter-spacing: -.5px;
}
.sub {
font-size: .82rem;
color: var(--dim);
margin-bottom: 40px;
}
.page {
width: 100%;
max-width: 1080px;
display: flex;
flex-direction: column;
gap: 28px;
}
/* ── Section ── */
section {
width: 100%;
}
section h2 {
font-size: .75rem;
text-transform: uppercase;
letter-spacing: .1em;
color: var(--dim);
font-weight: 600;
border-bottom: 1px solid var(--border);
padding-bottom: 8px;
margin-bottom: 16px;
}
/* ── Legend ── */
.legend {
display: flex;
flex-wrap: wrap;
gap: 18px;
justify-content: center;
margin-bottom: 36px;
}
.leg {
display: flex;
align-items: center;
gap: 7px;
font-size: .74rem;
color: var(--dim);
}
.leg-dot {
width: 11px;
height: 11px;
border-radius: 3px;
border: 2px solid;
flex-shrink: 0;
}
/* ── Main flow diagram ── */
.flow-diagram {
border: 2px solid var(--cyan);
border-radius: 14px;
background: var(--cyan-bg);
padding: 28px 24px 32px;
position: relative;
}
.flow-diagram>.blabel {
position: absolute;
top: -13px;
left: 22px;
background: var(--bg);
padding: 0 10px;
font-size: .72rem;
font-weight: 600;
color: var(--cyan);
letter-spacing: .07em;
text-transform: uppercase;
}
/* layout grid: col1=source | col2=splitter | col3=branches | col4=merger | col5=dest */
.flow-grid {
display: grid;
grid-template-columns: auto auto 1fr auto auto;
column-gap: 0;
align-items: center;
}
/* ── Node cards ── */
.node {
border: 2px solid var(--border);
border-radius: 10px;
background: var(--surface);
padding: 10px 14px;
text-align: center;
min-width: 80px;
cursor: default;
transition: transform .18s, box-shadow .18s;
position: relative;
}
.node:hover {
transform: translateY(-3px);
box-shadow: 0 8px 24px rgba(0, 0, 0, .5);
}
.node .nm {
font-size: .78rem;
font-weight: 600;
}
.node .ty {
font-size: .62rem;
color: var(--dim);
margin-top: 2px;
font-family: 'JetBrains Mono', monospace;
}
.node .eq {
font-size: .6rem;
color: var(--dim);
background: rgba(255, 255, 255, .04);
border: 1px solid var(--border);
border-radius: 3px;
padding: 1px 5px;
margin-top: 4px;
display: inline-block;
}
.node .vals {
font-size: .6rem;
font-family: 'JetBrains Mono', monospace;
color: var(--cyan);
margin-top: 4px;
line-height: 1.5;
}
.node.source {
border-color: var(--green);
background: var(--green-bg);
}
.node.dest {
border-color: var(--green);
background: var(--green-bg);
}
.node.splitter {
border-color: var(--blue);
background: var(--blue-bg);
}
.node.merger {
border-color: var(--blue);
background: var(--blue-bg);
}
.node.macro {
border-color: var(--orange);
background: var(--orange-bg);
}
/* ── Arrows ── */
.arr {
display: flex;
flex-direction: column;
align-items: center;
min-width: 52px;
flex-shrink: 0;
}
.arr-line {
width: 100%;
height: 2px;
background: linear-gradient(90deg, var(--border), var(--dim));
position: relative;
}
.arr-line::after {
content: '';
position: absolute;
right: -1px;
top: -4px;
border: 5px solid transparent;
border-left-color: var(--dim);
}
.arr-lbl {
font-size: .58rem;
color: var(--dim);
font-family: 'JetBrains Mono', monospace;
margin-top: 3px;
white-space: nowrap;
}
/* ── Fork / Join SVG wrappers ── */
.fork-col {
display: flex;
align-items: center;
}
/* ── Parallel branches column ── */
.branches-col {
display: flex;
flex-direction: column;
gap: 10px;
}
.branch {
display: flex;
align-items: center;
}
/* ── MacroComponent (chiller) card ── */
.macro-wrap {
border: 2px solid var(--orange);
border-radius: 10px;
background: var(--orange-bg);
padding: 14px 14px 10px;
position: relative;
min-width: 260px;
}
.macro-wrap .blabel {
position: absolute;
top: -11px;
left: 12px;
background: var(--bg);
padding: 0 7px;
font-size: .64rem;
font-weight: 600;
color: var(--orange);
letter-spacing: .06em;
text-transform: uppercase;
}
.macro-inner-row {
display: flex;
align-items: center;
gap: 0;
justify-content: center;
}
.mini-node {
border: 1px solid var(--border);
border-radius: 7px;
background: var(--surface);
padding: 6px 9px;
text-align: center;
min-width: 56px;
}
.mini-node .nm {
font-size: .65rem;
font-weight: 600;
}
.mini-node .ty {
font-size: .55rem;
color: var(--dim);
}
.mini-arr {
width: 28px;
height: 2px;
background: var(--dim);
position: relative;
flex-shrink: 0;
}
.mini-arr::after {
content: '';
position: absolute;
right: -1px;
top: -4px;
border: 4px solid transparent;
border-left-color: var(--dim);
}
.back-svg {
display: block;
margin: 2px auto 0;
}
/* ── Port badges ── */
.port-badge {
display: inline-flex;
align-items: center;
gap: 3px;
font-size: .58rem;
font-family: 'JetBrains Mono', monospace;
color: var(--cyan);
background: rgba(57, 208, 216, .08);
border: 1px solid rgba(57, 208, 216, .3);
border-radius: 100px;
padding: 1px 7px;
margin: 2px 0;
white-space: nowrap;
}
/* ── Info cards ── */
.info-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
gap: 14px;
}
.icard {
border: 1px solid var(--border);
border-radius: 10px;
background: var(--surface);
padding: 14px;
}
.icard h3 {
font-size: .7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: .08em;
color: var(--dim);
border-bottom: 1px solid var(--border);
padding-bottom: 7px;
margin-bottom: 9px;
}
.irow {
display: flex;
justify-content: space-between;
align-items: center;
font-size: .75rem;
padding: 3px 0;
}
.irow .k {
color: var(--dim);
}
.irow .v {
font-family: 'JetBrains Mono', monospace;
font-size: .7rem;
}
.v.g {
color: var(--green);
}
.v.c {
color: var(--cyan);
}
.v.o {
color: var(--orange);
}
.v.b {
color: var(--blue);
}
/* ── Equations box ── */
.eq-box {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 10px;
padding: 18px 20px;
}
.eq-table {
width: 100%;
border-collapse: collapse;
font-size: .75rem;
}
.eq-table th {
text-align: left;
font-weight: 600;
font-size: .68rem;
color: var(--dim);
text-transform: uppercase;
letter-spacing: .07em;
padding: 0 8px 10px;
border-bottom: 1px solid var(--border);
}
.eq-table td {
padding: 5px 8px;
font-family: 'JetBrains Mono', monospace;
font-size: .7rem;
}
.eq-table tr:not(:last-child) td {
border-bottom: 1px solid rgba(48, 54, 61, .5);
}
.eq-table .cat {
color: var(--dim);
font-family: 'Inter', sans-serif;
font-size: .72rem;
}
.eq-table .formula {
color: var(--cyan);
}
.eq-table .result {
color: var(--green);
text-align: right;
}
/* ── State vec ── */
.sv {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-top: 10px;
}
.sv-c {
font-family: 'JetBrains Mono', monospace;
font-size: .62rem;
padding: 3px 6px;
border-radius: 4px;
border: 1px solid;
}
.sv-c.sp {
border-color: var(--blue);
color: var(--blue);
background: rgba(88, 166, 255, .05);
}
.sv-c.ma {
border-color: var(--orange);
color: var(--orange);
background: rgba(240, 136, 62, .05);
}
.sv-c.mb {
border-color: var(--purple);
color: var(--purple);
background: rgba(188, 140, 255, .05);
}
/* ── Tooltip ── */
[data-tip] {
position: relative;
}
[data-tip]:hover::after {
content: attr(data-tip);
position: absolute;
bottom: calc(100% + 8px);
left: 50%;
transform: translateX(-50%);
background: #1c2128;
border: 1px solid var(--border);
color: var(--text);
font-size: .68rem;
font-family: 'JetBrains Mono', monospace;
padding: 6px 10px;
border-radius: 6px;
white-space: pre;
z-index: 100;
pointer-events: none;
box-shadow: 0 8px 24px rgba(0, 0, 0, .5);
}
</style>
</head>
<body>
<h1>⚙ Entropyk — FlowSplitter & FlowMerger</h1>
<p class="sub">Deux chillers R410A Eurovent A7/W35 en parallèle avec vrais composants de jonction</p>
<!-- Legend -->
<div class="legend">
<div class="leg">
<div class="leg-dot" style="border-color:var(--green)"></div>Source / Dest (eau)
</div>
<div class="leg">
<div class="leg-dot" style="border-color:var(--blue)"></div>FlowSplitter / FlowMerger
</div>
<div class="leg">
<div class="leg-dot" style="border-color:var(--orange)"></div>MacroComponent (Chiller)
</div>
<div class="leg">
<div class="leg-dot" style="border-color:var(--cyan)"></div>Bord / état (P, h)
</div>
</div>
<div class="page">
<!-- ═══ TOPOLOGIE ═══ -->
<section>
<h2>Topologie du système parent</h2>
<div class="flow-diagram">
<span class="blabel">ParentSystem · R410A compressible · 4 bords · 26 equations</span>
<div style="display:flex;align-items:center;gap:0;justify-content:center;flex-wrap:nowrap;">
<!-- Source -->
<div class="node source" style="flex-shrink:0"
data-tip="Source / Évaporateur ville&#10;Eau froide : 7°C→12°C&#10;P = 3 bar, h = 29.4 kJ/kg">
<div class="nm">🟢 Source</div>
<div class="ty">eau froide</div>
<div class="vals">3.0 bar<br>29.4 kJ/kg</div>
</div>
<!-- Arrow e0 -->
<div class="arr">
<div class="arr-line"></div>
<div class="arr-lbl">e0 · R410A</div>
</div>
<!-- FlowSplitter -->
<div class="node splitter" style="flex-shrink:0"
data-tip="FlowSplitter::compressible(&quot;R410A&quot;)&#10;1 entrée → 2 sorties&#10;n_eq = 2·21 = 3&#10;Isobare + isenthalpique&#10;P_out_k = P_in&#10;h_out_k = h_in">
<div class="nm">🔀 Splitter</div>
<div class="ty">FlowSplitter</div>
<div class="eq">3 éq.</div>
<div class="vals">24.0 bar<br>465 kJ/kg</div>
</div>
<!-- Fork SVG + branches -->
<div style="position:relative;display:flex;align-items:center;">
<!-- Fork lines -->
<svg width="36" height="120" style="flex-shrink:0">
<line x1="4" y1="18" x2="4" y2="102" stroke="#7d8590" stroke-width="2" />
<line x1="4" y1="24" x2="36" y2="24" stroke="#7d8590" stroke-width="2" />
<polygon points="31,19 36,24 31,29" fill="#7d8590" />
<line x1="4" y1="96" x2="36" y2="96" stroke="#7d8590" stroke-width="2" />
<polygon points="31,91 36,96 31,101" fill="#7d8590" />
<text x="5" y="14" fill="#7d8590" font-size="8" font-family="JetBrains Mono">e1</text>
<text x="5" y="112" fill="#7d8590" font-size="8" font-family="JetBrains Mono">e2</text>
</svg>
<!-- Two chiller branches -->
<div class="branches-col">
<!-- Branch A -->
<div class="branch">
<div class="macro-wrap"
data-tip="MacroComponent Chiller A&#10;4 composants internes (R410A)&#10;7 éq. internes + 4 couplages = 11 éq.">
<span class="blabel">MacroComponent — Chiller A</span>
<div
style="display:flex;align-items:center;justify-content:center;gap:4px;margin-bottom:8px">
<span class="port-badge">↘ refrig_in · 24 bar · 465 kJ/kg</span>
</div>
<div class="macro-inner-row">
<div class="mini-node" style="border-color:var(--purple)">
<div class="nm">🔵 Comp.</div>
<div class="ty">2 éq.</div>
</div>
<div class="mini-arr"></div>
<div class="mini-node" style="border-color:var(--red)">
<div class="nm">🔴 Cond.</div>
<div class="ty">2 éq.</div>
</div>
<div class="mini-arr"></div>
<div class="mini-node" style="border-color:var(--yellow)">
<div class="nm">🟡 EXV</div>
<div class="ty">1 éq.</div>
</div>
<div class="mini-arr"></div>
<div class="mini-node" style="border-color:var(--green)">
<div class="nm">🟢 Évap.</div>
<div class="ty">2 éq.</div>
</div>
</div>
<svg class="back-svg" width="260" height="18">
<line x1="248" y1="5" x2="12" y2="5" stroke="#7d8590" stroke-width="1.5"
stroke-dasharray="4,3" />
<polygon points="16,1 12,5 16,9" fill="#7d8590" />
<text x="130" y="16" fill="#7d8590" font-size="8" font-family="JetBrains Mono"
text-anchor="middle">retour · 8.5 bar · 425 kJ/kg</text>
</svg>
<div
style="display:flex;align-items:center;justify-content:center;gap:4px;margin-top:6px">
<span class="port-badge">↗ refrig_out · 8.5 bar · 260 kJ/kg</span>
</div>
</div>
</div>
<!-- Branch B -->
<div class="branch">
<div class="macro-wrap" style="border-color:var(--purple)"
data-tip="MacroComponent Chiller B&#10;(identique à Chiller A)&#10;11 équations totales">
<span class="blabel" style="color:var(--purple)">MacroComponent — Chiller B</span>
<div
style="display:flex;align-items:center;justify-content:center;gap:4px;margin-bottom:8px">
<span class="port-badge"
style="color:var(--purple);border-color:rgba(188,140,255,.3)">↘ refrig_in ·
24 bar · 465 kJ/kg</span>
</div>
<div class="macro-inner-row">
<div class="mini-node" style="border-color:var(--purple)">
<div class="nm">🔵 Comp.</div>
<div class="ty">2 éq.</div>
</div>
<div class="mini-arr"></div>
<div class="mini-node" style="border-color:var(--red)">
<div class="nm">🔴 Cond.</div>
<div class="ty">2 éq.</div>
</div>
<div class="mini-arr"></div>
<div class="mini-node" style="border-color:var(--yellow)">
<div class="nm">🟡 EXV</div>
<div class="ty">1 éq.</div>
</div>
<div class="mini-arr"></div>
<div class="mini-node" style="border-color:var(--green)">
<div class="nm">🟢 Évap.</div>
<div class="ty">2 éq.</div>
</div>
</div>
<svg class="back-svg" width="260" height="18">
<line x1="248" y1="5" x2="12" y2="5" stroke="#7d8590" stroke-width="1.5"
stroke-dasharray="4,3" />
<polygon points="16,1 12,5 16,9" fill="#7d8590" />
<text x="130" y="16" fill="#7d8590" font-size="8" font-family="JetBrains Mono"
text-anchor="middle">retour · 8.5 bar · 425 kJ/kg</text>
</svg>
<div
style="display:flex;align-items:center;justify-content:center;gap:4px;margin-top:6px">
<span class="port-badge"
style="color:var(--purple);border-color:rgba(188,140,255,.3)">↗ refrig_out ·
8.5 bar · 260 kJ/kg</span>
</div>
</div>
</div>
</div><!-- /branches -->
<!-- Join SVG -->
<svg width="36" height="120" style="flex-shrink:0">
<line x1="32" y1="18" x2="32" y2="102" stroke="#7d8590" stroke-width="2" />
<line x1="0" y1="24" x2="32" y2="24" stroke="#7d8590" stroke-width="2" />
<line x1="0" y1="96" x2="32" y2="96" stroke="#7d8590" stroke-width="2" />
<text x="0" y="14" fill="#7d8590" font-size="8" font-family="JetBrains Mono">e3</text>
<text x="0" y="112" fill="#7d8590" font-size="8" font-family="JetBrains Mono">e4</text>
</svg>
</div>
<!-- FlowMerger -->
<div class="node merger" style="flex-shrink:0"
data-tip="FlowMerger::compressible(&quot;R410A&quot;)&#10;2 entrées → 1 sortie&#10;n_eq = N+1 = 3&#10;Équation de mélange enthalpique :&#10;h_out = (h_A·ṁ_A + h_B·ṁ_B) / (ṁ_A + ṁ_B)&#10;Isobare : P_in_B = P_in_A&#10;Sortie : P_out = P_ref">
<div class="nm">🔀 Merger</div>
<div class="ty">FlowMerger</div>
<div class="eq">3 éq.</div>
<div class="vals">8.5 bar<br>260 kJ/kg</div>
</div>
<!-- Arrow e5 -->
<div class="arr">
<div class="arr-line"></div>
<div class="arr-lbl">e5 · R410A</div>
</div>
<!-- Destination -->
<div class="node dest" style="flex-shrink:0"
data-tip="Condenseur / Rejet thermique&#10;Eau chaude : 30°C→35°C&#10;Q = 18.45 kW total">
<div class="nm">🟢 Dest.</div>
<div class="ty">condenseur eau</div>
<div class="vals">8.5 bar<br>260 kJ/kg</div>
</div>
</div><!-- /flow-grid -->
</div>
</section>
<!-- ═══ ÉQUATIONS ═══ -->
<section>
<h2>Équations des composants de jonction</h2>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;">
<!-- Splitter -->
<div class="eq-box">
<div style="font-size:.8rem;font-weight:600;color:var(--blue);margin-bottom:12px">
🔀 FlowSplitter::compressible("R410A") — 1 → 2
</div>
<table class="eq-table">
<thead>
<tr>
<th>Type</th>
<th>Équation (résidu = 0)</th>
<th>Valeur</th>
</tr>
</thead>
<tbody>
<tr>
<td class="cat">Isobare<br><span style="color:var(--dim);font-size:.62rem">branch
1</span></td>
<td class="formula">P_out_A P_in = 0</td>
<td class="result">24.0 24.0 = 0</td>
</tr>
<tr>
<td class="cat">Isobare<br><span style="color:var(--dim);font-size:.62rem">branch
N</span></td>
<td class="formula">P_out_B P_in = 0</td>
<td class="result">24.0 24.0 = 0</td>
</tr>
<tr>
<td class="cat">Isenthalpique<br><span style="color:var(--dim);font-size:.62rem">branch
1</span></td>
<td class="formula">h_out_A h_in = 0</td>
<td class="result">465 465 = 0</td>
</tr>
<tr>
<td class="cat" style="border:none">Total</td>
<td style="color:var(--green);font-weight:600">n_eq = 2·N 1</td>
<td class="result" style="color:var(--green)">N=2 → 3 éq.</td>
</tr>
</tbody>
</table>
</div>
<!-- Merger -->
<div class="eq-box">
<div style="font-size:.8rem;font-weight:600;color:var(--blue);margin-bottom:12px">
🔀 FlowMerger::compressible("R410A") — 2 → 1
</div>
<table class="eq-table">
<thead>
<tr>
<th>Type</th>
<th>Équation (résidu = 0)</th>
<th>Valeur</th>
</tr>
</thead>
<tbody>
<tr>
<td class="cat">Isobare<br><span style="color:var(--dim);font-size:.62rem">inlets
2..N</span></td>
<td class="formula">P_in_B P_in_A = 0</td>
<td class="result">8.5 8.5 = 0</td>
</tr>
<tr>
<td class="cat">Isobare<br><span style="color:var(--dim);font-size:.62rem">sortie</span>
</td>
<td class="formula">P_out P_in_A = 0</td>
<td class="result">8.5 8.5 = 0</td>
</tr>
<tr>
<td class="cat">Mélange<br><span
style="color:var(--dim);font-size:.62rem">enthalpie</span></td>
<td class="formula">h_out Σ(ṁ_k·h_k)/Σṁ_k = 0</td>
<td class="result">(260+260)/2 = 260</td>
</tr>
<tr>
<td class="cat" style="border:none">Total</td>
<td style="color:var(--green);font-weight:600">n_eq = N + 1</td>
<td class="result" style="color:var(--green)">N=2 → 3 éq.</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- ═══ VALEURS A7/W35 ═══ -->
<section>
<h2>Valeurs au point de fonctionnement Eurovent A7/W35</h2>
<div class="info-grid">
<div class="icard">
<h3>FlowSplitter — Bords</h3>
<div class="irow"><span class="k">Fluide</span><span class="v c">R410A (compressible)</span></div>
<div class="irow"><span class="k">P entrée (e0)</span><span class="v">24.0 bar</span></div>
<div class="irow"><span class="k">h entrée (e0)</span><span class="v">465 kJ/kg</span></div>
<div class="irow"><span class="k">P sortie A (e1)</span><span class="v">24.0 bar ✓</span></div>
<div class="irow"><span class="k">P sortie B (e2)</span><span class="v">24.0 bar ✓</span></div>
<div class="irow"><span class="k">h sortie A (e1)</span><span class="v">465 kJ/kg ✓</span></div>
<div class="irow"><span class="k">n_equations</span><span class="v b">2·21 = 3</span></div>
</div>
<div class="icard">
<h3>FlowMerger — Bords</h3>
<div class="irow"><span class="k">Fluide</span><span class="v c">R410A (compressible)</span></div>
<div class="irow"><span class="k">P sortie basse</span><span class="v">8.5 bar</span></div>
<div class="irow"><span class="k">h in_A (e3)</span><span class="v">260 kJ/kg</span></div>
<div class="irow"><span class="k">h in_B (e4)</span><span class="v">260 kJ/kg</span></div>
<div class="irow"><span class="k">h out mélangé</span><span class="v g">260 kJ/kg ✓</span></div>
<div class="irow"><span class="k">ṁ_A = ṁ_B</span><span class="v">0.045 kg/s</span></div>
<div class="irow"><span class="k">n_equations</span><span class="v b">2+1 = 3</span></div>
</div>
<div class="icard">
<h3>Chiller A & B (chacun)</h3>
<div class="irow"><span class="k">Compresseur</span><span class="v">8.5 → 24 bar</span></div>
<div class="irow"><span class="k">W_comp</span><span class="v">2.43 kW</span></div>
<div class="irow"><span class="k">T condensation</span><span class="v">40 °C</span></div>
<div class="irow"><span class="k">T évaporation</span><span class="v">2 °C</span></div>
<div class="irow"><span class="k">Superheat EXV</span><span class="v">5 K</span></div>
<div class="irow"><span class="k">Q chiller</span><span class="v g">9.22 kW</span></div>
<div class="irow"><span class="k">COP chaud</span><span class="v g">3.80</span></div>
</div>
<div class="icard">
<h3>Système total parallèle</h3>
<div class="irow"><span class="k">Nœuds parent</span><span class="v c">4</span></div>
<div class="irow"><span class="k">Bords parent</span><span class="v c">6 (e0..e5)</span></div>
<div class="irow"><span class="k">Éq. Splitter</span><span class="v b">3</span></div>
<div class="irow"><span class="k">Éq. Chiller A</span><span class="v o">11</span></div>
<div class="irow"><span class="k">Éq. Chiller B</span><span class="v o">11</span></div>
<div class="irow"><span class="k">Éq. Merger</span><span class="v b">3</span></div>
<div class="irow"><span class="k">Total équations</span><span class="v g">28</span></div>
<div class="irow"><span class="k">Q total</span><span class="v g">18.45 kW</span></div>
<div class="irow"><span class="k">W total</span><span class="v">4.86 kW</span></div>
</div>
</div>
</section>
<!-- ═══ API RUST ═══ -->
<section>
<h2>API Rust (usage)</h2>
<pre
style="background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:18px;font-family:'JetBrains Mono',monospace;font-size:.72rem;line-height:1.7;overflow-x:auto"><span style="color:var(--dim)">// ── FlowSplitter compressible 1→2 ─────────────────────────────────────</span>
<span style="color:var(--blue)">let</span> splitter = <span style="color:var(--cyan)">FlowSplitter</span>::compressible(
<span style="color:var(--green)">"R410A"</span>,
inlet_port, <span style="color:var(--dim)">// 24 bar · 465 kJ/kg</span>
vec![outlet_chiller_a, outlet_chiller_b],
)<span style="color:var(--dim)">.unwrap()</span>;
<span style="color:var(--dim)">// n_equations = 2·N 1 = 3 (N=2 branches)</span>
<span style="color:var(--dim)">// ── FlowMerger compressible 2→1 avec débit pondéré ────────────────────</span>
<span style="color:var(--blue)">let</span> merger = <span style="color:var(--cyan)">FlowMerger</span>::compressible(
<span style="color:var(--green)">"R410A"</span>,
vec![out_chiller_a, out_chiller_b], <span style="color:var(--dim)">// 8.5 bar · 260 kJ/kg chacun</span>
outlet_port,
)<span style="color:var(--dim)">.unwrap()</span>
.<span style="color:var(--orange)">with_mass_flows</span>(vec![<span style="color:var(--yellow)">0.045</span>, <span style="color:var(--yellow)">0.045</span>])<span style="color:var(--dim)">.unwrap()</span>;
<span style="color:var(--dim)">// n_equations = N + 1 = 3 (N=2 inlets)</span>
<span style="color:var(--dim)">// h_out_mixed = (0.045·260 + 0.045·260) / 0.09 = 260 kJ/kg ✓</span>
<span style="color:var(--dim)">// ── Version incompressible (eau côté condenseur) ──────────────────────</span>
<span style="color:var(--blue)">let</span> water_splitter = <span style="color:var(--cyan)">FlowSplitter</span>::incompressible(
<span style="color:var(--green)">"Water"</span>,
water_inlet, vec![branch_a, branch_b],
)<span style="color:var(--dim)">.unwrap()</span>;
<span style="color:var(--dim)">// Utilisation comme Box&lt;dyn Component&gt; dans le System parent :</span>
<span style="color:var(--blue)">let</span> node_s = parent.add_component(<span style="color:var(--cyan)">Box</span>::new(splitter));
<span style="color:var(--blue)">let</span> node_m = parent.add_component(<span style="color:var(--cyan)">Box</span>::new(merger));</pre>
</section>
</div><!-- /page -->
<script>
document.querySelectorAll('.macro-wrap, .node').forEach(el => {
el.addEventListener('mouseenter', () => {
const c = getComputedStyle(el).borderColor;
el.style.boxShadow = `0 0 0 2px ${c}, 0 8px 28px rgba(0,0,0,.5)`;
});
el.addEventListener('mouseleave', () => { el.style.boxShadow = ''; });
});
</script>
</body>
</html>