Lämpöakussa lämpöä varastoidaan kiinteään aineeseen, jonka läpi pumpataan nestemäistä lämmönsiirtoainetta.
Simulointi yksinkertaistuu merkittävästi, jos oletamme lämpövaraston sylinteriksi, koska symmetrian ansiosta sylinterin kuvaamiseen riittää kaksi koordinaattia l ja r. Kolmiulotteinen ongelma pelkistyy kaksiulotteiseksi.
(Videot eivät ehkä aukea linkistä klikkaamalla, koska selaimet eivät aina ymmärrä paikallisia tiedostoja. Aukevat klikkaamalla tiedostoa hakemistotyökalullasi. Ellei onnistu, installoi VideoLAN VLC media player. )
Suureita ajan funktiona, sylinteri 20cm
Suureita ajan funktiona, sylinteri 30cm
Kummassakin ajossa on käytetty samaa maksimitehoa. Paksumpi sylinteri vastaanottaa lämpöä paremmin, joten öljy jäähtyy niin paljon, ettei lämmitin kykene lämmittämään öljyä maksimilämpöön. Lämpöä varastoituu sylinteriin jokseenkin sama määrä, mutta paksumpi sylinteri jää kylmemmäksi, minkä takia siitä ei saada yhtä pitkää aikaa maksimilämpöistä öljyä ulos.
Simuloinnin parametrit syötetään tiedostoon:
# Parameters for heat storage simulation
geometry:
L: 160.0 # Length of cylinder [m]
R_solid: 0.2 # Outer radius of cylinder [m]
R_pipe: 0.048 # 0.074 Radius of pipe [m]
Virtauksen nopeus vaikuttaa lämmönsiirtoon ja simuloinnin aika-askeleeseen. Ohjelmassa olevan tarkistuksen mukaan 0.5 m/s on vielä turbulenttinen nykyisellä putkikoolla.
0.5 m/s nopeuttaa testiajoja, mutta lämmönsiirto on on heikompaa kuin nopeammalla virtauksella. Vakavat tarkastelut pitää tehdä todellisella virtausnopeudella
Algoritmi olettaa virtausnopeuden vakioksi. Algoritmia pitää täydentää, mikäli nopeutta halutaan vaihdella simuloinnin aikana
fluid:
v: 0.5 # m/s
rho: 920.0 # Density kg/m^3
cp: 2200.0 # Specific heat J/(kg·K)
k: 0.12 # Thermal conductivityW/(m·K)
nu: 4.0e-6 # 5.0e-6 Kinematic viscosity m^2/s
# !!!kinematic viscosity typically decreases when temperature increases. Not implemented yet
solid:
rho: 2300.0 # Density kg/m^3
cp: 1000.0 # Specific heat J/(kg·K)
k: 1.0 # Thermal conductivityW/(m·K)
Diskretointi, laskentahilan tiheys. vaikuttavaa laskennan tarkkuuteen.
Nz_solid, pituussuuntainen diskretointi, vaikuttaa paljon laskenta-aikaan, koska se määrittää simuloinnissa käytettävän aika-askeleen: Yhdessä aika-askeleessa neste saa edetä vähemmän kuin yhden "siivun" mittaisen matkan. Muutoin muutokset nesteen lämpötilassa eivät ehtisi vaikuttaa kaikkiin sylinterin osiin
Putki jaetaan yhtä moneen "siivuun" kuin kiinteä sylinteri
Putkea, nestettä, ei jaeta säteen suunnassa osiin vaan luotetaan yleisesti käytettyihin approksimaatioihin
mesh:
Nr_solid: 60
Nz_solid: 100
# Nz_fluid: set automatically to Nz_solid
grad määrittää, kuinka paljon tiheämpi hila on lähellä putkea, jossa on suurimmat lämpötilaerot ja vähemmän lämpöä vastaanottavaa massaa.
bump määrittää, paljonko tiheämpi hila on sylinterin/putken päissä keskikohtaan verrattuna
grad: 2.6 # 1.2 - 3, smaller is milder
bump: 0.3 # 0.2 - 0.5, bigger is milder
Jäähdytettäessä nesteen lämpötila lasketaan alimmillaan T_cold:iin
T_hot on nesteen ylin sallittu lämpötila.
Simulointi aloitetaan lämpötilasta T_initial (sekä sylinteri että neste)
operating_conditions:
T_cold: 293.15 # Cold temperature [K]
T_hot: 698.15 # Hot temperature [K]
T_initial: 293.15 # Initial temperature [K]
Kun tehdään askelmainen muutos lämmitys- tai jäähdytystehossa, akkuun menevän nesteen lämpötila nousee pehmeästi ajassa tau_heater.
dT_min ja dT_max ovat maksimi lämpötilaero, minkä lämmitin/jäähdytin kykenee tuottamaan. Loppukäyttäjää ajatellen tähän pitää laittaa tehot ja laskea nämä tehoista
controller_parameters:
tau_heater: 600 # [s] rise time of input temperature,
dT_max: 60.0
dT_min: -30.0
Simulointiajon vaiheet. Näitä voi laittaa peräkkäin tarpeen mukaan. Kesto ilmoitetaan tunteina.
phases: [ # charge, discharge, steady
{"type": "charge", "duration": 8.0},
#{"type": "steady", "duration": 0.25},
{"type": "discharge", "duration": 16.0}
]
convective heat transfer coefficient, usually denoted h and expressed in units of W/(m²·K).
htc:
h: null # null -> compute via Gnielinski once; set a number to override
Kun CFL < 1, virtaus putkessa ei "ohita" yhtään laskentahilan "siivua".
numerics:
cfl_target: 0.8 # < 1.0
dt: null # null -> pick from CFL
Temppu, jolla voi pyöristää nesteen lämpötilan nopeita muutoksia, jotka muuten tekisivät numeerisesta ratkaisusta epätarkan.
Simuloinnissa jäähdytin/lämmitin on mallinnettu "hitaaksi", koska käytännössä on mahdoton saada aikaiseksi suuria askelmaisia lämpötilan muutoksia, joten tällainen epäfysikaalinen temppu on turha ja pitkässä putkessa aiheuttaisi virhettä.
alpha_f: 0.0 # 0.1 - 0.3 axial diffusion, artificial
Generoitavan videon haluttu pituus. Mitä pidempi, sitä tiuhemmassa aikapisteitä. Tähän voisi lisätä mahdollisuuden ilmoittaa, montako framea sekunnissa video näyttää. 96 frame/s tuplaa nopeuden verrattuna 48 frame/s. Standardi taitaa olla 30 frame/s.
animation:
#
video_duration: 1.0 # [minutes] videon kesto (48 kuvaa/s)
Ohjausalgoritmi suorittaa sarjan lataus-, purku- ja tyhjäkäynti-vaiheita. Kunkin vaiheen pituus määritetään tunteina.
Akkuun pumpattavan nesteen lämmityksen ja jäähdytyksen teholle asetetaan maksimiarvo (Tällä hetkellä parametreissä dT_max ja dT_min, kuten yllä selitettiin). Ohjausalgoritmi pitää tehon maksimi- tai minimiarvossa, ellei öljyn lämpötila ylitä/alita sallittua.
Jäähdytys ja lämmitys -elementti on mallinnettu 2-asteen prosessilla niin, että tehon asetusarvon askelmainen muutos näkyy elementin ulostulon lämpötilassa pehmeästi. Numeerinen ratkaisu helpottuu, kun ei tarvitse varautua lämpötilan hyppäyksiin, jollaisia ei kuitenkaan voi todellisuudessa tapahtua.
Problem: A 2‑D axisymmetric solid heat store (in cylindrical coordinates \(r,z\)) is coupled to a 1‑D plug‑flow fluid in a pipe running along the axis. Heat exchange at the pipe wall is modeled with a convective (Robin) boundary condition.
Coordinate convention: x = z (axial),
y = r (radial). No \(\theta\) dependence (axisymmetry).
All quantities are in SI units.
\[ \rho_s c_s\,\partial_t T_s = \nabla\!\cdot\!\big(k_s \nabla T_s\big), \quad (r,z)\in \Omega. \]
\[ \rho_s c_s\,\partial_t T_s = \nabla\!\cdot\!\big(k_s \nabla T_s\big), \quad (r,z)\in \Omega. \]
Axisymmetric Laplacian (no \(\theta\)):
\[ \nabla\!\cdot\!(k\nabla T) = \frac{1}{r}\,\partial_r\!\big(r\,k\,\partial_r T\big) + \partial_{zz}(k T). \]
PIPE wall \(r = R_{\text{pipe}}\) (convective exchange to the fluid): \[ -k_s\,\partial_n T_s = h\,(T_s - T_f^\ast), \] where \(T_f^\ast(t,z)\) is the fluid temperature interpolated along the PIPE boundary.
Outer wall \(r = R_{\text{solid}}\): typically insulated, \[ \partial_n T_s = 0 \]
Ends \(z = 0, L\): typically insulated,
\[ \partial_n T_s = 0 \]
(adapt if you model end losses).
\[ \partial_t T_f + v\,\partial_z T_f = \alpha_{\text{eff}}\,\partial_{zz} T_f + \beta\,(T_w - T_f), \quad z \in (0,L). \]
Solid internal energy (J): \[ E_{\text{solid}} = \int_{\Omega} \rho_s c_s \,\big(T_s - T_{\text{ref}}\big)\, (2\pi r)\, d\Omega. \]
Oil internal energy (J): \[ E_{\text{oil}} = \int_{0}^{L} \rho_f c_f \,\big(T_f - T_{\text{ref}}\big)\, A \, dz, \quad A = \pi R_{\text{pipe}}^2. \]
Wall power (solid side) (W): \[ Q_{\text{wall}} = \int_{\Gamma_{\text{pipe}}} h\,\big(T_s - T_f^\ast\big)\,(2\pi R_{\text{pipe}})\, d\Gamma. \]
Inlet power (W): \[ P_{\text{in}} = \rho_f c_f \, v\, A \, \big(T_{\text{in}} - T_{\text{ref}}\big). \]
grad in r and
bump in z, quads or tris)."PIPE"; its edge segments define the fluid
grid: the fluid nodes z are taken from the PIPE
segments (segment endpoints → nodes).CellField \(T_f^\ast(z)\)
on "PIPE" from the current T_f."PIPE": exact L²
projection onto a P0 boundary space (diagonal solve),
then sample at segment midpoints and map to nodes.On a non‑uniform grid, the step is limited by the tightest local
constraint: \[
\Delta t \le \min_i \Bigg(
\text{CFL}_{\text{adv}}\frac{\Delta z_i}{|v|},\;
\text{CFL}_{\text{diff}}\frac{\Delta
z_i^2}{\alpha_{\text{eff}}+\varepsilon},\;
\text{CFL}_{\text{xchg}}\frac{1}{\beta}
\Bigg).
\] Your implementation computes this once from z and
params (with conservative defaults).
z times cross‑section \(A\)."PIPE" with weight \(2\pi R\).All audits use the same measures as the solver to keep units and geometry consistent.
Toistaiseksi lasketaan energiataseen virhe. Mallissa ei ole lämpövuotoja, joten sisään syötetyn energian ja varastoituneen energian pitää olla samat.
Ajan funktioita ja animaatiota tarkastelemalla voi silmämääräisesti arvioida tulosten järkevyyttä
Tärkeä tieto on nopeus, jolla akku kykenee vastaanottamaan ja luovuttamaan lämpöä. Tähän ominaisuuteen ei ole yhtä yksinkertaista tarkistusta kuin energian säilymiseen.
Tekoälyn avulla pitää kehitellä keinoja varmistaa mallin riittävä tarkkuus
Mikäli johonkin koelaitokseen asennetaan lämpötila-antureita, ne antavat arvokasta tietoa mallin verifiointiin sen lisäksi, että auttavat arvioimaan akun varaustasoa.
Tähän ei kannata ryhtyä ennen kuin joku taho haluaa vakavissaan tätä työkalua käyttää.
Samalla periaatteella kuin 2D malli voidaan laatia 3D-malli lämpöakun lohkosta. Periaatteessa tekoäly osaisi melko suoraviivaisesti muokata nykyisestä 2D mallista 3D mallin. Yksi haastava vaihe olisi muodostaa lohkon laskentahila.
2D mallia laadittaessa tekoäly teki monen tasoisia virheitä, vääriä johtopäätöksiä ja huonoja valintoja, joiden selvittely ja korjaaminen vei aikaa. Samaa olisi odotettavissa 3D mallia laatiessa.
3D malli vaatisi laskentatehoa moninkertaisesti 2D malliin verrattuna. Läppärin teho ei riittäisi.
Lisähyöty olisi rajallinen.