Do Permanente ao Dinâmico¶
Neste tutorial você leva um sistema pequeno de água, um tanque entre duas válvulas, de um estado estacionário resolvido a uma corrida dinâmica na GUI Clássica do DWSIM. O nível do tanque sobe, a vazão de saída acompanha, e depois de alguns minutos os dois se equilibram. Toda simulação dinâmica no DWSIM começa como esta: um flowsheet convergido, um holdup com volume, válvulas que transformam pressão em vazão, correntes de fronteira com especificação de pressão ou de vazão, e um schedule que diz ao integrador por quanto tempo rodar.
O que você vai aprender
- O que muda quando o Modo Dinâmico está ligado: holdups definem pressões, válvulas definem vazões, correntes de fronteira mantêm uma pressão ou uma vazão
- Como dar volume e altura a um tanque, Kv a uma válvula e especificação dinâmica a uma corrente
- Como criar integrador, schedule e variáveis monitoradas no Dynamics Manager, rodar o schedule pelo Integrator Controls e ler os resultados na planilha
Pré-requisitos
- Ter completado Aquecedor e Resfriador ou qualquer tutorial de regime permanente: você deve estar à vontade criando correntes e operações unitárias
- A ideia de balanço de massa com acúmulo: o que entra e não sai fica no tanque
Visão Geral do Processo¶
Um suprimento de água a 1,3 bar alimenta um tanque por uma válvula; o tanque drena por uma segunda válvula para uma linha à pressão atmosférica:
- Inlet entrega 10 kg/s de água, fixados por uma especificação de Vazão
- V-01 é a válvula de entrada, com Kv fixo de 100 e abertura de 50 %
- T-01 é um tanque aberto de 2 m³ e 2 m de altura
- V-02 é a válvula de saída, Kv 400 na abertura total, meio aberta
- Outlet é mantida a 1 atm por uma especificação de Pressão
Em regime permanente o tanque não tem nível: só passa os 10 kg/s adiante. Em modo dinâmico o nível é a variável de estado do sistema, e ele se acomoda onde a coluna de líquido empurra exatamente 10 kg/s pela V-02.
Diagrama de Fluxo do Processo¶
graph LR
IN["Inlet<br/>25 °C, 1,3 bar<br/>10 kg/s Água<br/>(spec Vazão)"] --> V1["V-01<br/>Kv 100, 50 %"]
V1 --> T["T-01<br/>(Tanque)<br/>2 m³, 2 m"]
T --> V2["V-02<br/>Kv 400, 50 %"]
V2 --> OUT["Outlet<br/>1 atm<br/>(spec Pressão)"]
Parâmetros de Projeto¶
| Parâmetro | Valor | Unidade |
|---|---|---|
| Composto | Água | - |
| Pacote termodinâmico | Steam Tables (IAPWS-IF97) | - |
| Temperatura da entrada | 298,15 (25 °C) | K |
| Pressão da entrada | 130000 (1,3 bar) | Pa |
| Vazão mássica da entrada | 10 | kg/s |
| Kv (fixo) e abertura da V-01 | 100, 50 | m³/h, % |
| Volume e altura do tanque | 2, 2 | m³, m |
| Kv (a 100 %) e abertura da V-02 | 400, 50 | m³/h, % |
| Pressão da saída | 101325 | Pa |
| Passo e duração da integração | 5, 10 | s, min |
Passo a Passo na GUI Clássica¶
1. Configurar a simulação¶
File > New Chemical Process Model:
- Compostos:
Water - Pacote termodinâmico:
Steam Tables (IAPWS-IF97) - Clique em Finish
2. Criar as correntes e as unidades¶
Arraste quatro Material Streams para o canvas e nomeie Inlet, S-1, S-2 e Outlet. Em Inlet ponha T = 298.15 K, P = 130000 Pa, Vazão mássica = 10 kg/s, Água = 1,0. Deixe as outras três vazias.
Arraste duas Valves e um Tank da Object Palette e renomeie para V-01, T-01 e V-02. Conecte na ordem Inlet → V-01 → S-1 → T-01 → S-2 → V-02 → Outlet.
3. Configurar as válvulas¶
Abra V-01:
- Calculation Type:
Liquid Service Kv/Cv (Deprecated), o modo de Kv para líquidos com que esta página foi medida - Kv[Cv](max) (IEC 60534):
100, com Kv selecionado - Valve Opening (%):
50 - Deixe Use Opening (%) versus Kv[Cv]/Kv[Cv]max (%) relationship desmarcado: esta válvula passa o Kv inteiro qualquer que seja a abertura
Abra V-02:
- Calculation Type:
Liquid Service Kv/Cv (Deprecated) - Kv[Cv](max) (IEC 60534):
400, com Kv selecionado - Use Opening (%) versus Kv[Cv]/Kv[Cv]max (%) relationship: marcado, com Opening/Kv[Cv] rel. type =
Linear - Valve Opening (%):
50
Por que Kv e não queda de pressão
Em modo dinâmico a válvula é o único objeto que transforma diferença de pressão em vazão. Uma válvula em modo de queda de pressão precisa que alguém de fora lhe diga a vazão; uma válvula em modo Kv calcula a vazão a partir das pressões dos dois lados, que é o que uma válvula real faz. Ponha toda válvula que vai rodar em modo dinâmico num dos modos Kv.
4. Resolver o regime permanente¶
Pressione Solve (F5). As válvulas calculam as pressões de saída pela equação de Kv: S-1 e S-2 saem com cerca de 1,17 bar e a Outlet com cerca de 1,14 bar. O tanque passa a vazão adiante. Esse regime permanente é o ponto de partida de toda corrida dinâmica, e precisa convergir antes de qualquer outra coisa.

5. Ligar o Modo Dinâmico¶
Dynamics > Dynamic Mode Active, ou o botão Dynamic Mode Active/Inactive no grupo Dynamics Solver da barra de ferramentas do flowsheet. A partir daí, abrir um objeto que tem propriedades dinâmicas abre também um segundo painel, Dynamic Mode Properties, encaixado ao lado do editor, e os objetos que não rodam em modo dinâmico mostram um ícone de exclamação.
6. Dar volume e altura ao tanque¶
Abra T-01. No editor:
- Volume:
2 m³
No painel Dynamic Mode Properties:
- Height:
2 m - Initialize using Inlet Stream: deixe desmarcado
- Reset Content: deixe desmarcado
O tanque começa a corrida vazio e enche pela entrada. A seção transversal é volume sobre altura, 1 m², então cada 997 kg de água dentro dele são um metro de nível.

7. Especificar as correntes de fronteira¶
Abra Inlet e, em Stream Conditions, ponha Dynamic P/F Spec = Flow. Abra Outlet, ponha Dynamic P/F Spec = Pressure e a pressão em 101325 Pa.
Pressão ou Vazão
Toda corrente que entra ou sai do flowsheet precisa de uma das duas. Flow quer dizer que a corrente traz uma vazão mássica fixa qualquer que seja a pressão a jusante; Pressure quer dizer que a corrente mantém uma pressão fixa e aceita a vazão que chegar. Uma bomba de alimentação ou a descarga de um compressor é uma fronteira de Vazão; um header, um flare ou a atmosfera é uma fronteira de Pressão. Dentro do flowsheet as correntes não precisam de especificação: os holdups definem as pressões e as válvulas definem as vazões.
8. Criar o integrador e o schedule¶
Dynamics > Dynamics Manager:
- Integrators: adicione
Int1com Integration Step (ms) =5000e Duration =10 min. Em Monitored Variables, adicione T-01Liquid Level(m), V-02Opening(%) e OutletMass Flow(kg/s). - Schedules: adicione
Sch1, escolhaInt1como Associated Integrator, marque Use Current State e marque Reset/Empty Contents of All Volume-Defined Objects Before Running. Assim toda corrida deSch1parte de um tanque vazio com os ajustes que o flowsheet tem naquele momento, que é o que os exercícios do fim da página precisam.

9. Rodar o schedule¶
Dynamics > Integrator Controls: escolha Sch1 na caixa Schedule e pressione Run Schedule. O relógio avança 5 s por passo; a corrida leva alguns segundos. Quando parar, pressione View Results: uma nova aba de planilha guarda as variáveis monitoradas contra o tempo.
10. Ler os resultados¶
O nível começa perto de zero (a primeira amostra marca 0,01 m) e sobe: 0,23 m em 1 min, 0,30 m em 2 min, 0,32 m em 3 min, e 0,333 m a partir de 7 min. A vazão de saída acompanha o nível: 8,4 kg/s em 1 min, 9,4 kg/s em 2 min, 10,0 kg/s no fim. A abertura da V-02 fica em 50 %: nada a move ainda.

Resultados e Validação¶
| Variável | Esperado | Unidade |
|---|---|---|
| Nível em 1 min | 0,23 | m |
| Nível em 2 min | 0,30 | m |
| Nível final (a partir de 7 min) | 0,333 | m |
| Vazão de saída em 1 min | 8,4 | kg/s |
| Vazão de saída final | 10,0 | kg/s |
| Pressão do tanque | 101325 (tanque aberto) | Pa |
Resultados esperados
O nível se acomoda onde a coluna de líquido empurra exatamente a vazão de entrada pela V-02. Meio aberta, a V-02 tem Kv = 200 m³/h; 10 kg/s são 36 m³/h; a equação de Kv dá ΔP = (36/200)² = 0,032 bar, e 3,2 kPa de água são 0,33 m. O simulador chega a 0,333 m.
Entendendo os Resultados¶
O tanque é o único objeto com estado. O balanço de massa dele é dm/dt = w_entra − w_sai: a entrada é fixada em 10 kg/s pela especificação, e a saída é o que a V-02 passa sob a diferença de pressão entre o fundo do tanque (pressão atmosférica mais a coluna de líquido) e a Outlet a 1 atm. Com o tanque vazio a coluna é zero, nada sai, e o nível sobe o mais rápido possível. Conforme o nível sobe a coluna cresce, a vazão de saída cresce com a raiz quadrada da coluna, e o nível desacelera até as duas vazões se igualarem. A aproximação é exponencial: o nível fica a 1 % do valor final depois de uns quatro minutos e meio.
Três coisas decidiram esse número, e nenhuma delas foi a válvula de entrada. A entrada é uma fronteira de Vazão, então 10 kg/s entram qualquer que seja a V-01; o tanque é aberto, então a pressão dele é atmosférica; e a saída é uma fronteira de Pressão a 1 atm, então toda a força motriz na V-02 é a coluna. Mude a Outlet para 1,2 bar e nada sai até que a coluna sozinha cubra os 0,19 bar entre a atmosfera e a Outlet, cerca de 1,9 m de água; passar 10 kg/s pela V-02 exige então 2,24 m de nível, acima do topo de 2 m do tanque. Um tanque aberto de verdade transbordaria em 2 m. O tanque do DWSIM não tem transbordo: quando o nível passa a altura do tanque ele escreve um aviso no log ("T-01: the liquid level (2.01 m) is above the tank height (2.00 m). The tank has no overflow in this model: the excess stays inside and the level goes on rising.") e o nível se acomoda em 2,24 m. Mude a V-02 para 100 % de abertura e o nível se acomoda em 0,08 m.
O Dynamics Wizard
Dynamics > Dynamics Wizard percorre um flowsheet de regime permanente resolvido pela mesma lista que você acabou de fazer à mão: um volume para cada holdup, um Kv para cada válvula, uma especificação em cada corrente de fronteira, e um integrador com um schedule, cada item com um valor proposto que você confirma ou edita. É o caminho rápido pelos passos 5 a 8 num flowsheet maior. Fazê-los à mão uma vez, como aqui, é o que torna as propostas do wizard legíveis.
Automatizando Este Tutorial¶
Arquivos neste repositório
- Script Python:
examples/dynamics/01_water_tank_dynamic.py - Flowsheet pronto:
examples/saved/dynamic_tank_open_loop.dwxmz(oSch1dele parte do estado guardadoNewState1, salvo com o tanque vazio, e dá a mesma curva) - No DWSIM: lista Samples na tela inicial,
Dynamic Simulation - Water Tank Level Control(o mesmo tanque, já com um controlador de nível)
import os
import sys
import pythonnet
pythonnet.load("netfx") # DWSIM is a .NET Framework application
import clr # noqa: E402
DWSIM_BIN = os.environ.get("DWSIM_BIN")
if not DWSIM_BIN:
raise SystemExit("Set DWSIM_BIN to the DWSIM installation folder before running.")
for sub in ("", "unitops", "ppacks", "extenders"):
sys.path.append(os.path.join(DWSIM_BIN, sub))
clr.AddReference("DWSIM.Automation")
clr.AddReference("DWSIM.Automation.FluentAPI")
clr.AddReference("DWSIM.UnitOperations")
from DWSIM.Automation.FluentAPI import Flowsheet, PropertyPackages, Q
from DWSIM.UnitOperations.UnitOperations import Valve
from System import TimeSpan
fs = (Flowsheet.Create("WaterTankDynamic")
.WithCompound("Water")
.WithPropertyPackage(PropertyPackages.SteamTables))
inlet = (fs.AddMaterialStream("Inlet")
.At(Q.Kelvin(298.15), Q.Pascal(130000.0))
.WithMassFlow(Q.KgPerSecond(10.0))
.AsFlowSpec())
s1 = fs.AddMaterialStream("S-1").AsPressureSpec()
s2 = fs.AddMaterialStream("S-2").AsPressureSpec()
outlet = fs.AddMaterialStream("Outlet").AsPressureSpec()
(fs.AddValve("V-01")
.WithCalcMode(Valve.CalculationMode.Kv_Liquid)
.WithKv(100.0).WithOpeningPercent(50.0)
.ConnectFeed(inlet, 0).ConnectProduct(s1, 0))
tank = (fs.AddTank("T-01")
.WithVolume(Q.CubicMeters(2.0)).WithHeight(Q.Meters(2.0))
.ConnectFeed(s1, 0).ConnectProduct(s2, 0))
(fs.AddValve("V-02")
.WithCalcMode(Valve.CalculationMode.Kv_Liquid)
.WithKv(400.0).WithOpeningKvRelationship()
.WithOpeningPercent(50.0)
.ConnectFeed(s2, 0).ConnectProduct(outlet, 0))
fs.AutoLayout()
fs.Solve()
# the boundary pressure: set it after the steady state, which overwrote it
outlet.Object.Phases[0].Properties.pressure = 101325.0
(fs.Dynamics.DefineIntegrator("Int1")
.WithIntegrationStep(TimeSpan.FromSeconds(5))
.WithDuration(TimeSpan.FromMinutes(10))
.Monitor("T-01", "Liquid Level", "m", "level")
.Monitor("V-02", "PROP_VA_5", "", "V-02 opening")
.Monitor("Outlet", "PROP_MS_2", "kg/s", "outlet flow"))
fs.Dynamics.DefineSchedule("Sch1").WithIntegrator("Int1").UseCurrentStateAsInitial(True).MakeCurrent()
result = fs.RunDynamics("Sch1").Execute()
level = result.GetSeries("level")
print(f"level at 1 min = {level.ValueAt(60.0):.3f} m, final = {level.Final:.3f} m")
print(f"outlet flow final = {result.GetSeries('outlet flow').Final:.2f} kg/s")
fs.Save("dynamic_tank_open_loop.dwxmz")
Construa o flowsheet com dwsim.unitop.add e dwsim.unitop.connect, resolva com dwsim.solve.run, depois use as ferramentas de dinâmica (dwsim.dynamics.*) para definir o integrador e o schedule e rodá-lo.
A saída pode variar
Os resultados dependem da qualidade de raciocínio do LLM e da precisão no uso das ferramentas. Sempre verifique se a simulação corresponde à sua intenção antes de confiar nos números.
Use o DWSIM (via servidor MCP) para construir e rodar a seguinte simulação dinâmica:
- Crie um flowsheet chamado "WaterTankDynamic" com Água e o pacote Steam Tables
- Corrente "Inlet" a 298,15 K, 130000 Pa, 10 kg/s de água, especificação dinâmica
Flow; correntes vazias "S-1", "S-2" e "Outlet" (Outlet: especificação dinâmica
Pressure, 101325 Pa)
- Válvula "V-01" em modo Kv líquido, Kv 100, 50 % aberta, sem relação abertura/Kv,
de Inlet para S-1
- Tanque "T-01" com volume 2 m3 e altura 2 m, de S-1 para S-2
- Válvula "V-02" em modo Kv líquido, Kv 400 com relação abertura/Kv linear,
50 % aberta, de S-2 para Outlet
- Resolva o regime permanente
- Defina um integrador "Int1" (passo 5 s, duração 10 min) monitorando o nível do
tanque, a abertura da V-02 e a vazão mássica da Outlet, e um schedule "Sch1"
que o use a partir do estado atual
- Rode o schedule e informe o nível em 1, 2 e 10 minutos e a vazão de saída final
Exercícios
- Ponha a pressão da Outlet em 1,2 bar e rode de novo. Para onde vai o nível, e por quê? Leia o log quando o nível passar de 2 m: o que um tanque aberto de verdade faria nesse momento, e o que faz o tanque do DWSIM?
- Abra a V-02 por completo. Preveja o nível final pela equação de Kv antes de rodar, depois compare.
- Mude o passo de integração para 30 s. O nível final muda? A forma da curva muda?
Leitura Complementar¶
Referências selecionadas da bibliografia técnica do DWSIM.
- W. L. Luyben. (1990). Process Modeling, Simulation and Control for Chemical Engineers. McGraw-Hill
- D. E. Seborg, T. F. Edgar, D. A. Mellichamp & F. J. Doyle. (2016). Process Dynamics and Control. Wiley
Próximos Passos¶
Em Controle de Nível PID, você adiciona um controlador PID que move a V-02 para manter o nível num setpoint, e vê o que as ações proporcional e integral fazem cada uma.