{"id":580,"date":"2026-03-19T15:34:57","date_gmt":"2026-03-19T18:34:57","guid":{"rendered":"https:\/\/www.gaap.deqm.puc-rio.br\/?page_id=580"},"modified":"2026-04-09T15:31:55","modified_gmt":"2026-04-09T18:31:55","slug":"gaap-virtual-lab","status":"publish","type":"page","link":"https:\/\/www.gaap.deqm.puc-rio.br\/en\/gaap-virtual-lab\/","title":{"rendered":"GAAP Virtual LAB"},"content":{"rendered":"<div id=\"gaap-sim-container\">\r\n\t<div class=\"gaap-header\">\r\n\t\t<h2>Laborat\u00f3rio Virtual: Din\u00e2mica de Tanques (GAAP)<\/h2>\r\n\t\t<p>Ajuste os controles em tempo real.<\/p>\r\n\t<\/div>\r\n\r\n\t<div class=\"gaap-sim-grid\">\r\n\t\t<div class=\"gaap-visual-panel\">\r\n\t\t\t<svg viewbox=\"0 0 500 400\" width=\"100%\" height=\"100%\" style=\"background:#f4f7f6; border-radius:8px;\">\r\n\t\t\t\t<defs>\r\n\t\t\t\t\t<lineargradient id=\"gaap-water-grad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\r\n\t\t\t\t\t\t<stop offset=\"0%\" stop-color=\"#3498db\" stop-opacity=\"0.9\"\/>\r\n\t\t\t\t\t\t<stop offset=\"100%\" stop-color=\"#2980b9\" stop-opacity=\"0.95\"\/>\r\n\t\t\t\t\t<\/lineargradient>\r\n\t\t\t\t<\/defs>\r\n\r\n\t\t\t\t<path d=\"M 50 250 L 150 250 L 150 150 L 220 150\" fill=\"none\" stroke=\"#7f8c8d\" stroke-width=\"12\" stroke-linecap=\"round\"\/>\r\n\t\t\t\t<path d=\"M 220 150 L 210 142 M 220 150 L 210 158\" fill=\"none\" stroke=\"#7f8c8d\" stroke-width=\"4\"\/> <circle cx=\"100\" cy=\"250\" r=\"22\" fill=\"#fff\" stroke=\"#2c3e50\" stroke-width=\"4\"\/>\r\n\t\t\t\t<circle id=\"gaap-pump-led\" cx=\"100\" cy=\"250\" r=\"8\" fill=\"#e74c3c\"\/>\r\n\t\t\t\t<text x=\"100\" y=\"295\" font-family=\"Arial\" font-size=\"14\" font-weight=\"bold\" text-anchor=\"middle\" fill=\"#2c3e50\">P-01<\/text>\r\n\t\t\t\t\r\n\t\t\t\t<path d=\"M 220 120 L 220 280 A 80 40 0 0 0 380 280 L 380 120 A 80 40 0 0 0 220 120 Z\" fill=\"#fff\" stroke=\"#2c3e50\" stroke-width=\"6\"\/>\r\n\t\t\t\t\r\n\t\t\t\t<clippath id=\"gaap-tank-clip\">\r\n\t\t\t\t\t<path d=\"M 223 120 L 223 280 A 77 37 0 0 0 377 280 L 377 120 A 77 37 0 0 0 223 120 Z\"\/>\r\n\t\t\t\t<\/clippath>\r\n\t\t\t\t<rect id=\"gaap-water\" x=\"223\" y=\"320\" width=\"154\" height=\"0\" fill=\"url(#gaap-water-grad)\" clip-path=\"url(#gaap-tank-clip)\" \/>\r\n\t\t\t\t<text x=\"300\" y=\"100\" font-family=\"Arial\" font-size=\"14\" font-weight=\"bold\" text-anchor=\"middle\" fill=\"#2c3e50\">T-01<\/text>\r\n\t\t\t\t<text x=\"300\" y=\"300\" font-family=\"Arial\" font-size=\"10\" font-weight=\"bold\" text-anchor=\"middle\" fill=\"#2c3e50\">Capacidade: 1000L<\/text>\r\n\r\n\t\t\t\t<path d=\"M 300 320 L 300 350 L 450 350\" fill=\"none\" stroke=\"#7f8c8d\" stroke-width=\"12\" stroke-linecap=\"round\"\/>\r\n\t\t\t\t<path d=\"M 450 350 L 440 342 M 450 350 L 440 358\" fill=\"none\" stroke=\"#7f8c8d\" stroke-width=\"4\"\/>\r\n\t\t\t\t<g id=\"gaap-valve-v01\">\r\n\t\t\t\t\t<line id=\"gaap-valve-stem\" x1=\"390\" y1=\"350\" x2=\"390\" y2=\"315\" stroke=\"#95a5a6\" stroke-width=\"4\"\/>\r\n\t\t\t\t\t<path id=\"gaap-valve-dome\" d=\"M 365 315 Q 390 295 415 315 Z\" fill=\"#e74c3c\" stroke=\"#2c3e50\" stroke-width=\"3\" stroke-linejoin=\"round\"\/>\r\n\t\t\t\t\t<rect x=\"367.5\" y=\"314\" width=\"45\" height=\"4\" fill=\"#2c3e50\" rx=\"2\"\/>\r\n\t\t\t\t\t<path id=\"gaap-valve-body\" d=\"M 370 335 L 370 365 L 410 335 L 410 365 Z\" fill=\"#e74c3c\" stroke=\"#2c3e50\" stroke-width=\"3\" stroke-linejoin=\"round\"\/>\r\n\t\t\t\t\t<line x1=\"370\" y1=\"335\" x2=\"370\" y2=\"365\" stroke=\"#2c3e50\" stroke-width=\"3\" stroke-linecap=\"round\"\/>\r\n\t\t\t\t\t<line x1=\"410\" y1=\"335\" x2=\"410\" y2=\"365\" stroke=\"#2c3e50\" stroke-width=\"3\" stroke-linecap=\"round\"\/>\r\n\t\t\t\t\t<text x=\"390\" y=\"390\" font-family=\"Arial\" font-size=\"14\" font-weight=\"bold\" text-anchor=\"middle\" fill=\"#2c3e50\">V-01<\/text>\r\n\t\t\t\t<\/g>\r\n\t\t\t<\/svg>\r\n\t\t<\/div>\r\n\r\n\t\t<div class=\"gaap-controls-panel\">\r\n\t\t\t<div class=\"gaap-control-group\">\r\n\t\t\t\t<h3>Estado do Sistema<\/h3>\r\n\t\t\t\t<div class=\"gaap-status-grid\">\r\n\t\t\t\t\t<div class=\"gaap-status-box\">\r\n\t\t\t\t\t\t<span class=\"label\">Volume<\/span>\r\n\t\t\t\t\t\t<span class=\"value\" id=\"val-volume\">200.0 L<\/span>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"gaap-status-box\">\r\n\t\t\t\t\t\t<span class=\"label\">N\u00edvel<\/span>\r\n\t\t\t\t\t\t<span class=\"value\" id=\"val-level\">20.0%<\/span>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"gaap-status-box\">\r\n\t\t\t\t\t\t<span class=\"label\">Entrada (Qin)<\/span>\r\n\t\t\t\t\t\t<span class=\"value\" id=\"val-qin\">0.0 L\/s<\/span>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t\t<div class=\"gaap-status-box\">\r\n\t\t\t\t\t\t<span class=\"label\">Sa\u00edda (Qout)<\/span>\r\n\t\t\t\t\t\t<span class=\"value\" id=\"val-qout\">0.0 L\/s<\/span>\r\n\t\t\t\t\t<\/div>\r\n\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"gaap-control-group\">\r\n\t\t\t\t<h3>Comandos<\/h3>\r\n\t\t\t\t<button id=\"btn-toggle-sim\" class=\"gaap-btn primary\">Iniciar Simula\u00e7\u00e3o<\/button>\r\n\t\t\t\t<button id=\"btn-reset\" class=\"gaap-btn secondary\">Resetar para Inicial<\/button>\r\n\t\t\t\t<div style=\"margin-top: 15px;\">\r\n\t\t\t\t\t<button id=\"btn-toggle-pump\" class=\"gaap-btn danger\">Bomba: DESLIGADA<\/button>\r\n\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\r\n\t\t\t<div class=\"gaap-control-group\">\r\n\t\t\t\t<h3>Par\u00e2metros Operacionais<\/h3>\r\n\t\t\t\t<label for=\"slider-pump\">Vaz\u00e3o de Entrada Qin (%)<\/label>\r\n\t\t\t\t<input type=\"range\" id=\"slider-pump\" min=\"0\" max=\"100\" value=\"70\">\r\n\t\t\t\t<span id=\"label-pump-perc\" class=\"slider-val\">70%<\/span>\r\n\t\t\t\t<label for=\"slider-valve\" style=\"margin-top: 15px;\">Abertura da V\u00e1lvula V-01 (%)<\/label>\r\n\t\t\t\t<input type=\"range\" id=\"slider-valve\" min=\"0\" max=\"100\" value=\"0\">\r\n\t\t\t\t<span id=\"label-valve-perc\" class=\"slider-val\">0%<\/span>\r\n\t\t\t<\/div>\r\n\t\t<\/div>\r\n\t\r\n\t\t<div class=\"gaap-chart-panel\">\r\n\t\t\t\t<canvas id=\"gaap-volume-chart\"><\/canvas>\r\n\t\t<\/div>\r\n\t<\/div>\r\n<\/div>\r\n\r\n<style>\r\n    \/* Estilos encapsulados para n\u00e3o quebrar o tema do WordPress *\/\r\n    #gaap-sim-container {\r\n        font-family: 'Roboto', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\r\n        background: #fdfdfd;\r\n        border: 1px solid #e1e8ed;\r\n        border-radius: 12px;\r\n        padding: 25px;\r\n        max-width: 950px;\r\n        margin: 20px auto;\r\n        box-shadow: 0 10px 20px rgba(0,0,0,0.06);\r\n    }\r\n    .gaap-header { text-align: center; margin-bottom: 25px; border-bottom: 1px solid #eee; padding-bottom: 15px; }\r\n    .gaap-header h2 { margin: 0; color: #2c3e50; font-size: 26px; font-weight: bold; }\r\n    .gaap-header p { color: #95a5a6; font-size: 15px; margin-top: 5px;}\r\n    \r\n    .gaap-sim-grid {\r\n        display: flex;\r\n        flex-wrap: wrap;\r\n        gap: 25px;\r\n    }\r\n    .gaap-visual-panel {\r\n        flex: 1 1 400px;\r\n        display: flex;\r\n        justify-content: center;\r\n        align-items: center;\r\n        min-height: 400px;\r\n    }\r\n    .gaap-controls-panel {\r\n        flex: 1 1 300px;\r\n        display: flex;\r\n        flex-direction: column;\r\n        gap: 20px;\r\n    }\r\n    .gaap-control-group {\r\n        background: #fff;\r\n        padding: 20px;\r\n        border-radius: 10px;\r\n        border: 1px solid #e1e8ed;\r\n    }\r\n    .gaap-control-group h3 {\r\n        margin-top: 0; margin-bottom: 20px; font-size: 17px; color: #34495e; font-weight: bold; text-transform: uppercase; letter-spacing: 1px;\r\n    }\r\n    \r\n    .gaap-status-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }\r\n    .gaap-status-box { background: #f4f7f6; padding: 12px; border-radius: 8px; text-align: center; border: 1px solid #eee;}\r\n    .gaap-status-box .label { display: block; font-size: 11px; color: #7f8c8d; font-weight: bold; text-transform: uppercase; letter-spacing: 0.5px;}\r\n    .gaap-status-box .value { display: block; font-size: 20px; color: #2c3e50; font-weight: bold; margin-top: 6px; }\r\n\r\n    .gaap-btn {\r\n        width: 100%; padding: 12px; border: none; border-radius: 8px; font-weight: bold; font-size: 14px; cursor: pointer; transition: 0.2s; margin-bottom: 6px;\r\n    }\r\n    .gaap-btn.primary { background: #3498db; color: white; }\r\n    .gaap-btn.primary:hover { background: #2980b9; }\r\n    .gaap-btn.secondary { background: #95a5a6; color: white; }\r\n    .gaap-btn.secondary:hover { background: #7f8c8d; }\r\n    .gaap-btn.success { background: #2ecc71; color: white; }\r\n    .gaap-btn.success:hover { background: #27ae60; }\r\n    .gaap-btn.danger { background: #e74c3c; color: white; }\r\n    .gaap-btn.danger:hover { background: #c0392b; }\r\n\r\n    input[type=range] { width: 100%; cursor: pointer; margin-top: 8px; }\r\n    label { font-size: 14px; font-weight: bold; color: #34495e; display: block; margin-bottom: 2px; }\r\n    .slider-val { font-size: 13px; color: #7f8c8d; display: block; text-align: right; }\r\n    .gaap-help-text { font-size: 11px; color: #95a5a6; font-style: italic; margin-top: 10px; text-align: center;}\r\n    \r\n    .gaap-chart-panel {\r\n        flex: 1 1 100%;\r\n        background: #fff;\r\n        padding: 20px;\r\n        border-radius: 10px;\r\n        border: 1px solid #e1e8ed;\r\n        height: 250px;\r\n    }\r\n<\/style>\r\n\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\r\n\r\n<script>\r\n    \/\/ ==========================================\r\n    \/\/ F\u00cdSICA E SIMULA\u00c7\u00c3O (Integra\u00e7\u00e3o RK4)\r\n    \/\/ ==========================================\r\n    const SIM = {\r\n        maxVolume: 1000.0,\r\n        maxPumpFlow: 45.0, \r\n        k_v: 6.5,          \r\n        \r\n        state: {\r\n            volume: 200.0,\r\n            isRunning: false,\r\n            pumpOn: false,\r\n            pumpIntensity: 70, \r\n            valveOpening: 0,  \r\n            lastTime: 0,\r\n            elapsedSimTime: 0\r\n        },\r\n        svg: { waterYBase: 320, maxWaterHeight: 240 }\r\n    };\r\n\r\n    const DOM = {\r\n        waterRect: document.getElementById('gaap-water'),\r\n        pumpLED: document.getElementById('gaap-pump-led'),\r\n        valveDome: document.getElementById('gaap-valve-dome'),\r\n        valveBody: document.getElementById('gaap-valve-body'),\r\n        valVol: document.getElementById('val-volume'),\r\n        valLevel: document.getElementById('val-level'),\r\n        valQin: document.getElementById('val-qin'),\r\n        valQout: document.getElementById('val-qout'),\r\n        btnSim: document.getElementById('btn-toggle-sim'),\r\n        btnReset: document.getElementById('btn-reset'),\r\n        btnPump: document.getElementById('btn-toggle-pump'),\r\n        sliderPump: document.getElementById('slider-pump'),\r\n        labelPump: document.getElementById('label-pump-perc'),\r\n        sliderValve: document.getElementById('slider-valve'),\r\n        labelValve: document.getElementById('label-valve-perc')\r\n    };\r\n\r\n    \/\/ ==========================================\r\n    \/\/ CONFIGURA\u00c7\u00c3O DO GR\u00c1FICO (Chart.js)\r\n    \/\/ ==========================================\r\n    const ctx = document.getElementById('gaap-volume-chart').getContext('2d');\r\n    const volumeChart = new Chart(ctx, {\r\n        type: 'line',\r\n        data: {\r\n            labels: [0], \r\n            datasets: [{\r\n                label: 'Volume no Tanque',\r\n                data: [200], \r\n                borderColor: '#3498db',\r\n                backgroundColor: 'rgba(52, 152, 219, 0.2)',\r\n                borderWidth: 2,\r\n                fill: true,\r\n                pointRadius: 0,           \/\/ Mant\u00e9m as bolinhas invis\u00edveis por padr\u00e3o\r\n                pointHoverRadius: 6,      \/\/ Ao passar o mouse, a bolinha aparece com tamanho 6\r\n                hitRadius: 15,            \/\/ \u00c1rea invis\u00edvel de 15px ao redor da linha para o mouse detectar facilmente\r\n                tension: 0.1 \r\n            }]\r\n        },\r\n        options: {\r\n            responsive: true,\r\n            maintainAspectRatio: false,\r\n            animation: false, \r\n            interaction: {\r\n                mode: 'index',      \/\/ Detecta o ponto com base na posi\u00e7\u00e3o horizontal (X) do mouse\r\n                intersect: false    \/\/ Permite que o tooltip apare\u00e7a mesmo se n\u00e3o estiver exatamente em cima da linha\r\n            },\r\n            plugins: {\r\n                tooltip: {\r\n                    backgroundColor: 'rgba(44, 62, 80, 0.9)', \/\/ Cor de fundo do tooltip (estilo GAAP)\r\n                    titleFont: { size: 14 },\r\n                    bodyFont: { size: 14, weight: 'bold' },\r\n                    padding: 10,\r\n                    callbacks: {\r\n                        \/\/ Formata o texto que aparece dentro da caixinha (Tooltip)\r\n                        title: function(context) {\r\n                            return 'Tempo: ' + context[0].label + 's';\r\n                        },\r\n                        label: function(context) {\r\n                            return 'Volume: ' + context.parsed.y.toFixed(1) + ' Litros';\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            scales: {\r\n                x: { title: { display: true, text: 'Tempo (s)' } },\r\n                y: { min: 0, max: 1000, title: { display: true, text: 'Volume (L)' } }\r\n            }\r\n        }\r\n    });\r\n\r\n    let chartUpdateTimer = 0; \r\n\r\n    function updateChart(dt) {\r\n        chartUpdateTimer += dt;\r\n        SIM.state.elapsedSimTime += dt;\r\n\r\n        \/\/ Atualiza o gr\u00e1fico de 1 em 1 segundo (evita tempos quebrados\/duplicados no eixo)\r\n        if (chartUpdateTimer >= 1.0) {\r\n            chartUpdateTimer = 0;\r\n            \r\n            volumeChart.data.labels.push(Math.round(SIM.state.elapsedSimTime));\r\n            volumeChart.data.datasets[0].data.push(SIM.state.volume);\r\n\r\n            \/\/ Mant\u00e9m apenas os \u00faltimos 60 pontos no gr\u00e1fico para n\u00e3o pesar\r\n            if (volumeChart.data.labels.length > 60) {\r\n                volumeChart.data.labels.shift();\r\n                volumeChart.data.datasets[0].data.shift();\r\n            }\r\n            volumeChart.update();\r\n        }\r\n    }\r\n\r\n    function resetChart() {\r\n        SIM.state.elapsedSimTime = 0;\r\n        chartUpdateTimer = 0;\r\n        volumeChart.data.labels = [0];\r\n        volumeChart.data.datasets[0].data = [SIM.state.volume];\r\n        volumeChart.update();\r\n    }\r\n\r\n    \/\/ ==========================================\r\n    \/\/ EQUA\u00c7\u00c3O E MOTOR F\u00cdSICO\r\n    \/\/ ==========================================\r\n    function dVdt(V) {\r\n        let qIn = 0;\r\n        if (SIM.state.pumpOn) { qIn = (SIM.state.pumpIntensity \/ 100.0) * SIM.maxPumpFlow; }\r\n        const normalizedLevel = V \/ SIM.maxVolume;\r\n        let qOut = 0;\r\n        if (V > 0) { qOut = (SIM.state.valveOpening \/ 100.0) * SIM.k_v * Math.sqrt(normalizedLevel * SIM.maxVolume); }\r\n        return { net: qIn - qOut, qIn: qIn, qOut: qOut };\r\n    }\r\n\r\n    function rungeKutta4(timestamp) {\r\n        if (!SIM.state.lastTime) SIM.state.lastTime = timestamp;\r\n        let dt = (timestamp - SIM.state.lastTime) \/ 1000.0;\r\n        SIM.state.lastTime = timestamp;\r\n        if (dt > 0.1) dt = 0.1;\r\n\r\n        if (SIM.state.isRunning && dt > 0) {\r\n            const V0 = SIM.state.volume;\r\n            const k1 = dVdt(V0).net;\r\n            const k2 = dVdt(V0 + 0.5 * k1 * dt).net;\r\n            const k3 = dVdt(V0 + 0.5 * k2 * dt).net;\r\n            const k4 = dVdt(V0 + k3 * dt).net;\r\n            let newVolume = V0 + (1\/6) * (k1 + 2*k2 + 2*k3 + k4) * dt;\r\n\r\n            if (newVolume < 0) newVolume = 0;\r\n            if (newVolume > SIM.maxVolume) newVolume = SIM.maxVolume;\r\n\r\n            SIM.state.volume = newVolume;\r\n            const finalFlows = dVdt(newVolume);\r\n            \r\n            updateUI(finalFlows.qIn, finalFlows.qOut);\r\n            updateChart(dt); \r\n        }\r\n        requestAnimationFrame(rungeKutta4);\r\n    }\r\n\r\n    function updateUI(qIn = 0, qOut = 0) {\r\n        const volume = SIM.state.volume;\r\n        const levelPerc = volume \/ SIM.maxVolume;\r\n\r\n        DOM.valVol.textContent = volume.toFixed(1) + ' L';\r\n        DOM.valLevel.textContent = (levelPerc * 100).toFixed(1) + '%';\r\n        DOM.valQin.textContent = SIM.state.isRunning ? qIn.toFixed(1) + ' L\/s' : '0.0 L\/s';\r\n        DOM.valQout.textContent = SIM.state.isRunning ? qOut.toFixed(1) + ' L\/s' : '0.0 L\/s';\r\n\r\n        const currentHeight = levelPerc * SIM.svg.maxWaterHeight;\r\n        DOM.waterRect.setAttribute('height', currentHeight);\r\n        DOM.waterRect.setAttribute('y', SIM.svg.waterYBase - currentHeight);\r\n        DOM.pumpLED.setAttribute('fill', SIM.state.pumpOn ? '#2ecc71' : '#e74c3c');\r\n\r\n        const valvePerc = SIM.state.valveOpening \/ 100.0;\r\n        const r = Math.round(231 + (46 - 231) * valvePerc);\r\n        const g = Math.round(76 + (204 - 76) * valvePerc);\r\n        const b = Math.round(60 + (113 - 60) * valvePerc);\r\n        const valveColor = `rgb(${r}, ${g}, ${b})`;\r\n        DOM.valveDome.setAttribute('fill', valveColor);\r\n        DOM.valveBody.setAttribute('fill', valveColor);\r\n    }\r\n\r\n    \/\/ Eventos\r\n    DOM.btnSim.addEventListener('click', () => {\r\n        SIM.state.isRunning = !SIM.state.isRunning;\r\n        SIM.state.lastTime = 0; \r\n        DOM.btnSim.textContent = SIM.state.isRunning ? \"Pausar Simula\u00e7\u00e3o\" : \"Iniciar Simula\u00e7\u00e3o\";\r\n        DOM.btnSim.className = SIM.state.isRunning ? \"gaap-btn success\" : \"gaap-btn primary\";\r\n        if(!SIM.state.isRunning) updateUI(0,0);\r\n    });\r\n\r\n    DOM.btnReset.addEventListener('click', () => {\r\n        SIM.state.volume = 200.0;\r\n        SIM.state.isRunning = false;\r\n        SIM.state.lastTime = 0;\r\n        DOM.btnSim.textContent = \"Iniciar Simula\u00e7\u00e3o\";\r\n        DOM.btnSim.className = \"gaap-btn primary\";\r\n        updateUI(0, 0);\r\n        resetChart(); \r\n    });\r\n\r\n    DOM.btnPump.addEventListener('click', () => {\r\n        SIM.state.pumpOn = !SIM.state.pumpOn;\r\n        DOM.btnPump.textContent = SIM.state.pumpOn ? \"Bomba: LIGADA\" : \"Bomba: DESLIGADA\";\r\n        DOM.btnPump.className = SIM.state.pumpOn ? \"gaap-btn success\" : \"gaap-btn danger\";\r\n        if(!SIM.state.isRunning) updateUI(0,0);\r\n    });\r\n\r\n    DOM.sliderPump.addEventListener('input', (e) => {\r\n        const val = parseInt(e.target.value);\r\n        SIM.state.pumpIntensity = val;\r\n        DOM.labelPump.textContent = val + '%';\r\n    });\r\n\r\n    DOM.sliderValve.addEventListener('input', (e) => {\r\n        const val = parseInt(e.target.value);\r\n        SIM.state.valveOpening = val;\r\n        DOM.labelValve.textContent = val + '%';\r\n        if(!SIM.state.isRunning) updateUI(0,0);\r\n    });\r\n\r\n    updateUI(0, 0);\r\n    requestAnimationFrame(rungeKutta4);\r\n<\/script>\n\n\n\n<hr class=\"wp-block-separator alignwide has-alpha-channel-opacity\"\/>\n\n\n\n<div class=\"wp-block-group alignwide is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-23441af8 wp-block-group-is-layout-flex\">\n<iframe loading=\"lazy\" src=\"\/wp-content\/uploads\/GAAP_VL\/index.html\" width=\"1920px\" height=\"1080px\" style=\"border: none; border-radius: 12px;\"><\/iframe>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"page-no-title","meta":{"footnotes":""},"class_list":["post-580","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.gaap.deqm.puc-rio.br\/en\/wp-json\/wp\/v2\/pages\/580","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gaap.deqm.puc-rio.br\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.gaap.deqm.puc-rio.br\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.gaap.deqm.puc-rio.br\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gaap.deqm.puc-rio.br\/en\/wp-json\/wp\/v2\/comments?post=580"}],"version-history":[{"count":32,"href":"https:\/\/www.gaap.deqm.puc-rio.br\/en\/wp-json\/wp\/v2\/pages\/580\/revisions"}],"predecessor-version":[{"id":652,"href":"https:\/\/www.gaap.deqm.puc-rio.br\/en\/wp-json\/wp\/v2\/pages\/580\/revisions\/652"}],"wp:attachment":[{"href":"https:\/\/www.gaap.deqm.puc-rio.br\/en\/wp-json\/wp\/v2\/media?parent=580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}