PISM, A Parallel Ice Sheet Model  stable v2.1-1-g6902d5502 committed by Ed Bueler on 2023-12-20 08:38:27 -0800
DEBMSimplePointwise.hh
Go to the documentation of this file.
1 // Copyright (C) 2009--2023 PISM Authors
2 //
3 // This file is part of PISM.
4 //
5 // PISM is free software; you can redistribute it and/or modify it under the
6 // terms of the GNU General Public License as published by the Free Software
7 // Foundation; either version 3 of the License, or (at your option) any later
8 // version.
9 //
10 // PISM is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 // details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with PISM; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 
19 #ifndef PISM_DEBM_SIMPLE_POINTWISE_H
20 #define PISM_DEBM_SIMPLE_POINTWISE_H
21 
22 #include <memory>
23 #include <array>
24 
25 #include "pism/util/Mask.hh"
26 #include "pism/util/ScalarForcing.hh"
27 
28 namespace pism {
29 
30 class Context;
31 class Time;
32 
33 namespace surface {
34 
36 public:
38 
41  double offset_melt;
42  double total_melt;
43 };
44 
45 //! A dEBM-simple implementation
46 /*!
47  * This class implements dEBM-simple, the simple diurnal energy balance model described in
48  *
49  * M. Zeitz, R. Reese, J. Beckmann, U. Krebs-Kanzow, and R. Winkelmann, “Impact of the
50  * melt–albedo feedback on the future evolution of the Greenland Ice Sheet with
51  * PISM-dEBM-simple,” The Cryosphere, vol. 15, Art. no. 12, Dec. 2021.
52 */
54 public:
55  DEBMSimplePointwise(const Context &ctx);
56 
57  double albedo(double melt_rate, MaskValue cell_type) const;
58 
60  double declination;
62  };
63 
64  OrbitalParameters orbital_parameters(double time) const;
65 
66  DEBMSimpleMelt melt(double declination,
67  double distance_factor,
68  double dt,
69  double T_std_deviation,
70  double T,
71  double surface_elevation,
72  double lat,
73  double albedo) const;
74 
75  class Changes {
76  public:
77  Changes();
78 
79  double snow_depth;
80  double melt;
81  double runoff;
82  double smb;
83  };
84 
85  Changes step(double ice_thickness,
86  double max_melt,
87  double snow_depth,
88  double accumulation) const;
89 
90  // public because it is a diagnostic field
91  double atmosphere_transmissivity(double elevation) const;
92 
93  double insolation(double declination,
94  double distance_factor,
95  double latitude_degrees) const;
96 
97 private:
98  double eccentricity(double time) const;
99  double obliquity(double time) const;
100  double perihelion_longitude(double time) const;
101 
102  //! refreeze melted ice
104  //! refreeze fraction
106  //! threshold temperature for the computation of temperature-driven melt
108 
111 
112  double m_albedo_max;
113  double m_albedo_min;
115 
116  //! slope used in the linear parameterization of the albedo as a function of melt
118 
119  //! slope used in the linear parameterization of transmissivity
122 
123  // tuning parameters of the melt equation
124  double m_melt_c1;
125  double m_melt_c2;
126 
127  // threshold air temperature (no melt at temperatures below this)
129 
130  //! latent heat of fusion
131  double m_L;
132  //! the solar constant
134 
135  //! minimum solar elevation angle above which melt is possible
136  double m_phi;
137 
138  std::unique_ptr<ScalarForcing> m_eccentricity;
139  std::unique_ptr<ScalarForcing> m_obliquity;
140  std::unique_ptr<ScalarForcing> m_perihelion_longitude;
141 
142  bool m_paleo;
144 
148 
149  std::shared_ptr<const Time> m_time;
150 };
151 
152 } // end of namespace surface
153 } // end of namespace pism
154 
155 #endif /* PISM_DEBM_SIMPLE_POINTWISE_H */
double albedo(double melt_rate, MaskValue cell_type) const
double insolation(double declination, double distance_factor, double latitude_degrees) const
double m_transmissivity_slope
slope used in the linear parameterization of transmissivity
std::unique_ptr< ScalarForcing > m_eccentricity
std::unique_ptr< ScalarForcing > m_obliquity
double m_refreeze_fraction
refreeze fraction
double m_positive_threshold_temperature
threshold temperature for the computation of temperature-driven melt
double eccentricity(double time) const
DEBMSimpleMelt melt(double declination, double distance_factor, double dt, double T_std_deviation, double T, double surface_elevation, double lat, double albedo) const
double m_albedo_slope
slope used in the linear parameterization of the albedo as a function of melt
bool m_refreeze_ice_melt
refreeze melted ice
double perihelion_longitude(double time) const
double m_solar_constant
the solar constant
Changes step(double ice_thickness, double max_melt, double snow_depth, double accumulation) const
Compute the surface mass balance at a location from the amount of melted snow and the solid accumulat...
double m_phi
minimum solar elevation angle above which melt is possible
double atmosphere_transmissivity(double elevation) const
std::unique_ptr< ScalarForcing > m_perihelion_longitude
std::shared_ptr< const Time > m_time
OrbitalParameters orbital_parameters(double time) const
A dEBM-simple implementation.
MaskValue
Definition: Mask.hh:30