IODA Bundle
ObsAuxIncrements.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2017-2019 UCAR
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  */
7 
8 #ifndef OOPS_BASE_OBSAUXINCREMENTS_H_
9 #define OOPS_BASE_OBSAUXINCREMENTS_H_
10 
11 #include <iostream>
12 #include <memory>
13 #include <string>
14 #include <vector>
15 
17 #include "oops/base/ObsSpaces.h"
19 #include "oops/util/Logger.h"
20 #include "oops/util/ObjectCounter.h"
21 #include "oops/util/Printable.h"
22 #include "oops/util/Serializable.h"
23 
24 namespace oops {
25 
26 // -----------------------------------------------------------------------------
27 
28 template <typename OBS>
29 class ObsAuxIncrements : public util::Printable,
30  public util::Serializable,
31  private util::ObjectCounter<ObsAuxIncrements<OBS> > {
35 
36  public:
37  static const std::string classname() {return "oops::ObsAuxIncrements";}
38 
39 /// Constructor, destructor
40  ObsAuxIncrements(const ObsSpaces_ &, const eckit::Configuration &);
41  ObsAuxIncrements(const ObsAuxIncrements &, const bool copy = true);
43 
44 /// Access
45  std::size_t size() const {return auxs_.size();}
46  const ObsAuxIncrement_ & operator[](const std::size_t ii) const {return *auxs_.at(ii);}
47  ObsAuxIncrement_ & operator[](const std::size_t ii) {return *auxs_.at(ii);}
48 
49 /// Linear algebra operators
50  void diff(const ObsAuxControls_ &, const ObsAuxControls_ &);
51  void zero();
55  ObsAuxIncrements & operator*=(const double &);
56  void axpy(const double &, const ObsAuxIncrements &);
57  double dot_product_with(const ObsAuxIncrements &) const;
58 
59 /// I/O and diagnostics
60  void read(const eckit::Configuration &);
61  void write(const eckit::Configuration &) const;
62  double norm() const;
63 
64 /// Serialize-Deserialize
65  size_t serialSize() const override;
66  void serialize(std::vector<double> &) const override;
67  void deserialize(const std::vector<double> &, size_t &) override;
68 
69  private:
70  void print(std::ostream &) const override;
71  std::vector<std::unique_ptr<ObsAuxIncrement_> > auxs_;
72 };
73 
74 // -----------------------------------------------------------------------------
75 
76 template <typename OBS>
78  Log::trace() << "operator+=(ObsAuxControls, ObsAuxIncrements) starting" << std::endl;
79  ASSERT(xx.size() == dx.size());
80  for (std::size_t jobs = 0; jobs < xx.size(); ++jobs) {
81  xx[jobs].obsauxcontrol() += dx[jobs].obsauxincrement();
82  }
83  Log::trace() << "operator+=(ObsAuxControls, ObsAuxIncrements) done" << std::endl;
84  return xx;
85 }
86 
87 // =============================================================================
88 
89 template<typename OBS>
90 ObsAuxIncrements<OBS>::ObsAuxIncrements(const ObsSpaces_ & odb, const eckit::Configuration & conf)
91  : auxs_(0)
92 {
93  Log::trace() << "ObsAuxIncrements<OBS>::ObsAuxIncrements starting" << std::endl;
94  size_t bytes = 0;
95  std::vector<eckit::LocalConfiguration> obsconf = conf.getSubConfigurations();
96  for (std::size_t jobs = 0; jobs < obsconf.size(); ++jobs) {
97  eckit::LocalConfiguration obsauxconf = obsconf[jobs].getSubConfiguration("obs bias");
98  typename ObsAuxIncrement_::Parameters_ obsauxparams;
99  obsauxparams.validateAndDeserialize(obsauxconf);
100  auxs_.push_back(
101  std::unique_ptr<ObsAuxIncrement_>(new ObsAuxIncrement_(odb[jobs], obsauxparams)));
102  bytes += auxs_[jobs]->serialSize();
103  }
104  this->setObjectSize(bytes*sizeof(double));
105  Log::trace() << "ObsAuxIncrements<OBS>::ObsAuxIncrements done" << std::endl;
106 }
107 // -----------------------------------------------------------------------------
108 template<typename OBS>
110  : auxs_(other.size())
111 {
112  Log::trace() << "ObsAuxIncrements<OBS>::ObsAuxIncrements copy starting" << std::endl;
113  size_t bytes = 0;
114  ASSERT(size() == other.size());
115  for (std::size_t jobs = 0; jobs < other.size(); ++jobs) {
116  auxs_[jobs].reset(new ObsAuxIncrement_(other[jobs], copy));
117  bytes += auxs_[jobs]->serialSize();
118  }
119  this->setObjectSize(bytes*sizeof(double));
120  Log::trace() << "ObsAuxIncrements<OBS>::ObsAuxIncrements copy done" << std::endl;
121 }
122 // -----------------------------------------------------------------------------
123 template<typename OBS>
125  Log::trace() << "ObsAuxIncrements<OBS>::~ObsAuxIncrements starting" << std::endl;
126  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs].reset();
127  Log::trace() << "ObsAuxIncrements<OBS>::~ObsAuxIncrements done" << std::endl;
128 }
129 // -----------------------------------------------------------------------------
130 template<typename OBS>
132  Log::trace() << "ObsAuxIncrements<OBS>::diff starting" << std::endl;
133  ASSERT(x1.size() == x2.size() && size() == x2.size());
134  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
135  auxs_[jobs]->diff(x1[jobs], x2[jobs]);
136  }
137  Log::trace() << "ObsAuxIncrements<OBS>::diff done" << std::endl;
138 }
139 // -----------------------------------------------------------------------------
140 template<typename OBS>
142  Log::trace() << "ObsAuxIncrements<OBS>::zero starting" << std::endl;
143  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
144  auxs_[jobs]->zero();
145  }
146  Log::trace() << "ObsAuxIncrements<OBS>::zero done" << std::endl;
147 }
148 // -----------------------------------------------------------------------------
149 template<typename OBS>
151  Log::trace() << "ObsAuxIncrements<OBS>::operator= starting" << std::endl;
152  ASSERT(size() == rhs.size());
153  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
154  *auxs_[jobs] = rhs[jobs];
155  }
156  Log::trace() << "ObsAuxIncrements<OBS>::operator= done" << std::endl;
157  return *this;
158 }
159 // -----------------------------------------------------------------------------
160 template<typename OBS>
162  Log::trace() << "ObsAuxIncrements<OBS>::operator+= starting" << std::endl;
163  ASSERT(size() == rhs.size());
164  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
165  *auxs_[jobs] += rhs[jobs];
166  }
167  Log::trace() << "ObsAuxIncrements<OBS>::operator+= done" << std::endl;
168  return *this;
169 }
170 // -----------------------------------------------------------------------------
171 template<typename OBS>
173  Log::trace() << "ObsAuxIncrements<OBS>::operator-= starting" << std::endl;
174  ASSERT(size() == rhs.size());
175  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
176  *auxs_[jobs] -= rhs[jobs];
177  }
178  Log::trace() << "ObsAuxIncrements<OBS>::operator-= done" << std::endl;
179  return *this;
180 }
181 // -----------------------------------------------------------------------------
182 template<typename OBS>
184  Log::trace() << "ObsAuxIncrements<OBS>::operator*= starting" << std::endl;
185  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
186  *auxs_[jobs] *= zz;
187  }
188  Log::trace() << "ObsAuxIncrements<OBS>::operator*= done" << std::endl;
189  return *this;
190 }
191 // -----------------------------------------------------------------------------
192 template<typename OBS>
193 void ObsAuxIncrements<OBS>::axpy(const double & zz, const ObsAuxIncrements & dx) {
194  Log::trace() << "ObsAuxIncrements<OBS>::axpy starting" << std::endl;
195  ASSERT(size() == dx.size());
196  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
197  auxs_[jobs]->axpy(zz, dx[jobs]);
198  }
199  Log::trace() << "ObsAuxIncrements<OBS>::axpy done" << std::endl;
200 }
201 // -----------------------------------------------------------------------------
202 template<typename OBS>
204  Log::trace() << "ObsAuxIncrements<OBS>::dot_product_with starting" << std::endl;
205  ASSERT(size() == dx.size());
206  double zz = static_cast<double>(0.0);
207  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
208  zz += auxs_[jobs]->dot_product_with(dx[jobs]);
209  }
210  Log::trace() << "ObsAuxIncrements<OBS>::dot_product_with done" << std::endl;
211  return zz;
212 }
213 // -----------------------------------------------------------------------------
214 template<typename OBS>
215 void ObsAuxIncrements<OBS>::read(const eckit::Configuration & conf) {
216  Log::trace() << "ObsAuxIncrements<OBS>::read starting" << std::endl;
217  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->read(conf);
218  Log::trace() << "ObsAuxIncrements<OBS>::read done" << std::endl;
219 }
220 // -----------------------------------------------------------------------------
221 template<typename OBS>
222 void ObsAuxIncrements<OBS>::write(const eckit::Configuration & conf) const {
223  Log::trace() << "ObsAuxIncrements<OBS>::write starting" << std::endl;
224  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->write(conf);
225  Log::trace() << "ObsAuxIncrements<OBS>::write done" << std::endl;
226 }
227 // -----------------------------------------------------------------------------
228 template<typename OBS>
230  Log::trace() << "ObsAuxIncrements<OBS>::norm starting" << std::endl;
231  double zz = static_cast<double>(0.0);
232  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
233  zz += auxs_[jobs]->norm();
234  }
235  Log::trace() << "ObsAuxIncrements<OBS>::norm done" << std::endl;
236  return zz;
237 }
238 // -----------------------------------------------------------------------------
239 template<typename OBS>
241  Log::trace() << "ObsAuxIncrements<OBS>::serialSize starting" << std::endl;
242  size_t ss = 0;
243  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
244  ss += auxs_[jobs]->serialSize();
245  }
246  Log::trace() << "ObsAuxIncrements<OBS>::serialSize done" << std::endl;
247  return ss;
248 }
249 // -----------------------------------------------------------------------------
250 template<typename OBS>
251 void ObsAuxIncrements<OBS>::serialize(std::vector<double> & vect) const {
252  Log::trace() << "ObsAuxIncrements<OBS>::serialize starting" << std::endl;
253  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->serialize(vect);
254  Log::trace() << "ObsAuxIncrements<OBS>::serialize done" << std::endl;
255 }
256 // -----------------------------------------------------------------------------
257 template<typename OBS>
258 void ObsAuxIncrements<OBS>::deserialize(const std::vector<double> & vect, size_t & index) {
259  Log::trace() << "ObsAuxIncrements<OBS>::deserialize starting" << std::endl;
260  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
261  auxs_[jobs]->deserialize(vect, index);
262  }
263  Log::trace() << "ObsAuxIncrements<OBS>::deserialize done" << std::endl;
264 }
265 
266 // -----------------------------------------------------------------------------
267 template<typename OBS>
268 void ObsAuxIncrements<OBS>::print(std::ostream & os) const {
269  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) os << *auxs_[jobs];
270 }
271 // -----------------------------------------------------------------------------
272 
273 } // namespace oops
274 
275 #endif // OOPS_BASE_OBSAUXINCREMENTS_H_
std::size_t size() const
Access.
ObsAuxIncrement_::Parameters_ Parameters_
void print(std::ostream &) const override
void deserialize(const std::vector< double > &, size_t &) override
size_t serialSize() const override
Serialize-Deserialize.
ObsAuxIncrements & operator*=(const double &)
ObsAuxControls< OBS > ObsAuxControls_
ObsAuxIncrement_ & operator[](const std::size_t ii)
ObsAuxIncrements(const ObsSpaces_ &, const eckit::Configuration &)
Constructor, destructor.
double dot_product_with(const ObsAuxIncrements &) const
ObsSpaces< OBS > ObsSpaces_
void write(const eckit::Configuration &) const
void serialize(std::vector< double > &) const override
static const std::string classname()
ObsAuxIncrements & operator+=(const ObsAuxIncrements &)
const ObsAuxIncrement_ & operator[](const std::size_t ii) const
ObsAuxIncrements & operator=(const ObsAuxIncrements &)
void read(const eckit::Configuration &)
I/O and diagnostics.
std::vector< std::unique_ptr< ObsAuxIncrement_ > > auxs_
ObsAuxIncrement< OBS > ObsAuxIncrement_
std::size_t size() const
Access.
void diff(const ObsAuxControls_ &, const ObsAuxControls_ &)
Linear algebra operators.
ObsAuxIncrements & operator-=(const ObsAuxIncrements &)
void axpy(const double &, const ObsAuxIncrements &)
IODA_DL void copy(const ObjectSelection &from, ObjectSelection &to, const ScaleMapping &scale_map)
Generic data copying function.
Definition: Copying.cpp:63
The namespace for the main oops code.
State< MODEL > & operator+=(State< MODEL > &xx, const Increment< MODEL > &dx)
Add on dx incrment to model state xx.