21 #include <gsl/gsl_math.h>
23 #include "pism/coupler/SurfaceModel.hh"
24 #include "pism/coupler/AtmosphereModel.hh"
25 #include "pism/util/io/File.hh"
26 #include "pism/util/Vars.hh"
27 #include "pism/util/Time.hh"
28 #include "pism/util/IceGrid.hh"
29 #include "pism/util/pism_options.hh"
30 #include "pism/util/iceModelVec.hh"
31 #include "pism/util/MaxTimestep.hh"
32 #include "pism/util/pism_utilities.hh"
33 #include "pism/util/Context.hh"
41 result->set_attrs(
"climate_forcing",
"mass held in the surface layer",
44 result->metadata()[
"valid_min"] = {0.0};
53 result->set_attrs(
"climate_forcing",
54 "thickness of the surface process layer at the top surface of the ice",
57 result->metadata()[
"valid_min"] = {0.0};
67 result->set_attrs(
"climate_forcing",
68 "liquid water fraction of the ice at the top surface",
71 result->metadata()[
"valid_range"] = {0.0, 1.0};
80 result->set_attrs(
"climate_forcing",
81 "surface mass balance (accumulation/ablation) rate",
82 "kg m-2 second-1",
"kg m-2 year-1",
83 "land_ice_surface_specific_mass_balance_flux", 0);
86 const double smb_max = config->get_number(
"surface.given.smb_max",
"kg m-2 second-1");
88 result->metadata()[
"valid_range"] = {-smb_max, smb_max};
97 result->set_attrs(
"climate_forcing",
98 "temperature of the ice at the ice surface but below firn processes",
99 "Kelvin",
"Kelvin",
"", 0);
101 result->metadata()[
"valid_range"] = {0.0, 323.15};
110 result->set_attrs(
"diagnostic",
111 "surface accumulation (precipitation minus rain)",
112 "kg m-2",
"kg m-2",
"", 0);
121 result->set_attrs(
"diagnostic",
123 "kg m-2",
"kg m-2",
"", 0);
132 result->set_attrs(
"diagnostic",
133 "surface meltwater runoff",
134 "kg m-2",
"kg m-2",
"", 0);
165 std::shared_ptr<atmosphere::AtmosphereModel> atmosphere)
383 const int i = p.i(), j = p.j();
384 result(i,j) =
std::max(smb(i,j), 0.0);
403 const int i = p.i(), j = p.j();
404 result(i,j) =
std::max(-smb(i,j), 0.0);
421 namespace diagnostics {
476 set_attrs(
"surface mass balance (accumulation/ablation) rate",
477 "land_ice_surface_specific_mass_balance_flux",
478 "kg m-2 second-1",
"kg m-2 year-1", 0);
484 result->metadata(0) =
m_vars[0];
486 result->copy_from(
model->mass_flux());
495 auto ismip6 =
m_config->get_flag(
"output.ISMIP6");
499 ismip6 ?
"litemptop" :
"ice_surface_temp")};
501 set_attrs(
"ice temperature at the top ice surface",
502 "temperature_at_top_of_ice_sheet_model",
509 result->metadata(0) =
m_vars[0];
511 result->copy_from(
model->temperature());
522 set_attrs(
"ice liquid water fraction at the ice surface",
"",
529 result->metadata(0) =
m_vars[0];
531 result->copy_from(
model->liquid_water_fraction());
542 set_attrs(
"mass of the surface layer (snow and firn)",
"",
549 result->metadata(0) =
m_vars[0];
551 result->copy_from(
model->layer_mass());
562 set_attrs(
"thickness of the surface layer (snow and firn)",
"",
563 "meters",
"meters", 0);
569 result->metadata(0) =
m_vars[0];
571 result->copy_from(
model->layer_thickness());
581 {
"climatic_mass_balance",
Diagnostic::Ptr(
new PS_climatic_mass_balance(
this))},
583 {
"ice_surface_liquid_water_fraction",
Diagnostic::Ptr(
new PS_liquid_water_fraction(
this))},
585 {
"surface_layer_thickness",
Diagnostic::Ptr(
new PS_layer_thickness(
this))}
588 if (
m_config->get_flag(
"output.ISMIP6")) {
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 IceGrid::ConstPtr m_grid
grid used by this component
DiagnosticList diagnostics() const
A class defining a common interface for most PISM sub-models.
std::shared_ptr< const Config > ConstPtr
const SurfaceModel * model
A template derived from Diagnostic, adding a "Model".
const units::System::Ptr m_sys
the unit system
std::vector< SpatialVariableMetadata > m_vars
metadata corresponding to NetCDF variables
std::shared_ptr< Diagnostic > Ptr
IceGrid::ConstPtr m_grid
the grid
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.
const Config::ConstPtr m_config
Configuration flags and parameters.
High-level PISM I/O class.
std::shared_ptr< const IceGrid > ConstPtr
std::shared_ptr< IceModelVec2S > Ptr
std::shared_ptr< IceModelVec > Ptr
Combines the max. time step with the flag indicating if a restriction is active. Makes is possible to...
static RuntimeError formatted(const ErrorLocation &location, const char format[],...) __attribute__((format(printf
build a RuntimeError with a formatted message
static IceModelVec2S::Ptr allocate_mass_flux(IceGrid::ConstPtr grid)
const IceModelVec2S & liquid_water_fraction() const
Returns the liquid water fraction of the ice at the top ice surface.
IceModelVec2S::Ptr m_liquid_water_fraction
void update(const Geometry &geometry, double t, double dt)
std::shared_ptr< atmosphere::AtmosphereModel > m_atmosphere
const IceModelVec2S & temperature() const
virtual DiagnosticList diagnostics_impl() const
virtual const IceModelVec2S & temperature_impl() const
virtual void update_impl(const Geometry &geometry, double t, double dt)
void init(const Geometry &geometry)
virtual void write_model_state_impl(const File &output) const
The default (empty implementation).
virtual void define_model_state_impl(const File &output) const
The default (empty implementation).
static IceModelVec2S::Ptr allocate_liquid_water_fraction(IceGrid::ConstPtr grid)
IceModelVec2S::Ptr m_melt
static IceModelVec2S::Ptr allocate_melt(IceGrid::ConstPtr grid)
const IceModelVec2S & layer_thickness() const
Returns thickness of the surface layer. Could be used to compute surface elevation as a sum of elevat...
virtual MaxTimestep max_timestep_impl(double my_t) const
SurfaceModel(IceGrid::ConstPtr g)
IceModelVec2S::Ptr m_layer_mass
virtual const IceModelVec2S & melt_impl() const
IceModelVec2S::Ptr m_accumulation
const IceModelVec2S & melt() const
Returns melt.
static IceModelVec2S::Ptr allocate_temperature(IceGrid::ConstPtr grid)
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)
virtual const IceModelVec2S & mass_flux_impl() const
static IceModelVec2S::Ptr allocate_layer_mass(IceGrid::ConstPtr grid)
const IceModelVec2S & layer_mass() const
Returns mass held in the surface layer.
virtual TSDiagnosticList ts_diagnostics_impl() const
static IceModelVec2S::Ptr allocate_runoff(IceGrid::ConstPtr grid)
const IceModelVec2S & runoff() const
Returns runoff.
virtual const IceModelVec2S & layer_mass_impl() const
virtual const IceModelVec2S & liquid_water_fraction_impl() const
const IceModelVec2S & accumulation() const
Returns accumulation.
IceModelVec2S::Ptr m_runoff
virtual void init_impl(const Geometry &geometry)
void dummy_runoff(const IceModelVec2S &smb, IceModelVec2S &result)
virtual const IceModelVec2S & runoff_impl() const
IceModelVec2S::Ptr m_layer_thickness
virtual const IceModelVec2S & accumulation_impl() const
static IceModelVec2S::Ptr allocate_layer_thickness(IceGrid::ConstPtr grid)
virtual const IceModelVec2S & layer_thickness_impl() const
void dummy_melt(const IceModelVec2S &smb, IceModelVec2S &result)
The interface of PISM's surface models.
PS_climatic_mass_balance(const SurfaceModel *m)
IceModelVec::Ptr compute_impl() const
IceModelVec::Ptr compute_impl() const
PS_ice_surface_temp(const SurfaceModel *m)
IceModelVec::Ptr compute_impl() const
PS_layer_mass(const SurfaceModel *m)
Mass of the surface layer (snow and firn).
PS_layer_thickness(const SurfaceModel *m)
IceModelVec::Ptr compute_impl() const
Surface layer (snow and firn) thickness.
IceModelVec::Ptr compute_impl() const
PS_liquid_water_fraction(const SurfaceModel *m)
Ice liquid water fraction at the ice surface.
#define PISM_ERROR_LOCATION
double max(const IceModelVec2S &input)
Finds maximum over all the values in an IceModelVec2S object. Ignores ghosts.
std::map< std::string, TSDiagnostic::Ptr > TSDiagnosticList
std::map< std::string, Diagnostic::Ptr > DiagnosticList
T combine(const T &a, const T &b)