tExample.cc - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
(HTM) git clone git://src.adamsgaard.dk/pism
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
tExample.cc (2262B)
---
1 #include "Example.hh"
2
3 #include "base/util/PISMConfigInterface.hh"
4 #include "base/util/IceGrid.hh"
5 #include "base/util/pism_options.hh"
6 #include "base/util/MaxTimestep.hh"
7
8 namespace pism {
9 namespace ocean {
10
11 Example::Example(IceGrid::ConstPtr g)
12 : OceanModel(g) {
13
14 // assume that input.forcing.buffer_size is big enough
15 m_shelf_melt_rate.create(m_grid, "shelf_base_melt_rate",
16 m_config->get_number("input.forcing.buffer_size"));
17 m_shelf_melt_rate.set_attrs("internal", "shelf base melt rate", "m / second", "");
18 }
19
20 Example::~Example() {
21 // empty
22 }
23
24 void Example::update_impl(double t, double dt) {
25 m_t = t;
26 m_dt = dt;
27
28 m_shelf_melt_rate.update(t, dt);
29
30 // Use mid-point of the interval. (We restricted the time step, so
31 // the choice of the point within the time step does not matter.)
32 m_shelf_melt_rate.interp(t + 0.5 * dt);
33
34 // Alternatively one could call. This does not require a time step restriction.
35 // m_shelf_melt_rate.average(t, dt);
36 }
37
38 void Example::init_impl() {
39 m_log->message(2, "* Initializing the example ocean model...\n");
40
41 options::String input_file("-ocean_example_file", "Shelf melt rate input file.");
42
43 if (input_file.is_set()) {
44 m_log->message(2, " Reading shelf base melt rate from %s...\n",
45 input_file->c_str());
46
47 m_shelf_melt_rate.init(input_file, 0.0, 0.0);
48 } else {
49 m_shelf_melt_rate.init_constant(0.0);
50 }
51 }
52
53 MaxTimestep Example::max_timestep_impl(double t) const {
54 // Assume that temporal variations in the melt rate have to be resolved.
55 return m_shelf_melt_rate.max_timestep(t);
56
57 // Use this to disable the time step restriction
58 return MaxTimestep("example ocean model");
59 }
60
61 void Example::shelf_base_temperature_impl(IceModelVec2S &result) const {
62 // PISM uses MKS. This is obviously wrong, but this just an example.
63 result.set(273.15);
64 }
65
66 void Example::sea_level_elevation_impl(double &result) const {
67 // Also wrong.
68 result = 0.0;
69 }
70
71 //! @brief Computes mass flux in [kg m-2 s-1], from assumption that
72 //! basal heat flux rate converts to mass flux.
73 void Example::shelf_base_mass_flux_impl(IceModelVec2S &result) const {
74 result.copy_from(m_shelf_melt_rate);
75 }
76
77 } // end of namespape ocean
78 } // end of namespace pism