OOPS
ControlIncrement.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_ASSIMILATION_CONTROLINCREMENT_H_
12 #define OOPS_ASSIMILATION_CONTROLINCREMENT_H_
13 
14 #include <cmath>
15 #include <ostream>
16 #include <sstream>
17 #include <string>
18 #include <vector>
19 
20 #include "eckit/config/Configuration.h"
25 #include "oops/util/dot_product.h"
26 #include "oops/util/Logger.h"
27 #include "oops/util/ObjectCounter.h"
28 #include "oops/util/Printable.h"
29 #include "oops/util/Serializable.h"
30 
31 namespace oops {
32 
33 /// Control variable increment
34 /*!
35  * The control variable acts as a container for the inputs of the variational
36  * data assimilation cost functions in physical space.
37  * That includes the states at the start the assimilation window or of each
38  * sub-window but also additional variables such as model bias, VarBC
39  * coefficients, or other control variables for algorithms that use them.
40  * The control variable increment contains variations of the
41  * control variable.
42  */
43 
44 template<typename MODEL, typename OBS> class CostJbTotal;
45 
46 template<typename MODEL, typename OBS> class ControlIncrement;
47 
48 // -----------------------------------------------------------------------------
49 template<typename MODEL, typename OBS>
50 class ControlIncrement : public util::Printable,
51  public util::Serializable,
52  private util::ObjectCounter<ControlIncrement<MODEL, OBS> > {
58 
59  public:
60  static const std::string classname() {return "oops::ControlIncrement";}
61 
62 /// Constructor, destructor
63  explicit ControlIncrement(const JbTotal_ &);
64  ControlIncrement(const ControlIncrement &, const bool copy = true);
65  ControlIncrement(const ControlIncrement &, const eckit::Configuration &);
68 
69 /// Linear algebra operators
70  void zero();
74  ControlIncrement & operator*=(const double);
75  void axpy(const double, const ControlIncrement &);
76  double dot_product_with(const ControlIncrement &) const;
77 
78 /// I/O and diagnostics
79  void read(const eckit::Configuration &);
80  void write(const eckit::Configuration &) const;
81 
82 /// Get geometry
83  Geometry_ geometry() const {return increment_.geometry();}
84 
85 /// Get state control variable
86  Increment_ & state() {return increment_;}
87  const Increment_ & state() const {return increment_;}
88 
89 /// Get augmented model control variable
91  const ModelAuxIncr_ & modVar() const {return modbias_;}
92 
93 /// Get augmented observation control variable
95  const ObsAuxIncrs_ & obsVar() const {return obsbias_;}
96 
97 /// Serialize and deserialize ControlIncrement
98  size_t serialSize() const override;
99  void serialize(std::vector<double> &) const override;
100  void deserialize(const std::vector<double> &, size_t &) override;
101 
102  void shift_forward();
103  void shift_backward();
104 
105  private:
106  void print(std::ostream &) const override;
107 
109  ModelAuxIncr_ modbias_; // not only for bias, better name?
110  ObsAuxIncrs_ obsbias_; // not only for bias, better name?
111  const util::DateTime windowBegin_;
112  const util::DateTime windowEnd_;
113 };
114 
115 // =============================================================================
116 
117 template<typename MODEL, typename OBS>
119  : increment_(*jb.jbState().newStateIncrement()), // not good, extra copy
120  modbias_(jb.resolution(), jb.jbModBias().config()),
121  obsbias_(jb.jbObsBias().obspaces(), jb.jbObsBias().config()),
122  windowBegin_(jb.windowBegin()), windowEnd_(jb.windowEnd())
123 {
124  Log::trace() << "ControlIncrement:ControlIncrement created." << std::endl;
125 }
126 // -----------------------------------------------------------------------------
127 template<typename MODEL, typename OBS>
129  : increment_(other.increment_, copy), modbias_(other.modbias_, copy),
130  obsbias_(other.obsbias_, copy), windowBegin_(other.windowBegin_), windowEnd_(other.windowEnd_)
131 {
132  Log::trace() << "ControlIncrement:ControlIncrement copied." << std::endl;
133 }
134 // -----------------------------------------------------------------------------
135 template<typename MODEL, typename OBS>
137  const eckit::Configuration & tlConf)
138  : increment_(other.increment_, tlConf), modbias_(other.modbias_, tlConf),
139  obsbias_(other.obsbias_, tlConf), windowBegin_(other.windowBegin_), windowEnd_(other.windowEnd_)
140 {
141  Log::trace() << "ControlIncrement:ControlIncrement copied." << std::endl;
142 }
143 // -----------------------------------------------------------------------------
144 template<typename MODEL, typename OBS>
146  const ControlIncrement & other)
147  : increment_(geom, other.increment_), modbias_(other.modbias_, true),
148  obsbias_(other.obsbias_, true), windowBegin_(other.windowBegin_), windowEnd_(other.windowEnd_)
149 {
150  Log::trace() << "ControlIncrement:ControlIncrement copied." << std::endl;
151 }
152 // -----------------------------------------------------------------------------
153 template<typename MODEL, typename OBS>
155 // -----------------------------------------------------------------------------
156 template<typename MODEL, typename OBS> ControlIncrement<MODEL, OBS> &
158  increment_ = rhs.increment_;
159  modbias_ = rhs.modbias_;
160  obsbias_ = rhs.obsbias_;
161  return *this;
162 }
163 // -----------------------------------------------------------------------------
164 template<typename MODEL, typename OBS> ControlIncrement<MODEL, OBS> &
166  increment_ += rhs.increment_;
167  modbias_ += rhs.modbias_;
168  obsbias_ += rhs.obsbias_;
169  return *this;
170 }
171 // -----------------------------------------------------------------------------
172 template<typename MODEL, typename OBS> ControlIncrement<MODEL, OBS> &
174  increment_ -= rhs.increment_;
175  modbias_ -= rhs.modbias_;
176  obsbias_ -= rhs.obsbias_;
177  return *this;
178 }
179 // -----------------------------------------------------------------------------
180 template<typename MODEL, typename OBS>
182  increment_ *= zz;
183  modbias_ *= zz;
184  obsbias_ *= zz;
185  return *this;
186 }
187 // -----------------------------------------------------------------------------
188 template<typename MODEL, typename OBS>
190  increment_.zero();
191  modbias_.zero();
192  obsbias_.zero();
193 }
194 // -----------------------------------------------------------------------------
195 template<typename MODEL, typename OBS>
196 void ControlIncrement<MODEL, OBS>::axpy(const double zz, const ControlIncrement & rhs) {
197  increment_.axpy(zz, rhs.increment_);
198  modbias_.axpy(zz, rhs.modbias_);
199  obsbias_.axpy(zz, rhs.obsbias_);
200 }
201 // -----------------------------------------------------------------------------
202 template<typename MODEL, typename OBS>
203 void ControlIncrement<MODEL, OBS>::read(const eckit::Configuration & config) {
204  increment_.read(config);
205  modbias_.read(config);
206  obsbias_.read(config);
207 }
208 // -----------------------------------------------------------------------------
209 template<typename MODEL, typename OBS>
210 void ControlIncrement<MODEL, OBS>::write(const eckit::Configuration & config) const {
211  increment_.write(config);
212  modbias_.write(config);
213  obsbias_.write(config);
214 }
215 // -----------------------------------------------------------------------------
216 template <typename MODEL, typename OBS>
217 void ControlIncrement<MODEL, OBS>::print(std::ostream & outs) const {
218  outs << increment_;
219  outs << modbias_;
220  outs << obsbias_;
221 }
222 // -----------------------------------------------------------------------------
223 template<typename MODEL, typename OBS>
225  double zz = 0.0;
226  zz += dot_product(increment_, x2.increment_);
227  zz += dot_product(modbias_, x2.modbias_);
228  zz += dot_product(obsbias_, x2.obsbias_);
229  return zz;
230 }
231 // -----------------------------------------------------------------------------
232 template<typename MODEL, typename OBS>
234  size_t ss = 4;
235  ss += increment_.serialSize();
236  ss += modbias_.serialSize();
237  ss += obsbias_.serialSize();
238  return ss;
239 }
240 // -----------------------------------------------------------------------------
241 template<typename MODEL, typename OBS>
242 void ControlIncrement<MODEL, OBS>::serialize(std::vector<double> & vec) const {
243  vec.reserve(vec.size() + this->serialSize()); // allocate memory to avoid reallocations
244 
245  vec.push_back(-111.0);
246  increment_.serialize(vec);
247 
248  vec.push_back(-222.0);
249  modbias_.serialize(vec);
250 
251  vec.push_back(-333.0);
252  obsbias_.serialize(vec);
253 
254  vec.push_back(-444.0);
255 }
256 // -----------------------------------------------------------------------------
257 template<typename MODEL, typename OBS>
258 void ControlIncrement<MODEL, OBS>::deserialize(const std::vector<double> & vec, size_t & indx) {
259  ASSERT(vec.at(indx) == -111.0);
260  ++indx;
261 
262  increment_.deserialize(vec, indx);
263 
264  ASSERT(vec.at(indx) == -222.0);
265  ++indx;
266 
267  modbias_.deserialize(vec, indx);
268 
269  ASSERT(vec.at(indx) == -333.0);
270  ++indx;
271 
272  obsbias_.deserialize(vec, indx);
273  ASSERT(vec.at(indx) == -444.0);
274  ++indx;
275 }
276 // -----------------------------------------------------------------------------
277 template<typename MODEL, typename OBS>
279  increment_.shift_forward(windowBegin_);
280 // Probably needs some gathering of contributions for modbias_ and obsbias_
281 }
282 // -----------------------------------------------------------------------------
283 template<typename MODEL, typename OBS>
285  increment_.shift_backward(windowEnd_);
286 // Probably needs some gathering of contributions for modbias_ and obsbias_
287 }
288 // -----------------------------------------------------------------------------
289 
290 } // namespace oops
291 
292 #endif // OOPS_ASSIMILATION_CONTROLINCREMENT_H_
oops::ControlIncrement::Geometry_
Geometry< MODEL > Geometry_
Definition: ControlIncrement.h:54
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ControlIncrement::obsVar
ObsAuxIncrs_ & obsVar()
Get augmented observation control variable.
Definition: ControlIncrement.h:94
oops::ControlIncrement::write
void write(const eckit::Configuration &) const
Definition: ControlIncrement.h:210
oops::ControlIncrement::serialSize
size_t serialSize() const override
Serialize and deserialize ControlIncrement.
Definition: ControlIncrement.h:233
oops::ControlIncrement::windowEnd_
const util::DateTime windowEnd_
Definition: ControlIncrement.h:112
oops::Increment::geometry
Geometry_ geometry() const
Get geometry.
Definition: oops/interface/Increment.h:397
oops::ControlIncrement::shift_forward
void shift_forward()
Definition: ControlIncrement.h:278
oops::ControlIncrement::classname
static const std::string classname()
Definition: ControlIncrement.h:60
oops::ControlIncrement::modVar
ModelAuxIncr_ & modVar()
Get augmented model control variable.
Definition: ControlIncrement.h:90
oops::ControlIncrement::operator=
ControlIncrement & operator=(const ControlIncrement &)
Definition: ControlIncrement.h:157
oops::ControlIncrement
Definition: ControlIncrement.h:46
oops::ControlIncrement::zero
void zero()
Linear algebra operators.
Definition: ControlIncrement.h:189
oops::ControlIncrement::operator*=
ControlIncrement & operator*=(const double)
Definition: ControlIncrement.h:181
oops::ControlIncrement::ObsAuxIncrs_
ObsAuxIncrements< OBS > ObsAuxIncrs_
Definition: ControlIncrement.h:57
oops::ControlIncrement::modbias_
ModelAuxIncr_ modbias_
Definition: ControlIncrement.h:109
oops::ControlIncrement::read
void read(const eckit::Configuration &)
I/O and diagnostics.
Definition: ControlIncrement.h:203
oops::ControlIncrement::dot_product_with
double dot_product_with(const ControlIncrement &) const
Definition: ControlIncrement.h:224
oops::ControlIncrement::modVar
const ModelAuxIncr_ & modVar() const
Definition: ControlIncrement.h:91
oops::ControlIncrement::increment_
Increment_ increment_
Definition: ControlIncrement.h:108
oops::ControlIncrement::obsbias_
ObsAuxIncrs_ obsbias_
Definition: ControlIncrement.h:110
ObsAuxIncrements.h
oops::ControlIncrement::ModelAuxIncr_
ModelAuxIncrement< MODEL > ModelAuxIncr_
Definition: ControlIncrement.h:56
ModelAuxIncrement.h
oops::ControlIncrement::windowBegin_
const util::DateTime windowBegin_
Definition: ControlIncrement.h:111
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
oops::ControlIncrement::state
Increment_ & state()
Get state control variable.
Definition: ControlIncrement.h:86
oops::ControlIncrement::obsVar
const ObsAuxIncrs_ & obsVar() const
Definition: ControlIncrement.h:95
oops::CostJbTotal
Control variable increment.
Definition: ControlIncrement.h:44
oops::ObsAuxIncrements
Definition: ObsAuxIncrements.h:29
oops::ModelAuxIncrement
Definition: oops/interface/ModelAuxIncrement.h:39
oops::ControlIncrement::Increment_
Increment< MODEL > Increment_
Definition: ControlIncrement.h:55
oops::ControlIncrement::print
void print(std::ostream &) const override
Definition: ControlIncrement.h:217
oops::ControlIncrement::JbTotal_
CostJbTotal< MODEL, OBS > JbTotal_
Definition: ControlIncrement.h:53
oops::ControlIncrement::state
const Increment_ & state() const
Definition: ControlIncrement.h:87
oops::ControlIncrement::deserialize
void deserialize(const std::vector< double > &, size_t &) override
Definition: ControlIncrement.h:258
oops::ControlIncrement::~ControlIncrement
~ControlIncrement()
Definition: ControlIncrement.h:154
oops::ControlIncrement::shift_backward
void shift_backward()
Definition: ControlIncrement.h:284
oops::ControlIncrement::geometry
Geometry_ geometry() const
Get geometry.
Definition: ControlIncrement.h:83
oops::Increment
Increment Class: Difference between two states.
Definition: CostJbState.h:27
oops::ControlIncrement::operator-=
ControlIncrement & operator-=(const ControlIncrement &)
Definition: ControlIncrement.h:173
oops::ControlIncrement::ControlIncrement
ControlIncrement(const JbTotal_ &)
Constructor, destructor.
Definition: ControlIncrement.h:118
oops::ControlIncrement::operator+=
ControlIncrement & operator+=(const ControlIncrement &)
Definition: ControlIncrement.h:165
oops::ControlIncrement::axpy
void axpy(const double, const ControlIncrement &)
Definition: ControlIncrement.h:196
oops::ControlIncrement::serialize
void serialize(std::vector< double > &) const override
Definition: ControlIncrement.h:242
Geometry.h
Increment.h