OOPS
IncrementEnsemble.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2009-2016 ECMWF.
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  * In applying this licence, ECMWF does not waive the privileges and immunities
7  * granted to it by virtue of its status as an intergovernmental organisation nor
8  * does it submit to any jurisdiction.
9  */
10 
11 #ifndef OOPS_BASE_INCREMENTENSEMBLE_H_
12 #define OOPS_BASE_INCREMENTENSEMBLE_H_
13 
14 #include <memory>
15 #include <string>
16 #include <utility>
17 #include <vector>
18 
19 #include <boost/ptr_container/ptr_vector.hpp>
20 
21 #include "eckit/config/LocalConfiguration.h"
22 #include "oops/base/Accumulator.h"
25 #include "oops/base/Variables.h"
28 #include "oops/interface/State.h"
29 #include "oops/util/DateTime.h"
30 #include "oops/util/Logger.h"
31 
32 namespace oops {
33 
34 // -----------------------------------------------------------------------------
35 
36 /// \brief Ensemble of inrements
37 template<typename MODEL> class IncrementEnsemble {
43 
44  typedef typename boost::ptr_vector<LinearVariableChangeBase_> ChvarVec_;
45  typedef typename ChvarVec_::const_reverse_iterator ircst_;
46 
47  public:
48  /// Constructor
49  IncrementEnsemble(const Geometry_ & resol, const Variables & vars,
50  const util::DateTime &, const int rank);
51  /// \brief construct ensemble of perturbations as \p ens - \p mean; holding
52  // \p vars variables
53  IncrementEnsemble(const StateEnsemble_ & ens, const State_ & mean, const Variables & vars);
54  IncrementEnsemble(const eckit::Configuration &, const State_ &, const State_ &,
55  const Geometry_ &, const Variables &);
56 
57  /// Accessors
58  size_t size() const {return ensemblePerturbs_.size();}
59  Increment_ & operator[](const int ii) {return ensemblePerturbs_[ii];}
60  const Increment_ & operator[](const int ii) const {return ensemblePerturbs_[ii];}
61 
62  /// Control variables
63  const Variables & controlVariables() const {return vars_;}
64 
65  /// Release / reset
66  void releaseMember();
67  void appendMember(const Increment_ &);
68 
69  private:
71  std::vector<Increment_> ensemblePerturbs_;
72 };
73 
74 // ====================================================================================
75 
76 template<typename MODEL>
78  const util::DateTime & tslot, const int rank)
79  : vars_(vars), ensemblePerturbs_()
80 {
81  ensemblePerturbs_.reserve(rank);
82  for (int m = 0; m < rank; ++m) {
83  ensemblePerturbs_.emplace_back(resol, vars_, tslot);
84  }
85  Log::trace() << "IncrementEnsemble:contructor done" << std::endl;
86 }
87 
88 // ====================================================================================
89 
90 template<typename MODEL>
92  const State_ & mean, const Variables & vars)
93  : vars_(vars), ensemblePerturbs_()
94 {
95  ensemblePerturbs_.reserve(ensemble.size());
96  for (size_t ii = 0; ii < ensemble.size(); ++ii) {
97  ensemblePerturbs_.emplace_back(ensemble[ii].geometry(), vars, ensemble[ii].validTime());
98  ensemblePerturbs_[ii].diff(ensemble[ii], mean);
99  }
100  Log::trace() << "IncrementEnsemble:contructor(StateEnsemble) done" << std::endl;
101 }
102 
103 // -----------------------------------------------------------------------------
104 
105 template<typename MODEL>
106 IncrementEnsemble<MODEL>::IncrementEnsemble(const eckit::Configuration & conf,
107  const State_ & xb, const State_ & fg,
108  const Geometry_ & resol, const Variables & vars)
109  : vars_(vars), ensemblePerturbs_()
110 {
111  // Get rank from config
112  std::vector<eckit::LocalConfiguration> memberConfig;
113  conf.get("members", memberConfig);
114 
115  // Check sizes and fill in timeslots
116  util::DateTime tslot = xb.validTime();
117 
118  // Read inflation field
119  std::unique_ptr<Increment_> inflationField;
120  if (conf.has("inflation field")) {
121  const eckit::LocalConfiguration inflationConfig(conf, "inflation field");
122  inflationField.reset(new Increment_(resol, vars, tslot));
123  inflationField->read(inflationConfig);
124  }
125 
126  // Get inflation value
127  double inflationValue = conf.getDouble("inflation value", 1.0);
128 
129  // Setup change of variable
130  ChvarVec_ chvars;
131  std::vector<eckit::LocalConfiguration> chvarconfs;
132  conf.get("variable changes", chvarconfs);
133  for (const auto & conf : chvarconfs) {
134  chvars.push_back(LinearVariableChangeFactory<MODEL>::create(xb, fg, resol, conf));
135  }
136  // TODO(Benjamin): one change of variable for each timeslot
137 
138  // Read ensemble
139  StateEnsemble_ ensemble(resol, conf);
140  State_ bgmean = ensemble.mean();
141 
142  ensemblePerturbs_.reserve(ensemble.size());
143  for (unsigned int ie = 0; ie < ensemble.size(); ++ie) {
144  // Ensemble will be centered around ensemble mean
145  Increment_ dx(resol, vars_, tslot);
146  dx.diff(ensemble[ie], bgmean);
147 
148  // Apply inflation
149  if (conf.has("inflation field")) {
150  dx.schur_product_with(*inflationField);
151  }
152  dx *= inflationValue;
153 
154  // Apply inverse of the linear balance operator
155  // K_1^{-1} K_2^{-1} .. K_N^{-1}
156  for (ircst_ it = chvars.rbegin(); it != chvars.rend(); ++it) {
157  dx = it->multiplyInverse(dx);
158  }
159 
160  ensemblePerturbs_.emplace_back(std::move(dx));
161  }
162  Log::trace() << "IncrementEnsemble:contructor done" << std::endl;
163 }
164 
165 // -----------------------------------------------------------------------------
166 
167 template<typename MODEL>
169  ensemblePerturbs_.erase(ensemblePerturbs_.begin());
170 }
171 
172 // -----------------------------------------------------------------------------
173 
174 template<typename MODEL>
176  ensemblePerturbs_.emplace_back(dx);
177 }
178 
179 // -----------------------------------------------------------------------------
180 
181 } // namespace oops
182 
183 #endif // OOPS_BASE_INCREMENTENSEMBLE_H_
oops::State::validTime
const util::DateTime validTime() const
Time.
Definition: oops/interface/State.h:60
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::IncrementEnsemble::controlVariables
const Variables & controlVariables() const
Control variables.
Definition: IncrementEnsemble.h:63
oops::IncrementEnsemble::appendMember
void appendMember(const Increment_ &)
Definition: IncrementEnsemble.h:175
oops::IncrementEnsemble::Geometry_
Geometry< MODEL > Geometry_
Definition: IncrementEnsemble.h:38
oops::LinearVariableChangeFactory
LinearVariableChange factory.
Definition: LinearVariableChangeBase.h:85
oops::IncrementEnsemble::StateEnsemble_
StateEnsemble< MODEL > StateEnsemble_
Definition: IncrementEnsemble.h:42
oops::IncrementEnsemble::IncrementEnsemble
IncrementEnsemble(const Geometry_ &resol, const Variables &vars, const util::DateTime &, const int rank)
Constructor.
Definition: IncrementEnsemble.h:77
oops::IncrementEnsemble::Increment_
Increment< MODEL > Increment_
Definition: IncrementEnsemble.h:39
oops::IncrementEnsemble::vars_
const Variables vars_
Definition: IncrementEnsemble.h:70
oops::Increment::diff
void diff(const State_ &, const State_ &)
Interactions with State.
Definition: oops/interface/Increment.h:196
oops::LinearVariableChangeBase
Definition: LinearVariableChangeBase.h:53
oops::IncrementEnsemble::releaseMember
void releaseMember()
Release / reset.
Definition: IncrementEnsemble.h:168
oops::IncrementEnsemble::LinearVariableChangeBase_
LinearVariableChangeBase< MODEL > LinearVariableChangeBase_
Definition: IncrementEnsemble.h:40
StateEnsemble.h
oops::IncrementEnsemble::operator[]
const Increment_ & operator[](const int ii) const
Definition: IncrementEnsemble.h:60
oops::StateEnsemble
Ensemble of states.
Definition: StateEnsemble.h:26
oops::IncrementEnsemble::operator[]
Increment_ & operator[](const int ii)
Definition: IncrementEnsemble.h:59
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
Accumulator.h
oops::IncrementEnsemble::ChvarVec_
boost::ptr_vector< LinearVariableChangeBase_ > ChvarVec_
Definition: IncrementEnsemble.h:44
oops::IncrementEnsemble::ensemblePerturbs_
std::vector< Increment_ > ensemblePerturbs_
Definition: IncrementEnsemble.h:71
oops::IncrementEnsemble::State_
State< MODEL > State_
Definition: IncrementEnsemble.h:41
oops::IncrementEnsemble::size
size_t size() const
Accessors.
Definition: IncrementEnsemble.h:58
oops::StateEnsemble::mean
State_ mean() const
calculate ensemble mean
Definition: StateEnsemble.h:68
oops::Increment::schur_product_with
void schur_product_with(const Increment &)
Definition: oops/interface/Increment.h:312
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::IncrementEnsemble::ircst_
ChvarVec_::const_reverse_iterator ircst_
Definition: IncrementEnsemble.h:45
oops::StateEnsemble::size
size_t size() const
Accessors.
Definition: StateEnsemble.h:38
State.h
oops::Variables
Definition: oops/base/Variables.h:23
oops::Increment
Increment Class: Difference between two states.
Definition: CostJbState.h:27
oops::IncrementEnsemble
Ensemble of inrements.
Definition: IncrementEnsemble.h:37
LinearVariableChangeBase.h
Variables.h
Geometry.h
Increment.h