PISM, A Parallel Ice Sheet Model
stable v2.1-1-g6902d5502 committed by Ed Bueler on 2023-12-20 08:38:27 -0800
|
Given the temperature of the top of the bedrock, for the duration of one time-step, provides upward geothermal flux at that interface at the end of the time-step. More...
#include <BedThermalUnit.hh>
Public Types | |
typedef std::shared_ptr< BedThermalUnit > | Ptr |
typedef std::shared_ptr< const BedThermalUnit > | ConstPtr |
Public Member Functions | |
BedThermalUnit (std::shared_ptr< const Grid > g) | |
virtual | ~BedThermalUnit ()=default |
void | init (const InputOptions &opts) |
const array::Scalar & | flux_through_top_surface () const |
Return the upward heat flux through the top surface of the bedrock thermal layer. More... | |
const array::Scalar & | flux_through_bottom_surface () const |
Return the upward heat flux through the bottom surface of the bedrock thermal layer. More... | |
void | update (const array::Scalar &bedrock_top_temperature, double t, double dt) |
double | vertical_spacing () const |
double | depth () const |
unsigned int | Mz () const |
Public Member Functions inherited from pism::Component | |
Component (std::shared_ptr< const Grid > grid) | |
virtual | ~Component ()=default |
DiagnosticList | diagnostics () const |
TSDiagnosticList | ts_diagnostics () const |
std::shared_ptr< const Grid > | grid () const |
const Time & | time () const |
const Profiling & | profiling () const |
void | define_model_state (const File &output) const |
Define model state variables in an output file. More... | |
void | write_model_state (const File &output) const |
Write model state variables to an output file. More... | |
MaxTimestep | max_timestep (double t) const |
Reports the maximum time-step the model can take at time t. More... | |
Static Public Member Functions | |
static std::shared_ptr< BedThermalUnit > | FromOptions (std::shared_ptr< const Grid > g, std::shared_ptr< const Context > ctx) |
Protected Member Functions | |
virtual void | initialize_bottom_surface_flux () |
virtual void | init_impl (const InputOptions &opts) |
Initialize the bedrock thermal unit. More... | |
virtual void | update_impl (const array::Scalar &bedrock_top_temperature, double t, double dt)=0 |
virtual double | vertical_spacing_impl () const =0 |
virtual double | depth_impl () const =0 |
virtual unsigned int | Mz_impl () const =0 |
virtual void | define_model_state_impl (const File &output) const |
The default (empty implementation). More... | |
virtual void | write_model_state_impl (const File &output) const |
The default (empty implementation). More... | |
virtual DiagnosticList | diagnostics_impl () const |
Protected Member Functions inherited from pism::Component | |
virtual MaxTimestep | max_timestep_impl (double t) const |
virtual TSDiagnosticList | ts_diagnostics_impl () const |
void | regrid (const std::string &module_name, array::Array &variable, RegriddingFlag flag=NO_REGRID_WITHOUT_REGRID_VARS) |
Protected Attributes | |
array::Scalar | m_bottom_surface_flux |
upward heat flux through the bottom surface of the bed thermal layer More... | |
array::Scalar | m_top_surface_flux |
upward heat flux through the top surface of the bed thermal layer More... | |
Protected Attributes inherited from pism::Component | |
const std::shared_ptr< const Grid > | m_grid |
grid used by this component More... | |
const Config::ConstPtr | m_config |
configuration database used by this component More... | |
const units::System::Ptr | m_sys |
unit system used by this component More... | |
const Logger::ConstPtr | m_log |
logger (for easy access) More... | |
Additional Inherited Members | |
Protected Types inherited from pism::Component | |
enum | RegriddingFlag { REGRID_WITHOUT_REGRID_VARS , NO_REGRID_WITHOUT_REGRID_VARS } |
This flag determines whether a variable is read from the -regrid_file file even if it is not listed among variables in -regrid_vars . More... | |
Given the temperature of the top of the bedrock, for the duration of one time-step, provides upward geothermal flux at that interface at the end of the time-step.
The geothermal flux actually applied to the base of an ice sheet is dependent, over time, on the temperature of the basal ice itself. The purpose of a bedrock thermal layer in an ice sheet model is to implement this dependency by using a physical model for the temperature within that layer, the upper lithosphere. Because the upper part of the lithosphere stores or releases energy into the ice, the typical lithosphere geothermal flux rate is not the same thing as the geothermal flux applied to the base of the ice. This issue has long been recognized by ice sheet modelers [e.g. RitzFabreLetreguilly].
For instance, suppose the ice sheet is in a balanced state in which the geothermal flux deep in the crust is equal to the heat flux into the ice base. If the near-surface ice cools from this state then, because the ice temperature gradient is now greater in magnitude, between the warm bedrock and the cooler ice, the ice will for some period receive more than the deep geothermal flux rate. Similarly, if the ice warms from the balanced state then the temperature difference with the bedrock has become smaller and the magnitude of the ice basal heat flux will be less than the deep geothermal rate.
We regard the lithosphere geothermal flux rate, which is applied in this model to the base of the bedrock thermal layer, as a time-independent quantity. This concept is the same as in all published ice sheet models, to our knowledge.
Because the relevant layer of bedrock below an ice sheet is typically shallow, modeling the bedrock temperature is quite simple. Let \(T_b(t,x,y,z)\) be the temperature of the bedrock layer, for elevations \(-L_b \le z \le 0\). In this routine, \(z=0\) refers to the top of the bedrock, the ice/bedrock interface. (Note \(z=0\) is the base of the ice in IceModel, and thus a different location if ice is floating.) Let \(G\) be the lithosphere geothermal flux rate, namely the PISM input variable bheatflx
; see Related Page std_names . Let \(k_b\) = bedrock_thermal_conductivity
in pism_config.cdl) be the constant thermal conductivity of the upper lithosphere. In these terms the actual upward heat flux into the ice/bedrock interface is the quantity,
\[G_0 = -k_b \frac{\partial T_b}{\partial z}.\]
This is the output of the method top_heat_flux() in this class.
The evolution equation solved in this class, for which a timestep is done by the update() method, is the standard 1D heat equation
\[\rho_b c_b \frac{\partial T_b}{\partial t} = k_b \frac{\partial^2 T_b}{\partial z^2}\]
where \(\rho_b\) = bedrock_thermal_density
and \(c_b\) = bedrock_thermal_specific_heat_capacity
in pism_config.cdl.
If n_levels
>= 3 then everything is the general case. The lithospheric temperature in temp
is saved in files as litho_temp
. The top_heat_flux() method uses second-order differencing to compute the values of \(G_0\).
If n_levels
<= 1 then this object becomes very simplified: there is no internal state in array::Array3D temp. The update() and allocate() methods are null, and the top_heat_flux() method does nothing other than to copy the field \(G\) = bheatflx
into result
.
If n_levels
== 2 then everything is the general case except that top_heat_flux() method uses first-order differencing to compute the values of \(G_0\).
Definition at line 101 of file BedThermalUnit.hh.