Open TomasKulhanek opened 3 years ago
reproducible in web simulator https://bodylight.physiome.cz/Bodylight-Scenarios/bloodgases/#komplexnisimulator.md
Seems to me as a Dymola bug. I have introduced a workaround, that exports said variables as tunable:
<ScalarVariable
name="Hct"
valueReference="16777238"
description="Hematocrit"
causality="parameter"
variability="tunable">
<Real
declaredType="Physiolibrary.Types.Fraction"
start="0.44"/>
</ScalarVariable>
Check if these tunable vars work in the simulator.
https://bodylight.physiome.cz/Bodylight-Scenarios/bloodgases/#komplexnisimulator.md Blood_Hb nad Hct change have no consequences, while e.g. O2 change is visible. Double checked that Hb and Hct is changing in model.
That is a model problem - run the model in any tool alone, both Hct and Hb have minimal steady state effect on pO2, yet there is one. Also, extreme changes are visible in the sat graph (when lettting it stabilized first for long enough). Probably debug @kofranek and @MarekMatejak ?
You need other type of model for these application. The model Physiolibrary_Fluid_Examples_BloodGasesTransport_BloodyMary is designed for continual physical simualation of physiological system. The conservation of mass and energy during the simulation is typical for this kind of simulation. The unphysical loss or creation of energy/mass is not allowed in this world. So do it physical way: E.g. instead of direct assigment of amount of hemoglobin (in oxygenated or deoxygenated form?) you should make a flow of that (e.g. during transfusion or during hemorrhage). Or may be your application need to show steady state points only.
Btw. parameters Blood_Hb and Hct are used only for initialization of blood status - see: https://github.com/MarekMatejak/Physiolibrary/blob/master/Physiolibrary/package.mo#L5903
The real continual status is not a parameter, but state variables (as mass fractions) inside all elastic blood vessels.
Mimochodem Blood_Hb je molarni mnozstvi hemov na objem krve, ne koncentrace hemoglobinu v krvinkach. Jedna molekula hemoglobinu ma 4 hemy. Koncentraci vsech molekul hemoglobinu v krvinkach s toho vypoctete jako Blood_Hb/(4*Hct) [mmol/L].
OK. Takze u koncentrace Hb pridat pumpu se senzorem, jejiz parametr bude desiredHBConc - ona bude pumpovat nejakou vysoce/nizce koncentrovanou krev do te doby az se desiredHbConc vyrovna s HbConc ze senzoru a zaroven odcerpavat krev aby se tam nehromadil objem - asi s nejakym ridicim clenem na bazi PID controlleru. Totez analogicky u dalsich velicin.
I understand that is unphysical, but transforming the simulation to steady state would require major changes in model and in simulator. The simplest way to achieve required result would be as Tomáš suggests. However, are you sure the model reacts well for the initial Hct? The venous pO2 difference for Hct 10 and 90 seems to low to me. @kofranek @MarekMatejak can you confirm this is correct?
@MarekMatejak I understood, that the Hct is coupled with Blood_Hb and that the blood Hb is the actual determining factor.
Blood pump in-out is impractical, we would need to set other blood parameters inflow concentrations (o2, co2, hco3...), which all depend on the current model state.
However, a simple Hb pump (similar to o2 / co2 pump in tissues) crashes the model after while, while the Hb still well in bounds of otherwise normal operating conditions (try flow + or - 1 mmol/min). Do the correct substance data play a major role here? I noticed it changes the temperature a bit too. Why the Hb outflow is crashing the model?
Chemical.Sources.SubstanceInflowT substanceInflowT(
SubstanceFlow=1.6666666666667e-05,
redeclare package stateOfMatter = Chemical.Interfaces.Incompressible,
substanceData(
MolarWeight(displayUnit="kg/mol") = 65.494/4))
annotation (Placement(transformation(extent={{-152,-192},{-132,-172}})));
Knowledge of these workarounds are crucial for us to adopt the PL3.0.
I understand that is unphysical, but transforming the simulation to steady state would require major changes in model and in simulator. The simplest way to achieve required result would be as Tomáš suggests. However, are you sure the model reacts well for the initial Hct? The venous pO2 difference for Hct 10 and 90 seems to low to me. @kofranek @MarekMatejak can you confirm this is correct?
Takato zmena hematorkritu v tomto modelu nemeni koncentraci hemu v krvi, ktora je v Blood_Hb.
OK. Takze u koncentrace Hb pridat pumpu se senzorem, jejiz parametr bude desiredHBConc - ona bude pumpovat nejakou vysoce/nizce koncentrovanou krev do te doby az se desiredHbConc vyrovna s HbConc ze senzoru a zaroven odcerpavat krev aby se tam nehromadil objem - asi s nejakym ridicim clenem na bazi PID controlleru. Totez analogicky u dalsich velicin.
Neznie to moc fyzikalne, ale numericky by to fungovat malo.
@MarekMatejak I understood, that the Hct is coupled with Blood_Hb and that the blood Hb is the actual determining factor.
Blood pump in-out is impractical, we would need to set other blood parameters inflow concentrations (o2, co2, hco3...), which all depend on the current model state.
However, a simple Hb pump (similar to o2 / co2 pump in tissues) crashes the model after while, while the Hb still well in bounds of otherwise normal operating conditions (try flow + or - 1 mmol/min). Do the correct substance data play a major role here? I noticed it changes the temperature a bit too. Why the Hb outflow is crashing the model?
Chemical.Sources.SubstanceInflowT substanceInflowT( SubstanceFlow=1.6666666666667e-05, redeclare package stateOfMatter = Chemical.Interfaces.Incompressible, substanceData( MolarWeight(displayUnit="kg/mol") = 65.494/4)) annotation (Placement(transformation(extent={{-152,-192},{-132,-172}})));
Knowledge of these workarounds are crucial for us to adopt the PL3.0.
V realnom svete neni mozne do krvi pridavat (resp. z krvi odoberat) samostatne chemicke substancie, ktorych naboj je radovo v mmol/L. Fyziologicky je lepsie uvazovat komplexne a vsetky toky chemickych substancii musia byt v tychto radoch elektorneutralne.
Podle mne máte na noze balvan staré aplikace. Zkuste si ten pohled zrestartovat. Áno, priznejte si, že původní aplikace byla navrhnuta z pedagogického i simulačního pohledu špatně - proto jí nik nerozuměl. Reálně chcete medikom ukazovat jako funguje pacient? Pokud je odpověď ano, tak tu aplikaci postavte jinak. Vytvořte pár typů pacientů. Typ pacienta si medik zvolí v listboxe a nastaví mu to hromady parametrů v pozadí. Tyto typy nastaví iniciální parametre (jako Hct, Hb Beox, ...). S týmto inicálním stavem pak již počas spustené simulace nelze hýbat. Počas spustené simulace lze však nastavovat to, co se reálne s pacientem děje. Bude to intuitivní. Zrozumitelné. Bez nutnosti vysvětlování teorie, že existuje neoscilačný steady state v jednom bode. Atď.
Mne ani nevadí non-tunable parameters, ale chtěl jsem vědět různé možnosti řešení. Díky za všechny poznámky, postřehy a workaround od Filipa. Do 18. listopadu bychom rádi měli nějakou náhradu za Bloody Mary, která s Flashem už nejde ve Windows spustit. A nejlépe v PL3.0. Vzhledem k omezeným zdrojům není asi v současných silách vyrábět něco úplně nového, úplně od začátku. Možná by to mohla být výzva pro někoho, kdo by si chtěl dodělat třeba habilitaci :-)?
Ano, taková aplikace by asi byla lepší. Je reálné ji trochu překopat? Jak by se pak ale řešila třeba infuze Hb nebo alb? Nechceme přidávat celou krev, ale pouze Alb (elektroneutralne s H/HCO3), nebo samotné krvinky (Hct s Hb). Na vysvětlování je občas lepší mít možnost udělat i nefyzikální mezikroky, než skočíš na přidávání celé krve, při pokojové teplotě etc..
Hemolýza by se také jednodušejí simulovala elektroneutrálním clearance Hb než pouštěním žilou. Tím chci říci, že se musíme naučit pracovat i s přidáváním / odebíráním jednotlivých látek a znát k tomu předpoklady (udržení entalpie, elektroneutrality...). Zrovna u Hb se mi v PL nedaří najít žádnou souvislost s nábojem, je tam ale komplikace s Hct.
Jak na to? Jak udělat PL3.0 opravdu užitečnou?
Ano, taková aplikace by asi byla lepší. Je reálné ji trochu překopat?
Rozdelenie parametrov na non-tunable a tunable dava zmysel. Po zmene non-tunable pak je potreba simulaci spustit rucne, zatim co pri zmene tunable si moze simulace bezat. Predpokladam, ze toto neni moc prace, ci?
Jak by se pak ale řešila třeba infuze Hb nebo alb? Nechceme přidávat celou krev, ale pouze Alb (elektroneutralne s H/HCO3), nebo samotné krvinky (Hct s Hb).
Je potreba se divat na zlozeni roztoku dane infuze. Napr. https://www.fda.gov/media/70406/download, kde je ta elektroneutralita spusobena doplnenym sodikem a draslikem. Jinak by bez nich ten albumin ani nemohl dlouho samotny existovat - svou kyselosti by se sam degradoval.
Na vysvětlování je občas lepší mít možnost udělat i nefyzikální mezikroky, než skočíš na přidávání celé krve, při pokojové teplotě etc..
Většinou s tímto tvrzením nesouhlasím. V tomto případě obzvlášť. Sledování jednotlivých substancí samostatně je v tomto případě kotraproduktivní, protože systém takovýmto zjednodušením získava množství skrytých předpokladů, které sice pedagog v své praxi považuje za samozřejmé avšak neposkveněný student je nezná. Viď napr. zložení infuze albumínu.
Hemolýza by se také jednodušejí simulovala elektroneutrálním clearance Hb než pouštěním žilou. Tím chci říci, že se musíme naučit pracovat i s přidáváním / odebíráním jednotlivých látek a znát k tomu předpoklady (udržení entalpie, elektroneutrality...). Zrovna u Hb se mi v PL nedaří najít žádnou souvislost s nábojem, je tam ale komplikace s Hct.
Model neobsahuje hemolýzu. Pokud ji chcete zahrnout je potřeba udělat víc než jenom miznúci hemoglobín. Rozpadem hemoglobínu totiž vznikají jiné látky, které celkový náboj roztoku nemění. Nění ale jeho enthalpii i entropii.
Jak na to? Jak udělat PL3.0 opravdu užitečnou?
Bohužel PL3.0 není a nebude určena pro nefyzikální simulace. Pokud ji chcete použít tak to doporučuji dělat fyzikálně korektně - bude to pak jednoduchší na pochopení.
Convert these non-tunable parameters to some tunable in Physiolibrary_Fluid_Examples_BloodGasesTransport_BloodyMary.
Changing non-tunable parameters during simulation requires stopping simulation/reinitialization and resimulation.
Non-default values may cause unstable simulation and zero or infinitive values being returned.