21#include "pism/energy/CHSystem.hh"
22#include "pism/energy/enthSystem.hh"
23#include "pism/energy/utilities.hh"
24#include "pism/util/Context.hh"
25#include "pism/util/EnthalpyConverter.hh"
26#include "pism/util/array/CellType.hh"
27#include "pism/util/io/File.hh"
28#include "pism/util/Logger.hh"
59 std::shared_ptr<const stressbalance::StressBalance> stress_balance)
69 m_log->message(2,
"* Restarting the cryo-hydrologic system from %s...\n",
70 input_file.
name().c_str());
83 m_log->message(2,
"* Bootstrapping the cryo-hydrologic warming model from %s...\n",
84 input_file.
name().c_str());
102 m_log->message(2,
"* Bootstrapping the cryo-hydrologic warming model...\n");
121 auto EC =
m_grid->ctx()->enthalpy_converter();
132 const auto &cell_type = *inputs.
cell_type;
146 const size_t Mz_fine = system.
z().size();
147 const double dz = system.
dz();
148 std::vector<double> Enthnew(Mz_fine);
150 array::AccessScope list{&ice_surface_temp, &shelf_base_temp, &surface_liquid_fraction,
151 &ice_thickness, &basal_frictional_heating, &basal_heat_flux,
156 margin_threshold =
m_config->get_number(
"energy.margin_ice_thickness_limit"),
157 T_pm =
m_config->get_number(
"constants.fresh_water.melting_point_temperature"),
158 residual_water_fraction =
m_config->get_number(
"energy.ch_warming.residual_water_fraction");
161 const unsigned int Mz = z.size();
165 for (
auto pt :
m_grid->points()) {
166 const int i = pt.i(), j = pt.j();
168 const double H = ice_thickness(i, j);
170 if (ice_surface_temp(i, j) >= T_pm) {
175 for (
unsigned int k = 0;
k < Mz; ++
k) {
177 depth = std::max(H - z[
k], 0.0),
178 P = EC->pressure(depth);
179 column[
k] = EC->enthalpy(EC->melting_temperature(P),
180 residual_water_fraction,
188 depth_ks = H - system.
ks() * dz,
189 p_ks = EC->pressure(depth_ks);
191 const double Enth_ks = EC->enthalpy_permissive(ice_surface_temp(i, j),
192 surface_liquid_fraction(i, j), p_ks);
195 marginal(ice_thickness, i, j, margin_threshold),
198 const bool ice_free_column = (system.
ks() == 0);
201 if (ice_free_column) {
206 if (system.
lambda() < 1.0) {
214 if (cell_type.ocean(i, j)) {
217 double Enth0 = EC->enthalpy_permissive(shelf_base_temp(i, j), 0.0, EC->pressure(H));
225 system.
solve(Enthnew);
259 auto grid = result.
grid();
261 const auto &z = ice_enthalpy.
levels();
264 auto EC = grid->ctx()->enthalpy_converter();
268 double C =
k / (R * R);
272 for (
auto p : grid->points()) {
273 const int i = p.i(), j = p.j();
280 for (
unsigned int m = 0; m < Mz; ++m) {
282 depth = ice_thickness(i, j) - z[m];
285 double P = EC->pressure(depth);
286 Q[m] = std::max(C * (EC->temperature(E_ch[m], P) - EC->temperature(E_ice[m], P)),
std::shared_ptr< const Config > m_config
configuration database used by this component
const std::shared_ptr< const Grid > m_grid
grid used by this component
std::shared_ptr< const Logger > m_log
logger (for easy access)
static Ptr wrap(const T &input)
High-level PISM I/O class.
void failed()
Indicates a failure of a parallel section.
Makes sure that we call begin_access() and end_access() for all accessed array::Arrays.
void set_column(int i, int j, double c)
Set all values of scalar quantity to given a single value in a particular column.
double * get_column(int i, int j)
A virtual class collecting methods common to ice and bedrock 3D fields.
void set_name(const std::string &name)
Sets the variable name to name.
void write(const OutputFile &file) const
const std::vector< double > & levels() const
int state_counter() const
Get the object state counter.
std::shared_ptr< const Grid > grid() const
VariableMetadata & metadata(unsigned int N=0)
Returns a reference to the VariableMetadata object containing metadata for the compoment N.
const std::vector< double > & z() const
void fine_to_coarse(const std::vector< double > &input, int i, int j, array::Array3D &output) const
CHSystem(std::shared_ptr< const Grid > grid, std::shared_ptr< const stressbalance::StressBalance > stress_balance)
DiagnosticList spatial_diagnostics_impl() const
std::set< VariableMetadata > state_impl() const
void restart_impl(const File &input_file, int record)
void update_impl(double t, double dt, const Inputs &inputs)
Update the enthalpy of the cryo-hydrologic system.
void initialize_impl(const array::Scalar &basal_melt_rate, const array::Scalar &ice_thickness, const array::Scalar &surface_temperature, const array::Scalar &climatic_mass_balance, const array::Scalar &basal_heat_flux)
void bootstrap_impl(const File &input_file, const array::Scalar &ice_thickness, const array::Scalar &surface_temperature, const array::Scalar &climatic_mass_balance, const array::Scalar &basal_heat_flux)
void write_state_impl(const OutputFile &output) const
The default (empty implementation).
unsigned int reduced_accuracy_counter
void init_enthalpy(const File &input_file, bool regrid, int record)
Initialize enthalpy by reading it from a file, or by reading temperature and liquid water fraction,...
const array::Scalar & basal_melt_rate() const
Basal melt rate in grounded areas. (It is set to zero elsewhere.)
array::Array3D m_ice_enthalpy
void regrid_enthalpy()
Regrid enthalpy from the -regrid_file.
void init(int i, int j, bool ismarginal, double ice_thickness)
void set_basal_heat_flux(double heat_flux)
Set coefficients in discrete equation for Neumann condition at base of ice.
void solve(std::vector< double > &result)
Solve the tridiagonal system, in a single column, which determines the new values of the ice enthalpy...
void set_basal_dirichlet_bc(double E_basal)
Set coefficients in discrete equation for at base of ice.
void set_surface_dirichlet_bc(double E_surface)
Tridiagonal linear system for conservation of energy in vertical column of ice enthalpy.
std::set< VariableMetadata > metadata(std::initializer_list< const Array * > vecs)
void cryo_hydrologic_warming_flux(double k, double R, const array::Scalar &ice_thickness, const array::Array3D &ice_enthalpy, const array::Array3D &ch_enthalpy, array::Array3D &result)
bool marginal(const array::Scalar1 &thickness, int i, int j, double threshold)
void bootstrap_ice_enthalpy(const array::Scalar &ice_thickness, const array::Scalar &ice_surface_temp, const array::Scalar &surface_mass_balance, const array::Scalar &basal_heat_flux, array::Array3D &result)
std::map< std::string, Diagnostic::Ptr > DiagnosticList