PISM, A Parallel Ice Sheet Model 2.3.0-79cae578d committed by Constantine Khrulev on 2026-03-22
Loading...
Searching...
No Matches
GivenTH.cc
Go to the documentation of this file.
1// Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 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 2 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#include <gsl/gsl_poly.h>
20#include <cassert>
21
22#include "pism/coupler/ocean/GivenTH.hh"
23#include "pism/coupler/util/options.hh"
24#include "pism/geometry/Geometry.hh"
25#include "pism/util/Config.hh"
26#include "pism/util/Grid.hh"
27#include "pism/util/Time.hh"
28#include "pism/util/array/Forcing.hh"
29#include "pism/util/Logger.hh"
30#include "pism/util/io/IO_Flags.hh"
31
32namespace pism {
33namespace ocean {
34
36 // coefficients of the in situ melting point temperature
37 // parameterization:
38 a[0] = -0.0575;
39 a[1] = 0.0901;
40 a[2] = -7.61e-4;
41 // coefficients of the in situ melting point potential temperature
42 // parameterization:
43 b[0] = -0.0575;
44 b[1] = 0.0921;
45 b[2] = -7.85e-4;
46
47 // FIXME: this should not be hard-wired. Eventually we should be able
48 // to use the spatially-variable top-of-the-ice temperature.
49 shelf_top_surface_temperature = -20.0; // degrees Celsius
50
51 gamma_T = config.get_number("ocean.th.gamma_T");
52 gamma_S = config.get_number("ocean.th.gamma_S");
53 water_latent_heat_fusion = config.get_number("constants.fresh_water.latent_heat_of_fusion");
54 sea_water_density = config.get_number("constants.sea_water.density");
55 sea_water_specific_heat_capacity = config.get_number("constants.sea_water.specific_heat_capacity");
56 ice_density = config.get_number("constants.ice.density");
57 ice_specific_heat_capacity = config.get_number("constants.ice.specific_heat_capacity");
58 ice_thermal_diffusivity = config.get_number("constants.ice.thermal_conductivity") / (ice_density * ice_specific_heat_capacity);
59 limit_salinity_range = config.get_flag("ocean.th.clip_salinity");
60}
61
62GivenTH::GivenTH(std::shared_ptr<const Grid> g)
63 : CompleteOceanModel(g, std::shared_ptr<OceanModel>()) {
64
65 ForcingOptions opt(*m_grid->ctx(), "ocean.th");
66
67 {
68 unsigned int buffer_size = m_config->get_number("input.forcing.buffer_size");
69
71
72 m_theta_ocean = std::make_shared<array::Forcing>(m_grid,
73 file,
74 "theta_ocean",
75 "", // no standard name
76 buffer_size,
77 opt.periodic,
78 LINEAR);
79
80 m_salinity_ocean = std::make_shared<array::Forcing>(m_grid,
81 file,
82 "salinity_ocean",
83 "", // no standard name
84 buffer_size,
85 opt.periodic,
86 LINEAR);
87 }
88
89 m_theta_ocean->metadata(0)
90 .long_name("potential temperature of the adjacent ocean")
91 .units("kelvin");
92
93 m_salinity_ocean->metadata(0)
94 .long_name("salinity of the adjacent ocean")
95 .units("g/kg");
96}
97
98void GivenTH::init_impl(const Geometry &geometry) {
99
100 m_log->message(2,
101 "* Initializing the 3eqn melting parameterization ocean model\n"
102 " reading ocean temperature and salinity from a file...\n");
103
104 ForcingOptions opt(*m_grid->ctx(), "ocean.th");
105
106 // potential temperature is required
107 m_theta_ocean->init(opt.filename, opt.periodic);
108
109 // read ocean salinity from a file if present, otherwise use a constant
110 {
112
113 auto variable_name = m_salinity_ocean->metadata().get_name();
114
115 if (input.variable_exists(variable_name)) {
116 m_salinity_ocean->init(opt.filename, opt.periodic);
117 } else {
118 double salinity = m_config->get_number("constants.sea_water.salinity", "g / kg");
119
120 m_salinity_ocean = array::Forcing::Constant(m_grid, variable_name, salinity);
121
122 m_log->message(2, " Variable '%s' not found; using constant salinity: %f (g / kg).\n",
123 variable_name.c_str(), salinity);
124 }
125 }
126
127 // read time-independent data right away:
128 if (m_theta_ocean->buffer_size() == 1 && m_salinity_ocean->buffer_size() == 1) {
129 Inputs inputs;
130 inputs.geometry = &geometry;
131 update(inputs, time().current(), 0); // dt is irrelevant
132 }
133
134 const double
135 ice_density = m_config->get_number("constants.ice.density"),
136 water_density = m_config->get_number("constants.sea_water.density"),
137 g = m_config->get_number("constants.standard_gravity");
138
139 compute_average_water_column_pressure(geometry, ice_density, water_density, g,
141}
142
143void GivenTH::update_impl(const Inputs &inputs, double t, double dt) {
144 m_theta_ocean->update(t, dt);
145 m_salinity_ocean->update(t, dt);
146
147 m_theta_ocean->average(t, dt);
148 m_salinity_ocean->average(t, dt);
149
151
152 const array::Scalar &ice_thickness = inputs.geometry->ice_thickness;
153
156
157 array::AccessScope list{ &ice_thickness, m_theta_ocean.get(), m_salinity_ocean.get(),
158 &temperature, &mass_flux};
159
160 for (auto p : m_grid->points()) {
161 const int i = p.i(), j = p.j();
162
163 double potential_temperature_celsius = (*m_theta_ocean)(i,j) - 273.15;
164
165 double
166 shelf_base_temp_celsius = 0.0,
167 shelf_base_massflux = 0.0;
168
170 (*m_salinity_ocean)(i,j),
171 potential_temperature_celsius,
172 ice_thickness(i,j),
173 &shelf_base_temp_celsius,
174 &shelf_base_massflux);
175
176 // Convert from Celsius to kelvin:
177 temperature(i,j) = shelf_base_temp_celsius + 273.15;
178 mass_flux(i,j) = shelf_base_massflux;
179 }
180
181 // convert mass flux from [m s-1] to [kg m-2 s-1]:
182 m_shelf_base_mass_flux->scale(m_config->get_number("constants.ice.density"));
183
184 const double
185 ice_density = m_config->get_number("constants.ice.density"),
186 water_density = m_config->get_number("constants.sea_water.density"),
187 g = m_config->get_number("constants.standard_gravity");
188
189 compute_average_water_column_pressure(*inputs.geometry, ice_density, water_density, g,
191}
192
194 (void) t;
195
196 return MaxTimestep("ocean th");
197}
198
199//* Evaluate the parameterization of the melting point temperature.
200/** The value returned is in degrees Celsius.
201 */
203 double salinity, double ice_thickness) {
204 return c.a[0] * salinity + c.a[1] + c.a[2] * ice_thickness;
205}
206
207/** Melt rate, obtained by solving the salt flux balance equation.
208 *
209 * @param c model constants
210 * @param sea_water_salinity sea water salinity
211 * @param basal_salinity shelf base salinity
212 *
213 * @return shelf base melt rate, in [m/s]
214 */
216 double sea_water_salinity, double basal_salinity) {
217
218 return c.gamma_S * c.sea_water_density * (sea_water_salinity - basal_salinity) / (c.ice_density * basal_salinity);
219}
220
221/** @brief Compute temperature and melt rate at the base of the shelf.
222 * Based on [@ref HellmerOlbers1989] and [@ref HollandJenkins1999].
223 *
224 * See the manual for details.
225 *
226 * @param[in] constants model constants
227 * @param[in] sea_water_salinity sea water salinity
228 * @param[in] sea_water_potential_temperature sea water potential temperature
229 * @param[in] thickness ice shelf thickness
230 * @param[out] shelf_base_temperature_out resulting basal temperature
231 * @param[out] shelf_base_melt_rate_out resulting basal melt rate
232 *
233 * @return 0 on success
234 */
235void GivenTH::pointwise_update(const Constants &constants, double sea_water_salinity,
236 double sea_water_potential_temperature, double thickness,
237 double *shelf_base_temperature_out,
238 double *shelf_base_melt_rate_out) {
239
240 assert(thickness >= 0.0);
241
242 // This model works for sea water salinity in the range of [4, 40]
243 // psu. Ensure that input salinity is in this range.
244 const double
245 min_salinity = 4.0,
246 max_salinity = 40.0;
247
248 if (constants.limit_salinity_range) {
249 if (sea_water_salinity < min_salinity) {
250 sea_water_salinity = min_salinity;
251 } else if (sea_water_salinity > max_salinity) {
252 sea_water_salinity = max_salinity;
253 }
254 }
255
256 double basal_salinity = sea_water_salinity;
257 subshelf_salinity(constants, sea_water_salinity, sea_water_potential_temperature,
258 thickness, &basal_salinity);
259
260 // Clip basal salinity so that we can use the freezing point
261 // temperature parameterization to recover shelf base temperature.
262 if (constants.limit_salinity_range) {
263 if (basal_salinity <= min_salinity) {
264 basal_salinity = min_salinity;
265 } else if (basal_salinity >= max_salinity) {
266 basal_salinity = max_salinity;
267 }
268 }
269
270 *shelf_base_temperature_out = melting_point_temperature(constants, basal_salinity, thickness);
271
272 *shelf_base_melt_rate_out = shelf_base_melt_rate(constants, sea_water_salinity, basal_salinity);
273
274 // no melt if there is no ice
275 if (thickness == 0.0) {
276 *shelf_base_melt_rate_out = 0.0;
277 }
278}
279
280
281/** @brief Compute the basal salinity and make sure that it is
282 * consistent with the basal melt rate.
283 *
284 * @param[in] c constants
285 * @param[in] sea_water_salinity sea water salinity
286 * @param[in] sea_water_potential_temperature sea water potential temperature
287 * @param[in] thickness ice shelf thickness
288 * @param[out] shelf_base_salinity resulting shelf base salinity
289 *
290 * @return 0 on success
291 */
292void GivenTH::subshelf_salinity(const Constants &c, double sea_water_salinity,
293 double sea_water_potential_temperature, double thickness,
294 double *shelf_base_salinity) {
295
296 double basal_salinity = sea_water_salinity;
297
298 // first, assume that there is melt at the shelf base:
299 {
300 subshelf_salinity_melt(c, sea_water_salinity, sea_water_potential_temperature,
301 thickness, &basal_salinity);
302
303 double basal_melt_rate = shelf_base_melt_rate(c, sea_water_salinity, basal_salinity);
304
305 if (basal_melt_rate > 0.0) {
306 // computed basal melt rate is consistent with the assumption used
307 // to compute basal salinity
308 *shelf_base_salinity = basal_salinity;
309 return;
310 }
311 }
312
313 // Assuming that there is melt resulted in an inconsistent
314 // (salinity, melt_rate) pair. Assume that there is freeze-on at the base.
315 {
316 subshelf_salinity_freeze_on(c, sea_water_salinity, sea_water_potential_temperature,
317 thickness, &basal_salinity);
318
319 double basal_melt_rate = shelf_base_melt_rate(c, sea_water_salinity, basal_salinity);
320
321 if (basal_melt_rate < 0.0) {
322 // computed basal melt rate is consistent with the assumption
323 // used to compute basal salinity
324 *shelf_base_salinity = basal_salinity;
325 return;
326 }
327 }
328
329 // Both assumptions (above) resulted in inconsistencies. Revert to
330 // the "diffusion-only" case, which may be less accurate, but is
331 // generic and is always consistent.
332 {
333 subshelf_salinity_diffusion_only(c, sea_water_salinity, sea_water_potential_temperature,
334 thickness, &basal_salinity);
335
336 *shelf_base_salinity = basal_salinity;
337 }
338}
339
340/** Compute basal salinity in the basal melt case.
341 *
342 * We use the parameterization of the temperature gradient from [@ref
343 * Hellmeretal1998], equation 13:
344 *
345 * @f[ T_{\text{grad}} = -\Delta T\, \frac{\frac{\partial h}{\partial t}}{\kappa}, @f]
346 *
347 * where @f$ \Delta T @f$ is the difference between the ice
348 * temperature at the top of the ice column and its bottom:
349 * @f$ \Delta T = T^S - T^B. @f$ With this parameterization, we have
350 *
351 * @f[ Q_T^I = \rho_I\, c_{pI}\, {\frac{\partial h}{\partial t}}\, (T^S - T^B). @f]
352 *
353 * Then the coefficients of the quadratic equation for basal salinity
354 * (see pointwise_update()) are
355 *
356 * @f{align*}{
357 * A &= a_{0}\,\gamma_S\,c_{pI}-b_{0}\,\gamma_T\,c_{pW}\\
358 * B &= \gamma_S\,\left(L-c_{pI}\,\left(T^S+a_{0}\,S^W-a_{2}\,h-a_{1}\right)\right)+
359 * \gamma_T\,c_{pW}\,\left(\Theta^W-b_{2}\,h-b_{1}\right)\\
360 * C &= -\gamma_S\,S^W\,\left(L-c_{pI}\,\left(T^S-a_{2}\,h-a_{1}\right)\right)
361 * @f}
362 *
363 * @param[in] c physical constants, stored here to avoid looking them up in a double for loop
364 * @param[in] sea_water_salinity salinity of the ocean immediately adjacent to the shelf, [g/kg]
365 * @param[in] sea_water_potential_temperature potential temperature of the sea water, [degrees Celsius]
366 * @param[in] thickness thickness of the ice shelf, [meters]
367 * @param[out] shelf_base_salinity resulting shelf base salinity
368 *
369 * @return 0 on success
370 */
371void GivenTH::subshelf_salinity_melt(const Constants &c, double sea_water_salinity,
372 double sea_water_potential_temperature, double thickness,
373 double *shelf_base_salinity) {
374
375 const double
380 S_W = sea_water_salinity,
381 Theta_W = sea_water_potential_temperature;
382
383 // We solve a quadratic equation for Sb, the salinity at the shelf
384 // base.
385 //
386 // A*Sb^2 + B*Sb + C = 0
387 const double A = c.a[0] * c.gamma_S * c_pI - c.b[0] * c.gamma_T * c_pW;
388 const double B = (c.gamma_S * (L - c_pI * (T_S + c.a[0] * S_W - c.a[2] * thickness - c.a[1])) +
389 c.gamma_T * c_pW * (Theta_W - c.b[2] * thickness - c.b[1]));
390 const double C = -c.gamma_S * S_W * (L - c_pI * (T_S - c.a[2] * thickness - c.a[1]));
391
392 double S1 = 0.0, S2 = 0.0;
393 const int n_roots = gsl_poly_solve_quadratic(A, B, C, &S1, &S2);
394
395 assert(n_roots > 0);
396 assert(S2 > 0.0); // The bigger root should be positive.
397
398 *shelf_base_salinity = S2;
399}
400
401/** Compute basal salinity in the basal freeze-on case.
402 *
403 * In this case we assume that the temperature gradient at the shelf base is zero:
404 *
405 * @f[ T_{\text{grad}} = 0. @f]
406 *
407 * Please see pointwise_update() for details.
408 *
409 * In this case the coefficients of the quadratic equation for the
410 * basal salinity are:
411 *
412 * @f{align*}{
413 * A &= -b_{0}\,\gamma_T\,c_{pW} \\
414 * B &= \gamma_S\,L+\gamma_T\,c_{pW}\,\left(\Theta^W-b_{2}\,h-b_{1}\right) \\
415 * C &= -\gamma_S\,S^W\,L\\
416 * @f}
417 *
418 * @param[in] c model constants
419 * @param[in] sea_water_salinity sea water salinity
420 * @param[in] sea_water_potential_temperature sea water temperature
421 * @param[in] thickness ice shelf thickness
422 * @param[out] shelf_base_salinity resulting basal salinity
423 *
424 * @return 0 on success
425 */
426void GivenTH::subshelf_salinity_freeze_on(const Constants &c, double sea_water_salinity,
427 double sea_water_potential_temperature, double thickness,
428 double *shelf_base_salinity) {
429
430 const double
433 S_W = sea_water_salinity,
434 Theta_W = sea_water_potential_temperature,
435 h = thickness;
436
437 // We solve a quadratic equation for Sb, the salinity at the shelf
438 // base.
439 //
440 // A*Sb^2 + B*Sb + C = 0
441 const double A = -c.b[0] * c.gamma_T * c_pW;
442 const double B = c.gamma_S * L + c.gamma_T * c_pW * (Theta_W - c.b[2] * h - c.b[1]);
443 const double C = -c.gamma_S * S_W * L;
444
445 double S1 = 0.0, S2 = 0.0;
446 const int n_roots = gsl_poly_solve_quadratic(A, B, C, &S1, &S2);
447
448 assert(n_roots > 0);
449 assert(S2 > 0.0); // The bigger root should be positive.
450
451 *shelf_base_salinity = S2;
452}
453
454/** @brief Compute basal salinity in the case of no basal melt and no
455 * freeze-on, with the diffusion-only temperature distribution in the
456 * ice column.
457 *
458 * In this case the temperature gradient at the base ([@ref
459 * HollandJenkins1999], equation 21) is
460 *
461 * @f[ T_{\text{grad}} = \frac{\Delta T}{h}, @f]
462 *
463 * where @f$ h @f$ is the ice shelf thickness and @f$ \Delta T = T^S -
464 * T^B @f$ is the difference between the temperature at the top and
465 * the bottom of the shelf.
466 *
467 * In this case the coefficients of the quadratic equation for the basal salinity are:
468 *
469 * @f{align*}{
470 * A &= - \frac{b_{0}\,\gamma_T\,h\,\rho_W\,c_{pW}-a_{0}\,\rho_I\,c_{pI}\,\kappa}{h\,\rho_W}\\
471 * B &= \frac{\rho_I\,c_{pI}\,\kappa\,\left(T^S-a_{2}\,h-a_{1}\right)}{h\,\rho_W}
472 +\gamma_S\,L+\gamma_T\,c_{pW}\,\left(\Theta^W-b_{2}\,h-b_{1}\right)\\
473 * C &= -\gamma_S\,S^W\,L\\
474 * @f}
475 *
476 * @param[in] c model constants
477 * @param[in] sea_water_salinity sea water salinity
478 * @param[in] sea_water_potential_temperature sea water potential temperature
479 * @param[in] thickness ice shelf thickness
480 * @param[out] shelf_base_salinity resulting basal salinity
481 *
482 * @return 0 on success
483 */
484void GivenTH::subshelf_salinity_diffusion_only(const Constants &c, double sea_water_salinity,
485 double sea_water_potential_temperature,
486 double thickness, double *shelf_base_salinity) {
487
488 const double
493 S_W = sea_water_salinity,
494 Theta_W = sea_water_potential_temperature,
495 h = thickness,
496 rho_W = c.sea_water_density,
497 rho_I = c.ice_density,
498 kappa = c.ice_thermal_diffusivity;
499
500 // We solve a quadratic equation for Sb, the salinity at the shelf
501 // base.
502 //
503 // A*Sb^2 + B*Sb + C = 0
504 const double A = -(c.b[0] * c.gamma_T * h * rho_W * c_pW - c.a[0] * rho_I * c_pI * kappa) / (h * rho_W);
505 const double B = ((rho_I * c_pI * kappa * (T_S - c.a[2] * h - c.a[1])) / (h * rho_W) +
506 c.gamma_S * L + c.gamma_T * c_pW * (Theta_W - c.b[2] * h - c.b[1]));
507 const double C = -c.gamma_S * S_W * L;
508
509 double S1 = 0.0, S2 = 0.0;
510 const int n_roots = gsl_poly_solve_quadratic(A, B, C, &S1, &S2);
511
512 assert(n_roots > 0);
513 assert(S2 > 0.0); // The bigger root should be positive.
514
515 *shelf_base_salinity = S2;
516}
517
518} // end of namespace ocean
519} // end of namespace pism
const Time & time() const
Definition Component.cc:111
std::shared_ptr< const Config > m_config
configuration database used by this component
Definition Component.hh:160
const std::shared_ptr< const Grid > m_grid
grid used by this component
Definition Component.hh:158
std::shared_ptr< const Logger > m_log
logger (for easy access)
Definition Component.hh:164
double get_number(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
Definition Config.cc:188
bool get_flag(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
Definition Config.cc:351
A class for storing and accessing PISM configuration flags and parameters.
Definition Config.hh:56
bool variable_exists(const std::string &short_name) const
Checks if a variable exists.
Definition File.cc:378
High-level PISM I/O class.
Definition File.hh:57
array::Scalar2 ice_thickness
Definition Geometry.hh:51
Combines the max. time step with the flag indicating if a restriction is active. Makes is possible to...
Makes sure that we call begin_access() and end_access() for all accessed array::Arrays.
Definition Array.hh:66
void scale(double alpha)
Result: v <- v * alpha. Calls VecScale.
Definition Array.cc:227
static std::shared_ptr< Forcing > Constant(std::shared_ptr< const Grid > grid, const std::string &short_name, double value)
Definition Forcing.cc:148
std::shared_ptr< array::Scalar > m_shelf_base_mass_flux
std::shared_ptr< array::Scalar > m_shelf_base_temperature
Constants(const Config &config)
Definition GivenTH.cc:35
double gamma_S
Turbulent salt transfer coefficient:
Definition GivenTH.hh:49
double gamma_T
Turbulent heat transfer coefficient:
Definition GivenTH.hh:47
GivenTH(std::shared_ptr< const Grid > g)
Definition GivenTH.cc:62
void update_impl(const Inputs &inputs, double t, double dt)
Definition GivenTH.cc:143
static void subshelf_salinity_diffusion_only(const Constants &constants, double sea_water_salinity, double sea_water_potential_temperature, double ice_thickness, double *shelf_base_salinity)
Compute basal salinity in the case of no basal melt and no freeze-on, with the diffusion-only tempera...
Definition GivenTH.cc:484
static void subshelf_salinity_melt(const Constants &constants, double sea_water_salinity, double sea_water_potential_temperature, double ice_thickness, double *shelf_base_salinity)
Definition GivenTH.cc:371
std::shared_ptr< array::Forcing > m_salinity_ocean
Definition GivenTH.hh:66
std::shared_ptr< array::Forcing > m_theta_ocean
Definition GivenTH.hh:65
static void subshelf_salinity_freeze_on(const Constants &constants, double sea_water_salinity, double sea_water_potential_temperature, double ice_thickness, double *shelf_base_salinity)
Definition GivenTH.cc:426
MaxTimestep max_timestep_impl(double t) const
Definition GivenTH.cc:193
static void pointwise_update(const Constants &constants, double sea_water_salinity, double sea_water_potential_temperature, double ice_thickness, double *shelf_base_temperature_out, double *shelf_base_melt_rate_out)
Compute temperature and melt rate at the base of the shelf. Based on [HellmerOlbers1989] and [Holland...
Definition GivenTH.cc:235
static void subshelf_salinity(const Constants &constants, double sea_water_salinity, double sea_water_potential_temperature, double ice_thickness, double *shelf_base_salinity)
Compute the basal salinity and make sure that it is consistent with the basal melt rate.
Definition GivenTH.cc:292
void init_impl(const Geometry &geometry)
Definition GivenTH.cc:98
void update(const Inputs &geometry, double t, double dt)
Definition OceanModel.cc:89
std::shared_ptr< array::Scalar > m_water_column_pressure
Definition OceanModel.hh:78
A very rudimentary PISM ocean model.
Definition OceanModel.hh:38
static const double L
Definition exactTestL.cc:40
@ PISM_GUESS
Definition IO_Flags.hh:57
@ PISM_NETCDF3
Definition IO_Flags.hh:58
@ PISM_READONLY
open an existing file for reading only
Definition IO_Flags.hh:69
bool ocean(int M)
An ocean cell (floating ice or ice-free).
Definition Mask.hh:40
static double melting_point_temperature(GivenTH::Constants c, double salinity, double ice_thickness)
Definition GivenTH.cc:202
void compute_average_water_column_pressure(const Geometry &geometry, double ice_density, double water_density, double standard_gravity, array::Scalar &result)
static double shelf_base_melt_rate(GivenTH::Constants c, double sea_water_salinity, double basal_salinity)
Definition GivenTH.cc:215
static const double g
Definition exactTestP.cc:36
std::string filename
Definition options.hh:33
const Geometry * geometry
Definition OceanModel.hh:34