tFrac_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
---
tFrac_P.cc (2553B)
---
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 "Frac_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 Frac_P::Frac_P(IceGrid::ConstPtr grid, std::shared_ptr<AtmosphereModel> in)
28 : AtmosphereModel(grid, in) {
29
30 m_forcing.reset(new ScalarForcing(grid->ctx(),
31 "atmosphere.frac_P",
32 "frac_P",
33 "1", "1",
34 "precipitation multiplier, pure fraction"));
35
36 m_precipitation = allocate_precipitation(grid);
37 }
38
39 Frac_P::~Frac_P() {
40 // empty
41 }
42
43 void Frac_P::init_impl(const Geometry &geometry) {
44 m_input_model->init(geometry);
45
46 m_log->message(2, "* Initializing precipitation forcing using scalar multipliers...\n");
47
48 m_forcing->init();
49 }
50
51 void Frac_P::init_timeseries_impl(const std::vector<double> &ts) const {
52 AtmosphereModel::init_timeseries_impl(ts);
53
54 m_offset_values.resize(ts.size());
55 for (unsigned int k = 0; k < ts.size(); ++k) {
56 m_offset_values[k] = m_forcing->value(ts[k]);
57 }
58 }
59
60 void Frac_P::update_impl(const Geometry &geometry, double t, double dt) {
61 m_input_model->update(geometry, t, dt);
62 m_forcing->update(t, dt);
63
64 m_precipitation->copy_from(m_input_model->mean_precipitation());
65 m_precipitation->scale(m_forcing->value());
66 }
67
68 const IceModelVec2S& Frac_P::mean_precipitation_impl() const {
69 return *m_precipitation;
70 }
71
72 void Frac_P::precip_time_series_impl(int i, int j, std::vector<double> &result) const {
73 m_input_model->precip_time_series(i, j, result);
74
75 for (unsigned int k = 0; k < m_offset_values.size(); ++k) {
76 result[k] *= m_offset_values[k];
77 }
78 }
79
80 } // end of namespace atmosphere
81 } // end of namespace pism