22 #include "pism/geometry/Geometry.hh"
23 #include "pism/util/Diagnostic.hh"
24 #include "pism/util/pism_utilities.hh"
30 std::shared_ptr<SurfaceModel> input)
33 m_min_ice_thickness(grid,
"minimum_ice_thickness",
WITHOUT_GHOSTS) {
47 "* Initializing a SMB adjustment preventing grounding line retreat...\n");
53 double rho_i =
m_config->get_number(
"constants.ice.density");
54 double rho_w =
m_config->get_number(
"constants.sea_water.density");
55 double eps =
m_config->get_number(
"geometry.ice_free_thickness_standard");
61 const int i = p.i(), j = p.j();
64 if (sea_level(i, j) > bed(i, j)) {
66 H_min = (sea_level(i, j) - bed(i, j)) * (rho_w / rho_i) + eps;
70 if (ice_thickness(i, j) < H_min) {
87 double rho_i =
m_config->get_number(
"constants.ice.density");
96 const int i = p.i(), j = p.j();
99 double SMB_new = SMB_old;
103 double H = ice_thickness(i, j);
104 double dH =
mass_flux(i, j) * (dt / rho_i);
105 double H_new = H + dH;
107 if (H_min > 0.0 and H_new < H_min) {
108 SMB_new = (H_min - H) * (rho_i / dt);
111 (*m_mass_flux)(i, j) = SMB_new;
140 namespace diagnostics {
147 "no_gl_retreat_smb_adjustment",
151 m_vars = {{
m_sys,
"no_gl_retreat_smb_adjustment"}};
154 set_attrs(
"SMB adjustment needed to maintain grounded ice extent",
159 m_vars[0][
"cell_methods"] =
"time: mean";
166 return model->smb_adjustment();
173 return combine({{
"no_gl_retreat_smb_adjustment",
Makes sure that we call begin_access() and end_access() for all accessed IceModelVecs.
IceGrid::ConstPtr grid() const
const Config::ConstPtr m_config
configuration database used by this component
const Logger::ConstPtr m_log
logger (for easy access)
const IceGrid::ConstPtr m_grid
grid used by this component
IceModelVec2S m_accumulator
double m_fill_value
fill value (used often enough to justify storing it)
const units::System::Ptr m_sys
the unit system
double to_internal(double x) const
std::vector< SpatialVariableMetadata > m_vars
metadata corresponding to NetCDF variables
std::shared_ptr< Diagnostic > Ptr
void set_attrs(const std::string &long_name, const std::string &standard_name, const std::string &units, const std::string &glaciological_units, unsigned int N=0)
A method for setting common variable attributes.
IceModelVec2S bed_elevation
IceModelVec2S sea_level_elevation
IceModelVec2S ice_thickness
std::shared_ptr< const IceGrid > ConstPtr
SpatialVariableMetadata & metadata(unsigned int N=0)
Returns a reference to the SpatialVariableMetadata object containing metadata for the compoment N.
DiagnosticList diagnostics_impl() const
const IceModelVec2S & runoff_impl() const
const IceModelVec2S & accumulation_impl() const
IceModelVec2S m_smb_adjustment
const IceModelVec2S & mass_flux_impl() const
NoGLRetreat(IceGrid::ConstPtr g, std::shared_ptr< SurfaceModel > input)
void update_impl(const Geometry &geometry, double t, double dt)
const IceModelVec2S & melt_impl() const
IceModelVec2S m_min_ice_thickness
const IceModelVec2S & smb_adjustment() const
void init_impl(const Geometry &geometry)
IceModelVec2S::Ptr m_mass_flux
static IceModelVec2S::Ptr allocate_mass_flux(IceGrid::ConstPtr grid)
IceModelVec2S::Ptr m_melt
static IceModelVec2S::Ptr allocate_melt(IceGrid::ConstPtr grid)
IceModelVec2S::Ptr m_accumulation
std::shared_ptr< SurfaceModel > m_input_model
void dummy_accumulation(const IceModelVec2S &smb, IceModelVec2S &result)
const IceModelVec2S & mass_flux() const
static IceModelVec2S::Ptr allocate_accumulation(IceGrid::ConstPtr grid)
static IceModelVec2S::Ptr allocate_runoff(IceGrid::ConstPtr grid)
IceModelVec2S::Ptr m_runoff
void dummy_runoff(const IceModelVec2S &smb, IceModelVec2S &result)
void dummy_melt(const IceModelVec2S &smb, IceModelVec2S &result)
The interface of PISM's surface models.
const IceModelVec2S & model_input()
SMBAdjustment(const NoGLRetreat *m)
std::map< std::string, Diagnostic::Ptr > DiagnosticList
T combine(const T &a, const T &b)