Lämpöakun simulointi

Lämpöakun rakenne

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.

radial
longitudal
Sylinterin pitkittäisleikkaus

 

Muutama esimerkki simuloinnin tuloksista

(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

erotus 20cm - 30cm

Huitaistu alustava tarkastelu:

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.

Simulointi

Parametrit

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

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.

Simuloinnin mahdollisuuksia

Tulosten tarkastelun apuvälineitä

Physics (Governing Equations)

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).

Geometry and material parameters

All quantities are in SI units.

Solid (axisymmetric heat equation)

\[ \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). \]

Boundary conditions

\[ \partial_n T_s = 0 \]

(adapt if you model end losses).

Fluid (1‑D energy along the pipe)

\[ \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). \]

Fluid boundary conditions

Energies and powers (full 3‑D via axisymmetry)

Numerics (Discretization & Algorithm)

Mesh and coordinates

Solid discretization (Gridap FEM)

Fluid discretization (1‑D FV on non‑uniform z)

Coupling (staggered explicit per time step)

  1. Inlet: set \(T_f(0,t)\) from the controller (based on \(T_{\text{out}}\) and/or time).
  2. Interpolate fluid to PIPE: build a boundary CellField \(T_f^\ast(z)\) on "PIPE" from the current T_f.
  3. Solid step: solve the implicit Euler system with the cached factorization → get \(T_s^{n+1}\).
  4. Wall temperature for fluid: compute \(T_w(z)\) as segment‑averages on "PIPE": exact L² projection onto a P0 boundary space (diagonal solve), then sample at segment midpoints and map to nodes.
  5. Fluid step: explicit FV update to \(T_f^{n+1}\) with upwind advection, optional \(\alpha_{\text{eff}}\), and exchange \(\beta(T_w-T_f)\).
  6. Audits: \(E_{\text{solid}}, E_{\text{oil}}, Q_{\text{wall}}, P_{\text{in}}\), cumulative balances.
  7. Output: VTK for solid (unstructured) and fluid (rectilinear r–z grid).

Stable time step

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).

Energy accounting (axisymmetric 3‑D)

All audits use the same measures as the solver to keep units and geometry consistent.

Tehtävää

Menetelmän dokumentointi

Validiointi ja verifiointi

Paketointi yleiskäyttöiseksi

Tähän ei kannata ryhtyä ennen kuin joku taho haluaa vakavissaan tätä työkalua käyttää.

3D simulointi

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.