Thermal Solution
Physical basis
Thermal state
The heat transport equation is derived from the balance equation of internal energy combined with Fourier’s law of heat transfer and reads:
where radiative sources have been neglected, and:
is the velocity vector
is the strain rate tensor
is the internal energy density
is the specific heat conductivity, which can depend on the heat density
is the Cauchy stress tensor.
For constant heat conductivity and heat capacity , the previous equation becomes:
Boundary conditions
Dirichlet boundary conditions should be applied at the ice surface:
and Neumann boundary conditions at the ice base:
where:
is the elevation of the ice upper surface
is the elevation of the floating ice lower surface When using the enthalpy formulation, the basal boundary condition scheme from [Aschwanden2012], figure 5 is used instead of the previous equation.
NOTE: For regional model, make sure to set a Dirichlet condition on the inflow boundary (throughout the ice column) to avoid advection of noise.
Numerical implementation
The heat equation is solved using linear finite elements in space, and implicit finite difference in time (time stepping should satisfy the CFL condition). To stabilize the equation, we either add an isotropic artificial diffusion to the left hand side:
where is the artificial diffusivity. We take:
or rely on the Streamline upwind/Petrov-Galerkin formulation (SUPG) from [Franca2006].
Model parameters
The parameters relevant to the heat equation solution can be displayed by running:
>> md.thermal
md.thermal.spctemperature
: temperature constraints (NaN
means no constraint)md.thermal.stabilization
: type of stabilization (0: no stabilization; 1: artificial diffusion; 2: Streamline-Upwind Petrov-Galerkin)md.thermal.maxiter
: maximum number of iterations for thermal solvermd.thermal.penalty_lock
: stabilize unstable thermal constraints that keep zigzagging after n iteration (default is 0, no stabilization)md.thermal.penalty_threshold
: threshold to declare convergence of thermal solution (default is 0)md.thermal.penalty_factor
: offset used by penalties(default is 3):
md.thermal.isenthalpy
: are we using the enthalpy formulation (Aschwanden et al., 2012)? (0: no, 1: yes)md.thermal.isdynamicbasalspc
: are we allowing changing basal boundary conditions for transient runs?md.thermal.requested_outputs
: specify further requested outputs here.
The solution will also use the following model fields:
md.initialization.temperature
: temperature field (in K)md.initialization.waterfraction
: water fraction in ice (betweenand
)
md.basalforcings.geothermalflux
: geothermal heat flux (in)
md.basalforcings.meltingrate
: basal melting rate (in m/yr w.e.)md.timestepping.time_step
: length of time steps (in yrs)
Running a simulation
To run a simulation solving only the thermal state, use the following command:
>> md = solve(md, 'Thermal');
This will compute one time step only of the thermal equation; use the transient solution for multiple time steps.
To run a thermal steady-state simulation (i.e. ), you need to first set the time stepping as 0:
>> md.timestepping.time_step = 0
>> md = solve(md, 'Thermal');