{"id":1952,"date":"2026-02-06T17:21:14","date_gmt":"2026-02-06T16:21:14","guid":{"rendered":"https:\/\/wiki.atsrl.net\/?p=1952"},"modified":"2026-02-06T17:21:14","modified_gmt":"2026-02-06T16:21:14","slug":"shr-sensible-heat-ratio-negli-ambienti-ospedalieri","status":"publish","type":"post","link":"https:\/\/wiki.atsrl.net\/?p=1952","title":{"rendered":"SHR \u2014 Sensible Heat Ratio negli Ambienti Ospedalieri"},"content":{"rendered":"\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,400&#038;family=JetBrains+Mono:wght@400;500;600&#038;family=Playfair+Display:wght@700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  :root {\n    --bg: #f8f7f4;\n    --surface: #ffffff;\n    --surface-alt: #f1f0ec;\n    --border: #e2e0d8;\n    --border-light: #eeedea;\n    --text: #2c2a25;\n    --text-muted: #6b6860;\n    --text-faint: #9e9b92;\n    --accent: #1a5f7a;\n    --accent-light: #e8f2f7;\n    --accent-dark: #0e3d50;\n    --warm: #c45a2c;\n    --warm-light: #fdf0ea;\n    --green: #2d7a4f;\n    --green-light: #e8f5ee;\n    --purple: #6b4c9a;\n    --purple-light: #f3eff8;\n    --yellow: #b8860b;\n    --yellow-light: #fdf8e8;\n    --red: #b83232;\n    --red-light: #fdeaea;\n    --shadow-sm: 0 1px 3px rgba(44,42,37,0.06);\n    --shadow-md: 0 4px 12px rgba(44,42,37,0.08);\n    --shadow-lg: 0 8px 30px rgba(44,42,37,0.12);\n    --radius: 10px;\n    --radius-lg: 16px;\n  }\n\n  * { margin: 0; padding: 0; box-sizing: border-box; }\n\n  body {\n    font-family: 'DM Sans', -apple-system, sans-serif;\n    background: var(--bg);\n    color: var(--text);\n    line-height: 1.65;\n    font-size: 15px;\n    -webkit-font-smoothing: antialiased;\n  }\n\n  .container {\n    max-width: 1140px;\n    margin: 0 auto;\n    padding: 0 24px;\n  }\n\n  \/* \u2500\u2500 HERO \u2500\u2500 *\/\n  .hero {\n    background: linear-gradient(135deg, #0e3d50 0%, #1a5f7a 40%, #2d7a4f 100%);\n    padding: 56px 0 48px;\n    position: relative;\n    overflow: hidden;\n  }\n  .hero::before {\n    content: '';\n    position: absolute; inset: 0;\n    background: url(\"data:image\/svg+xml,%3Csvg width='60' height='60' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cpath d='M30 0v60M0 30h60' stroke='%23fff' stroke-opacity='0.04' stroke-width='1'\/%3E%3C\/svg%3E\");\n    pointer-events: none;\n  }\n  .hero h1 {\n    font-family: 'Playfair Display', serif;\n    font-size: clamp(28px, 4vw, 44px);\n    font-weight: 800;\n    color: #fff;\n    letter-spacing: -0.02em;\n    line-height: 1.15;\n  }\n  .hero .subtitle {\n    font-size: 16px;\n    color: rgba(255,255,255,0.7);\n    margin-top: 12px;\n    font-weight: 300;\n    max-width: 600px;\n  }\n  .hero .badge {\n    display: inline-block;\n    background: rgba(255,255,255,0.12);\n    border: 1px solid rgba(255,255,255,0.2);\n    color: rgba(255,255,255,0.9);\n    padding: 4px 14px;\n    border-radius: 20px;\n    font-size: 12px;\n    font-weight: 500;\n    letter-spacing: 0.05em;\n    text-transform: uppercase;\n    margin-bottom: 16px;\n  }\n\n  \/* \u2500\u2500 NAV TABS \u2500\u2500 *\/\n  .nav-bar {\n    background: var(--surface);\n    border-bottom: 1px solid var(--border);\n    position: sticky;\n    top: 0;\n    z-index: 100;\n    box-shadow: var(--shadow-sm);\n  }\n  .nav-tabs {\n    display: flex;\n    gap: 0;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .nav-tab {\n    flex: 1;\n    min-width: 140px;\n    padding: 14px 16px;\n    text-align: center;\n    font-size: 13px;\n    font-weight: 500;\n    color: var(--text-muted);\n    cursor: pointer;\n    border-bottom: 3px solid transparent;\n    transition: all 0.25s ease;\n    white-space: nowrap;\n    user-select: none;\n  }\n  .nav-tab:hover { color: var(--accent); background: var(--accent-light); }\n  .nav-tab.active {\n    color: var(--accent-dark);\n    border-bottom-color: var(--accent);\n    font-weight: 600;\n  }\n  .nav-tab .tab-num {\n    display: inline-block;\n    width: 22px; height: 22px;\n    line-height: 22px;\n    border-radius: 50%;\n    background: var(--surface-alt);\n    font-size: 11px;\n    font-weight: 600;\n    margin-right: 6px;\n    transition: all 0.25s;\n  }\n  .nav-tab.active .tab-num {\n    background: var(--accent);\n    color: #fff;\n  }\n\n  \/* \u2500\u2500 SECTIONS \u2500\u2500 *\/\n  .section { display: none; padding: 40px 0 60px; }\n  .section.active { display: block; animation: fadeIn 0.35s ease; }\n  @keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }\n\n  .section-header {\n    margin-bottom: 28px;\n  }\n  .section-header h2 {\n    font-family: 'Playfair Display', serif;\n    font-size: 26px;\n    font-weight: 700;\n    color: var(--text);\n    margin-bottom: 8px;\n  }\n  .section-header p {\n    color: var(--text-muted);\n    font-size: 14px;\n    max-width: 700px;\n  }\n\n  \/* \u2500\u2500 CARDS \u2500\u2500 *\/\n  .card {\n    background: var(--surface);\n    border: 1px solid var(--border-light);\n    border-radius: var(--radius-lg);\n    box-shadow: var(--shadow-sm);\n    overflow: hidden;\n    margin-bottom: 20px;\n    transition: box-shadow 0.25s ease;\n  }\n  .card:hover { box-shadow: var(--shadow-md); }\n  .card-header {\n    padding: 16px 20px;\n    font-weight: 600;\n    font-size: 14px;\n    border-bottom: 1px solid var(--border-light);\n    display: flex;\n    align-items: center;\n    gap: 8px;\n  }\n  .card-body { padding: 20px; }\n\n  \/* \u2500\u2500 TABLE \u2500\u2500 *\/\n  .table-wrap { overflow-x: auto; }\n  table {\n    width: 100%;\n    border-collapse: collapse;\n    font-size: 13px;\n  }\n  thead th {\n    background: var(--surface-alt);\n    padding: 10px 14px;\n    text-align: left;\n    font-weight: 600;\n    font-size: 11px;\n    text-transform: uppercase;\n    letter-spacing: 0.06em;\n    color: var(--text-muted);\n    border-bottom: 2px solid var(--border);\n    white-space: nowrap;\n  }\n  tbody td {\n    padding: 10px 14px;\n    border-bottom: 1px solid var(--border-light);\n    vertical-align: middle;\n  }\n  tbody tr { transition: background 0.15s; cursor: pointer; }\n  tbody tr:hover { background: var(--accent-light); }\n  tbody tr.selected { background: var(--accent-light); }\n\n  .shr-bar {\n    display: inline-block;\n    height: 8px;\n    border-radius: 4px;\n    vertical-align: middle;\n    margin-left: 8px;\n  }\n\n  .mono {\n    font-family: 'JetBrains Mono', monospace;\n    font-size: 12px;\n    font-weight: 500;\n  }\n\n  \/* \u2500\u2500 DETAIL PANEL \u2500\u2500 *\/\n  .detail-panel {\n    background: var(--surface-alt);\n    border-radius: var(--radius);\n    padding: 20px;\n    margin-top: 16px;\n    border: 1px solid var(--border);\n    animation: fadeIn 0.3s ease;\n  }\n  .detail-panel h4 {\n    font-size: 15px;\n    font-weight: 600;\n    margin-bottom: 12px;\n    color: var(--accent-dark);\n  }\n  .detail-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n    gap: 12px;\n  }\n  .detail-item {\n    background: var(--surface);\n    border-radius: 8px;\n    padding: 12px;\n    border: 1px solid var(--border-light);\n  }\n  .detail-item .label {\n    font-size: 11px;\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n    color: var(--text-faint);\n    margin-bottom: 4px;\n  }\n  .detail-item .value {\n    font-family: 'JetBrains Mono', monospace;\n    font-size: 18px;\n    font-weight: 600;\n    color: var(--accent-dark);\n  }\n  .detail-item .unit {\n    font-size: 12px;\n    color: var(--text-muted);\n    font-weight: 400;\n  }\n  .detail-item .note {\n    font-size: 11px;\n    color: var(--text-muted);\n    margin-top: 4px;\n  }\n\n  \/* \u2500\u2500 TEMP SELECTOR \u2500\u2500 *\/\n  .temp-selector {\n    display: flex;\n    gap: 0;\n    background: var(--surface-alt);\n    border-radius: 8px;\n    border: 1px solid var(--border);\n    overflow: hidden;\n    width: fit-content;\n    margin-bottom: 16px;\n  }\n  .temp-btn {\n    padding: 8px 18px;\n    font-size: 13px;\n    font-weight: 500;\n    color: var(--text-muted);\n    cursor: pointer;\n    border: none;\n    background: transparent;\n    transition: all 0.2s;\n    font-family: 'DM Sans', sans-serif;\n  }\n  .temp-btn:hover { background: var(--border-light); }\n  .temp-btn.active {\n    background: var(--accent);\n    color: #fff;\n    font-weight: 600;\n  }\n\n  \/* \u2500\u2500 DIAGRAM SVG \u2500\u2500 *\/\n  .diagram-container {\n    position: relative;\n    width: 100%;\n    max-width: 900px;\n    margin: 0 auto;\n  }\n  .diagram-container svg {\n    width: 100%;\n    height: auto;\n  }\n  .legend-list {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n    gap: 8px;\n    margin-top: 16px;\n  }\n  .legend-item {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    padding: 6px 10px;\n    border-radius: 6px;\n    font-size: 12px;\n    cursor: pointer;\n    transition: all 0.2s;\n    border: 1px solid transparent;\n  }\n  .legend-item:hover, .legend-item.active {\n    background: var(--surface-alt);\n    border-color: var(--border);\n  }\n  .legend-swatch {\n    width: 24px; height: 4px;\n    border-radius: 2px;\n    flex-shrink: 0;\n  }\n  .legend-shr {\n    font-family: 'JetBrains Mono', monospace;\n    font-size: 11px;\n    color: var(--text-faint);\n    margin-left: auto;\n  }\n\n  \/* \u2500\u2500 STRATEGY CARDS \u2500\u2500 *\/\n  .strategy-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n    gap: 16px;\n  }\n  .strategy-card {\n    background: var(--surface);\n    border: 1px solid var(--border-light);\n    border-radius: var(--radius);\n    padding: 20px;\n    cursor: pointer;\n    transition: all 0.25s;\n    position: relative;\n    overflow: hidden;\n  }\n  .strategy-card::before {\n    content: '';\n    position: absolute;\n    top: 0; left: 0; right: 0;\n    height: 4px;\n  }\n  .strategy-card:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); }\n  .strategy-card.expanded { grid-column: 1 \/ -1; }\n  .strategy-card h4 {\n    font-size: 15px;\n    font-weight: 600;\n    margin-bottom: 4px;\n  }\n  .strategy-card .shr-range {\n    font-family: 'JetBrains Mono', monospace;\n    font-size: 12px;\n    color: var(--text-faint);\n    margin-bottom: 10px;\n  }\n  .strategy-card .desc { font-size: 13px; color: var(--text-muted); line-height: 1.6; }\n\n  .strategy-detail {\n    margin-top: 16px;\n    padding-top: 16px;\n    border-top: 1px solid var(--border-light);\n    display: none;\n    animation: fadeIn 0.3s;\n  }\n  .strategy-card.expanded .strategy-detail { display: block; }\n\n  .param-row {\n    display: flex;\n    justify-content: space-between;\n    padding: 6px 0;\n    font-size: 13px;\n    border-bottom: 1px solid var(--border-light);\n  }\n  .param-row:last-child { border-bottom: none; }\n  .param-label { color: var(--text-muted); }\n  .param-value { font-family: 'JetBrains Mono', monospace; font-weight: 500; }\n\n  .process-flow {\n    display: flex;\n    align-items: center;\n    gap: 4px;\n    flex-wrap: wrap;\n    margin-top: 12px;\n    padding: 12px;\n    background: var(--surface-alt);\n    border-radius: 8px;\n  }\n  .process-step {\n    padding: 5px 10px;\n    border-radius: 6px;\n    font-size: 11px;\n    font-weight: 500;\n    white-space: nowrap;\n  }\n  .process-arrow {\n    color: var(--text-faint);\n    font-size: 14px;\n  }\n\n  \/* \u2500\u2500 FONTE \u2500\u2500 *\/\n  .source-tag {\n    display: inline-block;\n    padding: 2px 8px;\n    border-radius: 4px;\n    font-size: 10px;\n    font-weight: 500;\n    letter-spacing: 0.03em;\n    margin: 1px 2px;\n  }\n  .source-ashrae { background: #e8f2f7; color: #1a5f7a; }\n  .source-uni { background: #e8f5ee; color: #2d7a4f; }\n  .source-cibse { background: #f3eff8; color: #6b4c9a; }\n  .source-docfap { background: #fdf0ea; color: #c45a2c; }\n\n  \/* \u2500\u2500 FOOTER \u2500\u2500 *\/\n  .footer {\n    padding: 28px 0;\n    border-top: 1px solid var(--border);\n    text-align: center;\n    font-size: 12px;\n    color: var(--text-faint);\n  }\n  .footer a { color: var(--accent); text-decoration: none; }\n\n  \/* \u2500\u2500 RESPONSIVE \u2500\u2500 *\/\n  @media (max-width: 768px) {\n    .hero { padding: 36px 0 32px; }\n    .hero h1 { font-size: 24px; }\n    .nav-tab { font-size: 11px; padding: 10px 8px; min-width: 0; }\n    .nav-tab .tab-num { display: none; }\n    .detail-grid { grid-template-columns: 1fr 1fr; }\n    .strategy-grid { grid-template-columns: 1fr; }\n    table { font-size: 12px; }\n    thead th, tbody td { padding: 8px 10px; }\n  }\n\n  \/* Tooltip *\/\n  .tooltip {\n    position: absolute;\n    background: var(--text);\n    color: #fff;\n    padding: 6px 12px;\n    border-radius: 6px;\n    font-size: 12px;\n    pointer-events: none;\n    z-index: 200;\n    white-space: nowrap;\n    box-shadow: var(--shadow-lg);\n    opacity: 0;\n    transition: opacity 0.15s;\n  }\n  .tooltip.visible { opacity: 1; }\n<\/style>\n\n\n<!-- HERO -->\n<div class=\"hero\">\n  <div class=\"container\">\n    <div class=\"badge\">HVAC \u2014 Progettazione Ospedaliera<\/div>\n    <h1>Sensible Heat Ratio<br>negli Ambienti Ospedalieri<\/h1>\n    <p class=\"subtitle\">Analisi della ripartizione tra carico termico sensibile e latente per le diverse aree funzionali, con applicazione al Nuovo Ospedale di Cosenza.<\/p>\n  <\/div>\n<\/div>\n\n<!-- NAV -->\n<div class=\"nav-bar\">\n  <div class=\"container\">\n    <div class=\"nav-tabs\" id=\"navTabs\">\n      <div class=\"nav-tab active\" onclick=\"switchTab(0)\"><span class=\"tab-num\">1<\/span> SHR per Area<\/div>\n      <div class=\"nav-tab\" onclick=\"switchTab(1)\"><span class=\"tab-num\">2<\/span> Carichi Metabolici<\/div>\n      <div class=\"nav-tab\" onclick=\"switchTab(2)\"><span class=\"tab-num\">3<\/span> Diagramma \u03c8<\/div>\n      <div class=\"nav-tab\" onclick=\"switchTab(3)\"><span class=\"tab-num\">4<\/span> Strategie<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SEZIONE 1 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div class=\"section active\" id=\"section0\">\n  <div class=\"container\">\n    <div class=\"section-header\">\n      <h2>SHR per Area Funzionale<\/h2>\n      <p>Valori tipici del Sensible Heat Ratio per le principali tipologie di locali ospedalieri. Clicca su una riga per visualizzare la composizione dettagliata del carico termico.<\/p>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"><rect x=\"1\" y=\"3\" width=\"14\" height=\"2\" rx=\"1\" fill=\"var(--accent)\"\/><rect x=\"1\" y=\"7\" width=\"14\" height=\"2\" rx=\"1\" fill=\"var(--accent)\" opacity=\"0.6\"\/><rect x=\"1\" y=\"11\" width=\"14\" height=\"2\" rx=\"1\" fill=\"var(--accent)\" opacity=\"0.3\"\/><\/svg>\n        Valori di riferimento SHR \u2014 Normativa e letteratura tecnica\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"table-wrap\">\n          <table id=\"shrTable\">\n            <thead>\n              <tr>\n                <th>Area Funzionale<\/th>\n                <th>SHR min<\/th>\n                <th>SHR typ<\/th>\n                <th>SHR max<\/th>\n                <th>ACH<\/th>\n                <th>Sensibile<\/th>\n                <th>Latente<\/th>\n                <th>Grafico<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody id=\"shrTableBody\"><\/tbody>\n          <\/table>\n        <\/div>\n        <div id=\"shrDetail\"><\/div>\n      <\/div>\n    <\/div>\n\n    <div style=\"display:flex;flex-wrap:wrap;gap:6px;margin-top:12px;\">\n      <span class=\"source-tag source-ashrae\">ASHRAE 170-2021<\/span>\n      <span class=\"source-tag source-ashrae\">ASHRAE Fund. Ch.18<\/span>\n      <span class=\"source-tag source-cibse\">CIBSE Guide A<\/span>\n      <span class=\"source-tag source-uni\">UNI 10339<\/span>\n      <span class=\"source-tag source-docfap\">DocFAP Cosenza<\/span>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SEZIONE 2 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div class=\"section\" id=\"section1\">\n  <div class=\"container\">\n    <div class=\"section-header\">\n      <h2>Carichi Metabolici per Attivit\u00e0<\/h2>\n      <p>Ripartizione sensibile\/latente del calore metabolico in funzione della temperatura ambiente. La suddivisione varia significativamente con la temperatura: a temperature pi\u00f9 alte aumenta la quota latente (traspirazione).<\/p>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"><circle cx=\"8\" cy=\"5\" r=\"3\" stroke=\"var(--accent)\" stroke-width=\"1.5\" fill=\"none\"\/><path d=\"M3 14c0-2.76 2.24-5 5-5s5 2.24 5 5\" stroke=\"var(--accent)\" stroke-width=\"1.5\" fill=\"none\"\/><\/svg>\n        Temperatura ambiente selezionata\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"temp-selector\" id=\"tempSelector\">\n          <button class=\"temp-btn\" onclick=\"setTemp(20)\">20 \u00b0C<\/button>\n          <button class=\"temp-btn\" onclick=\"setTemp(22)\">22 \u00b0C<\/button>\n          <button class=\"temp-btn active\" onclick=\"setTemp(24)\">24 \u00b0C<\/button>\n          <button class=\"temp-btn\" onclick=\"setTemp(26)\">26 \u00b0C<\/button>\n        <\/div>\n        <div class=\"table-wrap\">\n          <table>\n            <thead>\n              <tr>\n                <th>Attivit\u00e0<\/th>\n                <th>Met<\/th>\n                <th>Q<sub>tot<\/sub> (W)<\/th>\n                <th>Q<sub>s<\/sub> (W)<\/th>\n                <th>Q<sub>l<\/sub> (W)<\/th>\n                <th>SHR persona<\/th>\n                <th>Ripartizione<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody id=\"metTableBody\"><\/tbody>\n          <\/table>\n        <\/div>\n\n        <div style=\"margin-top:16px; padding:14px; background:var(--yellow-light); border-radius:8px; border:1px solid #e8dbb0; font-size:13px; color:#7a6200;\">\n          <strong>\u26a0 Nota:<\/strong> L&#8217;SHR della <em>persona<\/em> \u00e8 molto diverso dall&#8217;SHR <em>dell&#8217;ambiente<\/em>. In una sala operatoria, l&#8217;SHR del chirurgo (persona) \u00e8 ~0,38 a 24\u00b0C, ma l&#8217;SHR complessivo della sala \u00e8 0,84 per il contributo dominante di illuminazione e apparecchiature (carichi puramente sensibili).\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SEZIONE 3 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div class=\"section\" id=\"section2\">\n  <div class=\"container\">\n    <div class=\"section-header\">\n      <h2>Diagramma Psicrometrico<\/h2>\n      <p>Rette ambiente per tipologia di locale, tracciate dal punto di condizioni interne (24\u00b0C, 50% UR). La pendenza della retta \u00e8 funzione dell&#8217;SHR: rette pi\u00f9 orizzontali indicano prevalenza di carico sensibile; rette pi\u00f9 inclinate richiedono maggiore deumidificazione.<\/p>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"card-body\" style=\"padding:24px;\">\n        <div class=\"diagram-container\">\n          <svg id=\"psychChart\" viewBox=\"0 0 900 560\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><\/svg>\n        <\/div>\n        <div class=\"legend-list\" id=\"legendList\"><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\" style=\"margin-top:16px;\">\n      <div class=\"card-header\">\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"><path d=\"M8 1v14M1 8h14\" stroke=\"var(--accent)\" stroke-width=\"1.5\"\/><\/svg>\n        Interpretazione delle rette\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"table-wrap\">\n          <table>\n            <thead>\n              <tr><th>Pendenza<\/th><th>SHR<\/th><th>Significato<\/th><th>Tipologia<\/th><\/tr>\n            <\/thead>\n            <tbody>\n              <tr>\n                <td>Quasi orizzontale \u2192<\/td>\n                <td class=\"mono\">0,80 \u2013 0,86<\/td>\n                <td>Prevalenza carico sensibile. Il sistema deve abbassare T.<\/td>\n                <td>Sale operatorie, Diagnostica per immagini<\/td>\n              <\/tr>\n              <tr>\n                <td>Intermedia \u2198<\/td>\n                <td class=\"mono\">0,70 \u2013 0,78<\/td>\n                <td>Equilibrio S\/L. Gestibile da UTA standard con batteria fredda.<\/td>\n                <td>Degenze, Ambulatori, Terapia Intensiva<\/td>\n              <\/tr>\n              <tr>\n                <td>Inclinata \u2193<\/td>\n                <td class=\"mono\">0,55 \u2013 0,68<\/td>\n                <td>Forte carico latente. Necessaria deumidificazione dedicata.<\/td>\n                <td>Sterilizzazione, Hall e sale attesa<\/td>\n              <\/tr>\n            <\/tbody>\n          <\/table>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SEZIONE 4 \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n<div class=\"section\" id=\"section3\">\n  <div class=\"container\">\n    <div class=\"section-header\">\n      <h2>Strategie Impiantistiche<\/h2>\n      <p>Strategie di trattamento dell&#8217;aria differenziate in funzione dell&#8217;SHR dell&#8217;ambiente. Ogni strategia \u00e8 dimensionata sulle condizioni climatiche di Cosenza e le specifiche del DocFAP. Clicca per espandere i dettagli.<\/p>\n    <\/div>\n\n    <div class=\"strategy-grid\" id=\"strategyGrid\"><\/div>\n\n    <div class=\"card\" style=\"margin-top:24px;\">\n      <div class=\"card-header\">\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"><rect x=\"2\" y=\"2\" width=\"12\" height=\"12\" rx=\"2\" stroke=\"var(--warm)\" stroke-width=\"1.5\" fill=\"none\"\/><path d=\"M5 8h6M8 5v6\" stroke=\"var(--warm)\" stroke-width=\"1.5\"\/><\/svg>\n        Applicazione \u2014 Nuovo Ospedale di Cosenza\n      <\/div>\n      <div class=\"card-body\" style=\"font-size:13px; color:var(--text-muted); line-height:1.75;\">\n        Il progetto prevede un sistema ibrido a 4 tubi con distribuzione mista aria\/acqua. Le UTA forniscono aria primaria trattata (ventilazione e controllo umidit\u00e0) mentre i soffitti radianti gestiscono il carico sensibile residuo. L&#8217;umidificazione \u00e8 differenziata: isotermica a vapore per le aree critiche (sale operatorie, TI, laboratori \u2014 controllo preciso \u00b15% UR) e adiabatica a pacco ceramico per le aree non critiche (degenze, ambulatori \u2014 risparmio energetico &gt;99% rispetto al vapore). Le condizioni esterne estive di progetto per Cosenza (T<sub>bs<\/sub> = 34,5\u00b0C, T<sub>bu<\/sub> = 23,5\u00b0C) impongono un salto entalpico significativo sulle batterie di raffreddamento, con punto di rugiada dell&#8217;aria di immissione tipicamente a 10-12\u00b0C per le zone ad alto carico latente.\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- FOOTER -->\n<div class=\"footer\">\n  <div class=\"container\">\n    <p>Analisi tecnica a supporto della progettazione HVAC \u2014 Nuovo Ospedale di Cosenza<\/p>\n    <p style=\"margin-top:4px;\">Fonti: ASHRAE 170-2021 \u00b7 ASHRAE Fundamentals 2021 Ch.18 \u00b7 CIBSE Guide A 2015 \u00b7 UNI 10339 \u00b7 EN 16244 \u00b7 DocFAP Ospedale Cosenza<\/p>\n  <\/div>\n<\/div>\n\n<!-- TOOLTIP -->\n<div class=\"tooltip\" id=\"tooltip\"><\/div>\n\n<script>\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 DATA \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\nconst SHR_DATA = [\n  {\n    area: 'Sale Operatorie ISO 5',\n    shrMin: 0.82, shrTyp: 0.84, shrMax: 0.86,\n    ach: '15\u201325',\n    color: '#1a5f7a',\n    sources: ['ASHRAE 170-2021', 'UNI 10339'],\n    detail: {\n      involucro: 5, solare: 0, illuminazione: 30, apparecchiature: 35, persone: 15, ventilazione: 15,\n      note: 'Elevato ricambio d\\'aria che diluisce il carico latente. Illuminazione chirurgica ad alta intensit\u00e0 (carico puramente sensibile). Ambienti generalmente interni senza apporti solari diretti.'\n    }\n  },\n  {\n    area: 'Terapia Intensiva',\n    shrMin: 0.78, shrTyp: 0.80, shrMax: 0.82,\n    ach: '6\u201312',\n    color: '#2d7a4f',\n    sources: ['ASHRAE 170-2021', 'CIBSE Guide A'],\n    detail: {\n      involucro: 8, solare: 3, illuminazione: 20, apparecchiature: 30, persone: 20, ventilazione: 19,\n      note: 'Apparecchiature di monitoraggio continuo. Pazienti a riposo con basso carico metabolico. Ricambio d\\'aria moderato-alto per controllo qualit\u00e0 dell\\'aria.'\n    }\n  },\n  {\n    area: 'Degenze Ordinarie',\n    shrMin: 0.70, shrTyp: 0.74, shrMax: 0.78,\n    ach: '4\u20136',\n    color: '#6b4c9a',\n    sources: ['ASHRAE 170-2021', 'UNI 10339', 'CIBSE Guide A'],\n    detail: {\n      involucro: 15, solare: 12, illuminazione: 10, apparecchiature: 5, persone: 30, ventilazione: 28,\n      note: 'Permanenza prolungata di pazienti e visitatori aumenta la quota latente. Locali perimetrali con apporti solari. Importante il comfort termo-igrometrico per la degenza.'\n    }\n  },\n  {\n    area: 'Ambulatori',\n    shrMin: 0.72, shrTyp: 0.75, shrMax: 0.78,\n    ach: '4\u20136',\n    color: '#b8860b',\n    sources: ['ASHRAE 170-2021'],\n    detail: {\n      involucro: 10, solare: 8, illuminazione: 15, apparecchiature: 12, persone: 28, ventilazione: 27,\n      note: 'Turnover medio dei pazienti. Carico variabile in funzione dell\\'orario di visita. Generalmente serviti da UTA centralizzate con terminali fan-coil o radianti.'\n    }\n  },\n  {\n    area: 'Diagnostica per Immagini',\n    shrMin: 0.80, shrTyp: 0.83, shrMax: 0.86,\n    ach: '6\u201312',\n    color: '#3a7ca5',\n    sources: ['ASHRAE 170-2021', 'EN 16244'],\n    detail: {\n      involucro: 5, solare: 0, illuminazione: 10, apparecchiature: 55, persone: 12, ventilazione: 18,\n      note: 'Apparecchiature dominanti (TC, RM, PET). Carico prevalentemente sensibile con picchi elevati. Locali interni, spesso schermati. Necessit\u00e0 di raffreddamento dedicato per le apparecchiature.'\n    }\n  },\n  {\n    area: 'Laboratori',\n    shrMin: 0.68, shrTyp: 0.72, shrMax: 0.76,\n    ach: '6\u201310',\n    color: '#c45a2c',\n    sources: ['ASHRAE 170-2021', 'CIBSE Guide A'],\n    detail: {\n      involucro: 5, solare: 2, illuminazione: 12, apparecchiature: 25, persone: 18, ventilazione: 20,\n      note: 'Sorgenti di umidit\u00e0: autoclavi, incubatori, bagnomaria. Cappe aspiranti che richiedono aria di compensazione. SHR variabile in funzione dell\\'attivit\u00e0 in corso.'\n    }\n  },\n  {\n    area: 'Hall e Sale Attesa',\n    shrMin: 0.65, shrTyp: 0.68, shrMax: 0.72,\n    ach: '4\u20136',\n    color: '#9e4784',\n    sources: ['UNI 10339', 'CIBSE Guide A'],\n    detail: {\n      involucro: 12, solare: 15, illuminazione: 8, apparecchiature: 2, persone: 40, ventilazione: 23,\n      note: 'Alto affollamento variabile che domina il carico latente. Grandi superfici vetrate con apporti solari. Porte esterne con infiltrazioni d\\'aria umida esterna.'\n    }\n  },\n  {\n    area: 'Sterilizzazione',\n    shrMin: 0.55, shrTyp: 0.60, shrMax: 0.65,\n    ach: '10\u201315',\n    color: '#b83232',\n    sources: ['ASHRAE 170-2021', 'EN 16244'],\n    detail: {\n      involucro: 3, solare: 0, illuminazione: 8, apparecchiature: 20, persone: 12, ventilazione: 15,\n      note: 'Elevato carico latente da generazione di vapore (autoclavi, lavastrumenti). Necessaria aspirazione localizzata e pre-raffreddamento spinto dell\\'aria. SHR pi\u00f9 basso di tutto l\\'ospedale.'\n    }\n  }\n];\n\nconst METABOLIC_DATA = [\n  { activity: 'Paziente a riposo (allettato)', met: 0.8, qtot: 80 },\n  { activity: 'Paziente seduto', met: 1.0, qtot: 105 },\n  { activity: 'Infermiere in movimento', met: 1.6, qtot: 150 },\n  { activity: 'Visitatore seduto', met: 1.0, qtot: 105 },\n  { activity: 'Medico ambulatorio', met: 1.2, qtot: 120 },\n  { activity: 'Personale lab., in piedi', met: 1.4, qtot: 140 },\n  { activity: 'Chirurgo in attivit\u00e0', met: 2.0, qtot: 240 },\n  { activity: 'Personale pulizie', met: 2.4, qtot: 295 }\n];\n\n\/\/ Ripartizione S\/L in funzione della temperatura (approssimazione ASHRAE)\nfunction getSensLatent(qtot, tempAmb) {\n  \/\/ A T pi\u00f9 alte, il corpo dissipa pi\u00f9 per via latente\n  const latentFraction = 0.20 + (tempAmb - 20) * 0.045 + (qtot - 100) * 0.0012;\n  const lf = Math.min(Math.max(latentFraction, 0.15), 0.72);\n  const ql = Math.round(qtot * lf);\n  const qs = qtot - ql;\n  return { qs, ql, shr: qs \/ qtot };\n}\n\nconst STRATEGIES = [\n  {\n    id: 'a',\n    title: 'Raffreddamento Diretto',\n    shrRange: 'SHR > 0,80',\n    color: 'var(--accent)',\n    bgColor: 'var(--accent-light)',\n    desc: 'Per ambienti a prevalenza sensibile. La batteria fredda lavora a temperatura moderata. Il controllo dell\\'umidit\u00e0 \u00e8 assicurato dall\\'elevato ricambio d\\'aria.',\n    areas: 'Sale operatorie, Diagnostica per immagini, Terapia intensiva',\n    tImm: '14 \u2013 16 \u00b0C',\n    xImm: '8,5 \u2013 9,5 g\/kg',\n    tRug: '12 \u2013 14 \u00b0C',\n    postRisc: 'Non necessario o minimo',\n    process: [\n      { label: 'Aria esterna', bg: '#e0e0e0', color: '#333' },\n      { label: 'Recuperatore', bg: '#a8d5e2', color: '#0e3d50' },\n      { label: 'Batteria fredda', bg: '#1a5f7a', color: '#fff' },\n      { label: 'Ventilatore', bg: '#ccc', color: '#333' },\n      { label: 'Ambiente', bg: '#2d7a4f', color: '#fff' }\n    ]\n  },\n  {\n    id: 'b',\n    title: 'Raffreddamento + Controllo UR',\n    shrRange: 'SHR 0,70 \u2013 0,80',\n    color: 'var(--green)',\n    bgColor: 'var(--green-light)',\n    desc: 'Per ambienti bilanciati. La batteria fredda opera sotto il punto di rugiada per deumidificare. Post-riscaldamento moderato per raggiungere la T di immissione.',\n    areas: 'Degenze ordinarie, Ambulatori, Laboratori',\n    tImm: '12 \u2013 14 \u00b0C',\n    xImm: '7,5 \u2013 8,5 g\/kg',\n    tRug: '10 \u2013 12 \u00b0C',\n    postRisc: 'Moderato (+2\u00f74 \u00b0C)',\n    process: [\n      { label: 'Aria esterna', bg: '#e0e0e0', color: '#333' },\n      { label: 'Recuperatore', bg: '#a8d5e2', color: '#0e3d50' },\n      { label: 'Batteria fredda', bg: '#1a5f7a', color: '#fff' },\n      { label: 'Post-riscald.', bg: '#c45a2c', color: '#fff' },\n      { label: 'Ventilatore', bg: '#ccc', color: '#333' },\n      { label: 'Ambiente', bg: '#2d7a4f', color: '#fff' }\n    ]\n  },\n  {\n    id: 'c',\n    title: 'Deumidificazione Spinta',\n    shrRange: 'SHR 0,60 \u2013 0,70',\n    color: 'var(--purple)',\n    bgColor: 'var(--purple-light)',\n    desc: 'Per ambienti ad alto carico latente. Raffreddamento profondo sotto il punto di rugiada con post-riscaldamento significativo. Possibile ricorso a ruote desiccanti.',\n    areas: 'Hall e sale attesa, Laboratori umidi',\n    tImm: '10 \u2013 12 \u00b0C',\n    xImm: '6,5 \u2013 7,5 g\/kg',\n    tRug: '8 \u2013 10 \u00b0C',\n    postRisc: 'Significativo (+4\u00f76 \u00b0C)',\n    process: [\n      { label: 'Aria esterna', bg: '#e0e0e0', color: '#333' },\n      { label: 'Recuperatore', bg: '#a8d5e2', color: '#0e3d50' },\n      { label: 'Pre-raffr.', bg: '#3a7ca5', color: '#fff' },\n      { label: 'Batt. fredda', bg: '#1a5f7a', color: '#fff' },\n      { label: 'Post-riscald.', bg: '#c45a2c', color: '#fff' },\n      { label: 'Ventilatore', bg: '#ccc', color: '#333' },\n      { label: 'Ambiente', bg: '#2d7a4f', color: '#fff' }\n    ]\n  },\n  {\n    id: 'd',\n    title: 'Sistema Desiccante Dedicato',\n    shrRange: 'SHR < 0,60',\n    color: 'var(--red)',\n    bgColor: 'var(--red-light)',\n    desc: 'Per ambienti con carico latente dominante. Ruota desiccante + raffreddamento evaporativo indiretto. Necessaria rigenerazione termica della ruota.',\n    areas: 'Sterilizzazione, Lavanderia',\n    tImm: '16 \u2013 18 \u00b0C',\n    xImm: '5,5 \u2013 6,5 g\/kg',\n    tRug: '6 \u2013 8 \u00b0C',\n    postRisc: 'Mediante rigenerazione',\n    process: [\n      { label: 'Aria esterna', bg: '#e0e0e0', color: '#333' },\n      { label: 'Ruota desic.', bg: '#b83232', color: '#fff' },\n      { label: 'Raffr. evap.', bg: '#6b4c9a', color: '#fff' },\n      { label: 'Batt. fredda', bg: '#1a5f7a', color: '#fff' },\n      { label: 'Ventilatore', bg: '#ccc', color: '#333' },\n      { label: 'Ambiente', bg: '#2d7a4f', color: '#fff' }\n    ]\n  }\n];\n\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 TAB NAV \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\nlet activeTab = 0;\n\nfunction switchTab(idx) {\n  activeTab = idx;\n  document.querySelectorAll('.nav-tab').forEach((t, i) => t.classList.toggle('active', i === idx));\n  document.querySelectorAll('.section').forEach((s, i) => s.classList.toggle('active', i === idx));\n  \/\/ Ridisegna il diagramma se necessario\n  if (idx === 2) drawPsychChart();\n}\n\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SECTION 1: SHR TABLE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\nlet selectedShrRow = -1;\n\nfunction renderShrTable() {\n  const tbody = document.getElementById('shrTableBody');\n  tbody.innerHTML = '';\n  SHR_DATA.forEach((d, i) => {\n    const pctS = Math.round(d.shrTyp * 100);\n    const pctL = 100 - pctS;\n    const barW = 120;\n    const tr = document.createElement('tr');\n    tr.onclick = () => toggleShrDetail(i);\n    tr.className = selectedShrRow === i ? 'selected' : '';\n    tr.innerHTML = `\n      <td style=\"font-weight:500;color:${d.color}\">${d.area}<\/td>\n      <td class=\"mono\">${d.shrMin.toFixed(2)}<\/td>\n      <td class=\"mono\" style=\"font-weight:700;color:${d.color}\">${d.shrTyp.toFixed(2)}<\/td>\n      <td class=\"mono\">${d.shrMax.toFixed(2)}<\/td>\n      <td class=\"mono\">${d.ach}<\/td>\n      <td class=\"mono\">${pctS}%<\/td>\n      <td class=\"mono\">${pctL}%<\/td>\n      <td>\n        <span class=\"shr-bar\" style=\"width:${Math.round(d.shrTyp * barW)}px;background:${d.color};opacity:0.8\"><\/span>\n        <span class=\"shr-bar\" style=\"width:${Math.round((1 - d.shrTyp) * barW)}px;background:${d.color};opacity:0.25\"><\/span>\n      <\/td>\n    `;\n    tbody.appendChild(tr);\n  });\n}\n\nfunction toggleShrDetail(idx) {\n  selectedShrRow = selectedShrRow === idx ? -1 : idx;\n  renderShrTable();\n\n  const panel = document.getElementById('shrDetail');\n  if (selectedShrRow === -1) { panel.innerHTML = ''; return; }\n\n  const d = SHR_DATA[selectedShrRow];\n  const det = d.detail;\n  const sources = d.sources.map(s => {\n    const cls = s.includes('ASHRAE') ? 'source-ashrae' : s.includes('UNI') ? 'source-uni' : s.includes('CIBSE') ? 'source-cibse' : 'source-docfap';\n    return `<span class=\"source-tag ${cls}\">${s}<\/span>`;\n  }).join(' ');\n\n  panel.innerHTML = `\n    <div class=\"detail-panel\">\n      <h4 style=\"color:${d.color}\">${d.area} \u2014 Composizione del Carico Termico<\/h4>\n      <div class=\"detail-grid\">\n        <div class=\"detail-item\"><div class=\"label\">Involucro<\/div><div class=\"value\">${det.involucro}<span class=\"unit\"> %<\/span><\/div><\/div>\n        <div class=\"detail-item\"><div class=\"label\">Solare<\/div><div class=\"value\">${det.solare}<span class=\"unit\"> %<\/span><\/div><\/div>\n        <div class=\"detail-item\"><div class=\"label\">Illuminazione<\/div><div class=\"value\">${det.illuminazione}<span class=\"unit\"> %<\/span><\/div><\/div>\n        <div class=\"detail-item\"><div class=\"label\">Apparecchiature<\/div><div class=\"value\">${det.apparecchiature}<span class=\"unit\"> %<\/span><\/div><\/div>\n        <div class=\"detail-item\"><div class=\"label\">Persone<\/div><div class=\"value\">${det.persone}<span class=\"unit\"> %<\/span><\/div><\/div>\n        <div class=\"detail-item\"><div class=\"label\">Ventilazione<\/div><div class=\"value\">${det.ventilazione}<span class=\"unit\"> %<\/span><\/div><\/div>\n      <\/div>\n      <p style=\"margin-top:14px;font-size:13px;color:var(--text-muted);line-height:1.7;\">${det.note}<\/p>\n      <div style=\"margin-top:10px;\">${sources}<\/div>\n    <\/div>\n  `;\n}\n\nrenderShrTable();\n\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SECTION 2: METABOLIC TABLE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\nlet currentTemp = 24;\n\nfunction setTemp(t) {\n  currentTemp = t;\n  document.querySelectorAll('.temp-btn').forEach(b => {\n    b.classList.toggle('active', parseInt(b.textContent) === t);\n  });\n  renderMetTable();\n}\n\nfunction renderMetTable() {\n  const tbody = document.getElementById('metTableBody');\n  tbody.innerHTML = '';\n  METABOLIC_DATA.forEach(d => {\n    const { qs, ql, shr } = getSensLatent(d.qtot, currentTemp);\n    const barW = 160;\n    const shrPct = Math.round(shr * 100);\n    const colorS = shr > 0.6 ? 'var(--accent)' : shr > 0.45 ? 'var(--yellow)' : 'var(--red)';\n    const tr = document.createElement('tr');\n    tr.innerHTML = `\n      <td style=\"font-weight:500\">${d.activity}<\/td>\n      <td class=\"mono\">${d.met.toFixed(1)}<\/td>\n      <td class=\"mono\" style=\"font-weight:600\">${d.qtot}<\/td>\n      <td class=\"mono\" style=\"color:var(--accent)\">${qs}<\/td>\n      <td class=\"mono\" style=\"color:var(--warm)\">${ql}<\/td>\n      <td class=\"mono\" style=\"font-weight:600;color:${colorS}\">${shr.toFixed(2)}<\/td>\n      <td>\n        <span class=\"shr-bar\" style=\"width:${Math.round(shr * barW)}px;background:var(--accent);opacity:0.7\"><\/span>\n        <span class=\"shr-bar\" style=\"width:${Math.round((1 - shr) * barW)}px;background:var(--warm);opacity:0.4\"><\/span>\n      <\/td>\n    `;\n    tbody.appendChild(tr);\n  });\n}\n\nrenderMetTable();\n\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SECTION 3: PSYCHROMETRIC CHART \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\nfunction drawPsychChart() {\n  const svg = document.getElementById('psychChart');\n  const W = 900, H = 560;\n  const margin = { top: 30, right: 30, bottom: 50, left: 60 };\n  const pw = W - margin.left - margin.right;\n  const ph = H - margin.top - margin.bottom;\n\n  const tMin = 8, tMax = 38;\n  const xMin = 0, xMax = 22;\n\n  const scX = t => margin.left + (t - tMin) \/ (tMax - tMin) * pw;\n  const scY = x => margin.top + ph - (x - xMin) \/ (xMax - xMin) * ph;\n\n  \/\/ Saturazione\n  function xSat(t) {\n    const psat = 610.7 * Math.pow(10, (7.5 * t) \/ (237.3 + t));\n    return 0.622 * psat \/ (101325 - psat) * 1000;\n  }\n\n  function xUR(t, ur) {\n    const psat = 610.7 * Math.pow(10, (7.5 * t) \/ (237.3 + t));\n    const pv = ur * psat;\n    return 0.622 * pv \/ (101325 - pv) * 1000;\n  }\n\n  let html = '';\n\n  \/\/ Background\n  html += `<rect x=\"0\" y=\"0\" width=\"${W}\" height=\"${H}\" fill=\"#fafaf8\"\/>`;\n  html += `<rect x=\"${margin.left}\" y=\"${margin.top}\" width=\"${pw}\" height=\"${ph}\" fill=\"#fff\" stroke=\"#e8e6e0\"\/>`;\n\n  \/\/ Grid\n  for (let t = 10; t <= 36; t += 2) {\n    html += `<line x1=\"${scX(t)}\" y1=\"${margin.top}\" x2=\"${scX(t)}\" y2=\"${margin.top + ph}\" stroke=\"#f0eeea\" stroke-width=\"0.5\"\/>`;\n  }\n  for (let x = 2; x <= 20; x += 2) {\n    html += `<line x1=\"${margin.left}\" y1=\"${scY(x)}\" x2=\"${margin.left + pw}\" y2=\"${scY(x)}\" stroke=\"#f0eeea\" stroke-width=\"0.5\"\/>`;\n  }\n\n  \/\/ Axis labels\n  for (let t = 10; t <= 36; t += 4) {\n    html += `<text x=\"${scX(t)}\" y=\"${H - 12}\" text-anchor=\"middle\" font-size=\"11\" fill=\"#999\" font-family=\"DM Sans\">${t}\u00b0C<\/text>`;\n  }\n  for (let x = 0; x <= 20; x += 4) {\n    html += `<text x=\"${margin.left - 10}\" y=\"${scY(x) + 4}\" text-anchor=\"end\" font-size=\"11\" fill=\"#999\" font-family=\"DM Sans\">${x}<\/text>`;\n  }\n  html += `<text x=\"${W \/ 2}\" y=\"${H - 0}\" text-anchor=\"middle\" font-size=\"12\" fill=\"#888\" font-family=\"DM Sans\">Temperatura di bulbo secco (\u00b0C)<\/text>`;\n  html += `<text x=\"14\" y=\"${H \/ 2}\" text-anchor=\"middle\" font-size=\"12\" fill=\"#888\" font-family=\"DM Sans\" transform=\"rotate(-90 14 ${H \/ 2})\">Umidit\u00e0 specifica (g\/kg)<\/text>`;\n\n  \/\/ UR curves\n  [0.3, 0.5, 0.7].forEach(ur => {\n    let path = '';\n    for (let t = tMin; t <= tMax; t += 0.5) {\n      const x = xUR(t, ur);\n      if (x >= xMin && x <= xMax) {\n        path += (path === '' ? 'M' : 'L') + ` ${scX(t).toFixed(1)} ${scY(x).toFixed(1)}`;\n      }\n    }\n    html += `<path d=\"${path}\" fill=\"none\" stroke=\"#d0cec8\" stroke-width=\"0.8\" stroke-dasharray=\"4 3\"\/>`;\n    \/\/ Label\n    const tLabel = ur === 0.3 ? 32 : ur === 0.5 ? 28 : 24;\n    const xLabel = xUR(tLabel, ur);\n    if (xLabel <= xMax) {\n      html += `<text x=\"${scX(tLabel) + 4}\" y=\"${scY(xLabel) - 4}\" font-size=\"10\" fill=\"#bbb\" font-family=\"DM Sans\">${Math.round(ur * 100)}%<\/text>`;\n    }\n  });\n\n  \/\/ Saturation curve\n  let satPath = '';\n  for (let t = tMin; t <= tMax; t += 0.3) {\n    const xs = xSat(t);\n    if (xs <= xMax + 1) {\n      satPath += (satPath === '' ? 'M' : 'L') + ` ${scX(t).toFixed(1)} ${scY(xs).toFixed(1)}`;\n    }\n  }\n  html += `<path d=\"${satPath}\" fill=\"none\" stroke=\"#1a5f7a\" stroke-width=\"2\"\/>`;\n  html += `<text x=\"${scX(16)}\" y=\"${scY(xSat(16)) - 6}\" font-size=\"10\" fill=\"#1a5f7a\" font-weight=\"600\" font-family=\"DM Sans\">\u03c6 = 100%<\/text>`;\n\n  \/\/ Comfort zone\n  const comfortT = [22, 26, 26, 22];\n  const comfortX = [xUR(22, 0.4), xUR(26, 0.4), xUR(26, 0.6), xUR(22, 0.6)];\n  let comfortPath = `M ${scX(comfortT[0])} ${scY(comfortX[0])}`;\n  for (let i = 1; i < 4; i++) comfortPath += ` L ${scX(comfortT[i])} ${scY(comfortX[i])}`;\n  comfortPath += ' Z';\n  html += `<path d=\"${comfortPath}\" fill=\"#2d7a4f\" fill-opacity=\"0.06\" stroke=\"#2d7a4f\" stroke-width=\"1\" stroke-dasharray=\"3 2\"\/>`;\n  html += `<text x=\"${scX(24)}\" y=\"${scY(xUR(24, 0.5)) + 3}\" text-anchor=\"middle\" font-size=\"9\" fill=\"#2d7a4f\" font-family=\"DM Sans\" font-weight=\"500\">COMFORT<\/text>`;\n\n  \/\/ Design point: 24\u00b0C, 50% UR\n  const designT = 24;\n  const designX = xUR(24, 0.50);\n  html += `<circle cx=\"${scX(designT)}\" cy=\"${scY(designX)}\" r=\"5\" fill=\"#fff\" stroke=\"#2c2a25\" stroke-width=\"2\"\/>`;\n  html += `<text x=\"${scX(designT) + 10}\" y=\"${scY(designX) + 4}\" font-size=\"10\" fill=\"#2c2a25\" font-weight=\"600\" font-family=\"DM Sans\">24\u00b0C, 50% UR<\/text>`;\n\n  \/\/ SHR lines from design point\n  SHR_DATA.forEach((d, i) => {\n    const shr = d.shrTyp;\n    \/\/ Retta: partendo dal punto di progetto, direzione verso T pi\u00f9 basse e x pi\u00f9 basse\n    \/\/ Angolo: tan(\u03b1) = (1 - SHR) \/ SHR * k  dove k \u00e8 un fattore di scala\n    const k = 18; \/\/ scala grafica\n    const dx_t = -k * shr;       \/\/ variazione T (negativa: si va verso T basse)\n    const dx_x = -k * (1 - shr); \/\/ variazione x (negativa: si va verso x basse)\n\n    const t2 = designT + dx_t;\n    const x2 = designX + dx_x;\n\n    html += `<line \n      x1=\"${scX(designT)}\" y1=\"${scY(designX)}\" \n      x2=\"${scX(t2)}\" y2=\"${scY(x2)}\" \n      stroke=\"${d.color}\" stroke-width=\"2.5\" stroke-opacity=\"0.7\"\n      stroke-linecap=\"round\"\n      class=\"shr-line\" data-idx=\"${i}\"\n      onmouseenter=\"highlightLine(${i})\" onmouseleave=\"unhighlightLine(${i})\"\n    \/>`;\n\n    \/\/ Label at end\n    const labelOffset = 6;\n    html += `<text \n      x=\"${scX(t2) - labelOffset}\" y=\"${scY(x2) - 4}\" \n      font-size=\"9\" fill=\"${d.color}\" font-weight=\"600\" font-family=\"DM Sans\"\n      class=\"shr-line-label\" data-idx=\"${i}\"\n      opacity=\"0.8\"\n    >${d.shrTyp.toFixed(2)}<\/text>`;\n  });\n\n  svg.innerHTML = html;\n\n  \/\/ Legend\n  const legendEl = document.getElementById('legendList');\n  legendEl.innerHTML = SHR_DATA.map((d, i) => `\n    <div class=\"legend-item\" data-idx=\"${i}\" \n         onmouseenter=\"highlightLine(${i})\" onmouseleave=\"unhighlightLine(${i})\">\n      <span class=\"legend-swatch\" style=\"background:${d.color}\"><\/span>\n      <span>${d.area}<\/span>\n      <span class=\"legend-shr\">${d.shrTyp.toFixed(2)}<\/span>\n    <\/div>\n  `).join('');\n}\n\nfunction highlightLine(idx) {\n  document.querySelectorAll('.shr-line').forEach(el => {\n    const i = parseInt(el.dataset.idx);\n    el.setAttribute('stroke-opacity', i === idx ? '1' : '0.15');\n    el.setAttribute('stroke-width', i === idx ? '4' : '1.5');\n  });\n  document.querySelectorAll('.shr-line-label').forEach(el => {\n    const i = parseInt(el.dataset.idx);\n    el.setAttribute('opacity', i === idx ? '1' : '0.1');\n  });\n  document.querySelectorAll('.legend-item').forEach(el => {\n    const i = parseInt(el.dataset.idx);\n    el.classList.toggle('active', i === idx);\n  });\n}\n\nfunction unhighlightLine() {\n  document.querySelectorAll('.shr-line').forEach(el => {\n    el.setAttribute('stroke-opacity', '0.7');\n    el.setAttribute('stroke-width', '2.5');\n  });\n  document.querySelectorAll('.shr-line-label').forEach(el => {\n    el.setAttribute('opacity', '0.8');\n  });\n  document.querySelectorAll('.legend-item').forEach(el => {\n    el.classList.remove('active');\n  });\n}\n\n\/\/ Initial draw\ndrawPsychChart();\n\n\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SECTION 4: STRATEGIES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n\nlet expandedStrategy = -1;\n\nfunction renderStrategies() {\n  const grid = document.getElementById('strategyGrid');\n  grid.innerHTML = STRATEGIES.map((s, i) => {\n    const isExpanded = expandedStrategy === i;\n    return `\n      <div class=\"strategy-card ${isExpanded ? 'expanded' : ''}\" \n           onclick=\"toggleStrategy(${i})\"\n           style=\"border-color:${isExpanded ? s.color : 'var(--border-light)'}\">\n        <div style=\"position:absolute;top:0;left:0;right:0;height:4px;background:${s.color};opacity:${isExpanded ? 1 : 0.4}\"><\/div>\n        <h4 style=\"color:${s.color}\">${s.title}<\/h4>\n        <div class=\"shr-range\">${s.shrRange}<\/div>\n        <div class=\"desc\">${s.desc}<\/div>\n        <div class=\"strategy-detail\" style=\"display:${isExpanded ? 'block' : 'none'}\">\n          <div style=\"margin-bottom:12px;font-size:12px;font-weight:600;color:var(--text-faint);text-transform:uppercase;letter-spacing:0.05em;\">Aree di applicazione<\/div>\n          <div style=\"font-size:13px;color:var(--text);margin-bottom:16px;\">${s.areas}<\/div>\n          \n          <div class=\"param-row\"><span class=\"param-label\">T immissione<\/span><span class=\"param-value\">${s.tImm}<\/span><\/div>\n          <div class=\"param-row\"><span class=\"param-label\">x immissione<\/span><span class=\"param-value\">${s.xImm}<\/span><\/div>\n          <div class=\"param-row\"><span class=\"param-label\">T punto di rugiada<\/span><span class=\"param-value\">${s.tRug}<\/span><\/div>\n          <div class=\"param-row\"><span class=\"param-label\">Post-riscaldamento<\/span><span class=\"param-value\">${s.postRisc}<\/span><\/div>\n          \n          <div style=\"margin-top:14px;font-size:12px;font-weight:600;color:var(--text-faint);text-transform:uppercase;letter-spacing:0.05em;\">Schema di trattamento<\/div>\n          <div class=\"process-flow\">\n            ${s.process.map((p, j) => `\n              ${j > 0 ? '<span class=\"process-arrow\">\u2192<\/span>' : ''}\n              <span class=\"process-step\" style=\"background:${p.bg};color:${p.color}\">${p.label}<\/span>\n            `).join('')}\n          <\/div>\n        <\/div>\n      <\/div>\n    `;\n  }).join('');\n}\n\nfunction toggleStrategy(idx) {\n  expandedStrategy = expandedStrategy === idx ? -1 : idx;\n  renderStrategies();\n}\n\nrenderStrategies();\n\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>HVAC \u2014 Progettazione Ospedaliera Sensible Heat Rationegli Ambienti Ospedalieri Analisi della ripartizione tra carico termico sensibile e latente per le diverse aree funzionali, con applicazione al Nuovo Ospedale di Cosenza. 1 SHR per Area 2 Carichi Metabolici 3 Diagramma \u03c8 4 Strategie SHR per Area Funzionale Valori tipici del Sensible Heat Ratio per le principali [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2,149],"tags":[3,180],"class_list":["post-1952","post","type-post","status-publish","format-standard","hentry","category-impianti-meccanici","category-progettazione-ospedaliera-it","tag-hvac","tag-uni-10339-it"],"acf":[],"_links":{"self":[{"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=\/wp\/v2\/posts\/1952","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1952"}],"version-history":[{"count":1,"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=\/wp\/v2\/posts\/1952\/revisions"}],"predecessor-version":[{"id":1953,"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=\/wp\/v2\/posts\/1952\/revisions\/1953"}],"wp:attachment":[{"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1952"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1952"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wiki.atsrl.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}