910 lines
37 KiB
HTML
910 lines
37 KiB
HTML
<!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 Eau froide : 7°C→12°C 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("R410A") 1 entrée → 2 sorties n_eq = 2·2−1 = 3 Isobare + isenthalpique P_out_k = P_in 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 4 composants internes (R410A) 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 (identique à Chiller A) 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("R410A") 2 entrées → 1 sortie n_eq = N+1 = 3 Équation de mélange enthalpique : h_out = (h_A·ṁ_A + h_B·ṁ_B) / (ṁ_A + ṁ_B) Isobare : P_in_B = P_in_A 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 Eau chaude : 30°C→35°C 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·2−1 = 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<dyn Component> 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> |