tDelta_P.cc - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
HTML git clone git://src.adamsgaard.dk/pism
DIR Log
DIR Files
DIR Refs
DIR LICENSE
---
tDelta_P.cc (2607B)
---
1 // Copyright (C) 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 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 #include "Delta_P.hh"
20
21 #include "pism/util/ConfigInterface.hh"
22 #include "pism/coupler/util/ScalarForcing.hh"
23
24 namespace pism {
25 namespace atmosphere {
26
27 Delta_P::Delta_P(IceGrid::ConstPtr grid, std::shared_ptr<AtmosphereModel> in)
28 : AtmosphereModel(grid, in) {
29
30 m_forcing.reset(new ScalarForcing(grid->ctx(),
31 "atmosphere.delta_P",
32 "delta_P",
33 "kg m-2 second-1",
34 "kg m-2 year-1",
35 "precipitation offsets"));
36
37 m_precipitation = allocate_precipitation(grid);
38 }
39
40 Delta_P::~Delta_P() {
41 // empty
42 }
43
44 void Delta_P::init_impl(const Geometry &geometry) {
45 m_input_model->init(geometry);
46
47 m_log->message(2, "* Initializing precipitation forcing using scalar offsets...\n");
48
49 m_forcing->init();
50 }
51
52 void Delta_P::init_timeseries_impl(const std::vector<double> &ts) const {
53 AtmosphereModel::init_timeseries_impl(ts);
54
55 m_offset_values.resize(ts.size());
56 for (unsigned int k = 0; k < ts.size(); ++k) {
57 m_offset_values[k] = m_forcing->value(ts[k]);
58 }
59 }
60
61 void Delta_P::update_impl(const Geometry &geometry, double t, double dt) {
62 m_input_model->update(geometry, t, dt);
63 m_forcing->update(t, dt);
64
65 m_precipitation->copy_from(m_input_model->mean_precipitation());
66 m_precipitation->shift(m_forcing->value());
67 }
68
69 const IceModelVec2S& Delta_P::mean_precipitation_impl() const {
70 return *m_precipitation;
71 }
72
73 void Delta_P::precip_time_series_impl(int i, int j, std::vector<double> &result) const {
74 m_input_model->precip_time_series(i, j, result);
75
76 for (unsigned int k = 0; k < m_offset_values.size(); ++k) {
77 result[k] += m_offset_values[k];
78 }
79 }
80
81 } // end of namespace atmosphere
82 } // end of namespace pism