PISM, A Parallel Ice Sheet Model  stable v2.1.1 committed by Constantine Khrulev on 2024-12-04 13:36:58 -0900

◆ update()

void pism::AgeModel::update ( double  t,
double  dt,
const AgeModelInputs inputs 
)

Let \(\tau(t,x,y,z)\) be the age of the ice. Denote the three-dimensional velocity field within the ice fluid as \((u,v,w)\). The age equation is \(d\tau/dt = 1\), that is, ice may move but it gets one year older in one year. Thus

\[ \frac{\partial \tau}{\partial t} + u \frac{\partial \tau}{\partial x} + v \frac{\partial \tau}{\partial y} + w \frac{\partial \tau}{\partial z} = 1 \]

This equation is purely advective and hyperbolic. The right-hand side is "1" as long as age \(\tau\) and time \(t\) are measured in the same units. Because the velocity field is incompressible, \(\nabla \cdot (u,v,w) = 0\), we can rewrite the equation as

\[ \frac{\partial \tau}{\partial t} + \nabla \left( (u,v,w) \tau \right) = 1 \]

There is a conservative first-order numerical method; see AgeColumnSystem::solveThisColumn().

The boundary condition is that when the ice falls as snow it has age zero. That is, \(\tau(t,x,y,h(t,x,y)) = 0\) in accumulation areas. There is no boundary condition elsewhere on the ice upper surface, as the characteristics go outward in the ablation zone. If the velocity in the bottom cell of ice is upward ( \(w>0\)) then we also apply a zero age boundary condition, \(\tau(t,x,y,0) = 0\). This is the case where ice freezes on at the base, either grounded basal ice freezing on stored water in till, or marine basal ice. (Note that the water that is frozen-on as ice might be quite "old" in the sense that its most recent time in the atmosphere was long ago; this comment is relevant to any analysis which relates isotope ratios to modeled age.)

The numerical method is a conservative form of first-order upwinding, but the vertical advection term is computed implicitly. Thus there is no CFL-type stability condition from the vertical velocity; CFL is only for the horizontal velocity. We use a finely-spaced, equally-spaced vertical grid in the calculation. Note that the columnSystemCtx methods coarse_to_fine() and fine_to_coarse() interpolate back and forth between this fine grid and the storage grid. The storage grid may or may not be equally-spaced. See AgeColumnSystem::solve() for the actual method.

Definition at line 108 of file AgeModel.cc.

References pism::ParallelSection::check(), pism::AgeModelInputs::check(), pism::fem::column(), pism::array::Array3D::copy_from(), pism::ParallelSection::failed(), pism::columnSystemCtx::fine_to_coarse(), pism::array::Array3D::get_column(), pism::AgeModelInputs::ice_thickness, pism::AgeColumnSystem::init(), pism::k, pism::columnSystemCtx::ks(), pism::Component::m_grid, m_ice_age, m_work, pism::array::Array3D::set_column(), pism::AgeColumnSystem::solve(), pism::AgeModelInputs::u3, pism::AgeModelInputs::v3, pism::AgeModelInputs::w3, and pism::columnSystemCtx::z().