OOPS
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/Printable.h"
21 #include "oops/util/Serializable.h"
22 
23 namespace oops {
24 
25 // -----------------------------------------------------------------------------
26 
27 template <typename OBS>
28 class ObsAuxIncrements : public util::Printable,
29  public util::Serializable {
33 
34  public:
35  static const std::string classname() {return "oops::ObsAuxIncrements";}
36 
37 /// Constructor, destructor
38  ObsAuxIncrements(const ObsSpaces_ &, const eckit::Configuration &);
39  ObsAuxIncrements(const ObsAuxIncrements &, const bool copy = true);
40  ObsAuxIncrements(const ObsAuxIncrements &, const eckit::Configuration &);
42 
43 /// Access
44  std::size_t size() const {return auxs_.size();}
45  const ObsAuxIncrement_ & operator[](const std::size_t ii) const {return *auxs_.at(ii);}
46  ObsAuxIncrement_ & operator[](const std::size_t ii) {return *auxs_.at(ii);}
47 
48 /// Linear algebra operators
49  void diff(const ObsAuxControls_ &, const ObsAuxControls_ &);
50  void zero();
54  ObsAuxIncrements & operator*=(const double &);
55  void axpy(const double &, const ObsAuxIncrements &);
56  double dot_product_with(const ObsAuxIncrements &) const;
57 
58 /// I/O and diagnostics
59  void read(const eckit::Configuration &);
60  void write(const eckit::Configuration &) const;
61  double norm() const;
62 
63 /// Serialize-Deserialize
64  size_t serialSize() const override;
65  void serialize(std::vector<double> &) const override;
66  void deserialize(const std::vector<double> &, size_t &) override;
67 
68  private:
69  void print(std::ostream &) const override;
70  std::vector<std::unique_ptr<ObsAuxIncrement_> > auxs_;
71 };
72 
73 // -----------------------------------------------------------------------------
74 
75 template <typename OBS>
77  Log::trace() << "operator+=(ObsAuxControls, ObsAuxIncrements) starting" << std::endl;
78  ASSERT(xx.size() == dx.size());
79  for (std::size_t jobs = 0; jobs < xx.size(); ++jobs) {
80  xx[jobs].obsauxcontrol() += dx[jobs].obsauxincrement();
81  }
82  Log::trace() << "operator+=(ObsAuxControls, ObsAuxIncrements) done" << std::endl;
83  return xx;
84 }
85 
86 // =============================================================================
87 
88 template<typename OBS>
89 ObsAuxIncrements<OBS>::ObsAuxIncrements(const ObsSpaces_ & odb, const eckit::Configuration & conf)
90  : auxs_(0)
91 {
92  std::vector<eckit::LocalConfiguration> obsconf;
93  conf.get("observations", obsconf);
94  for (std::size_t jobs = 0; jobs < obsconf.size(); ++jobs) {
95  auxs_.push_back(
96  std::unique_ptr<ObsAuxIncrement_>(new ObsAuxIncrement_(odb[jobs], obsconf[jobs])));
97  }
98 }
99 // -----------------------------------------------------------------------------
100 template<typename OBS>
102  : auxs_(other.size())
103 {
104  Log::trace() << "ObsAuxIncrements<OBS>::ObsAuxIncrements copy starting" << std::endl;
105  ASSERT(size() == other.size());
106  for (std::size_t jobs = 0; jobs < other.size(); ++jobs) {
107  auxs_[jobs].reset(new ObsAuxIncrement_(other[jobs], copy));
108  }
109  Log::trace() << "ObsAuxIncrements<OBS>::ObsAuxIncrements copy done" << std::endl;
110 }
111 // -----------------------------------------------------------------------------
112 template<typename OBS>
114  const eckit::Configuration & conf) : auxs_(other.size())
115 {
116  Log::trace() << "ObsAuxIncrements<OBS>::ObsAuxIncrements interpolated starting" << std::endl;
117  std::vector<eckit::LocalConfiguration> obsconf;
118  ASSERT(size() == other.size());
119  for (std::size_t jobs = 0; jobs < other.size(); ++jobs) {
120  auxs_[jobs].reset(new ObsAuxIncrement_(other[jobs]));
121  }
122  Log::trace() << "ObsAuxIncrements<OBS>::ObsAuxIncrements interpolated done" << std::endl;
123 }
124 // -----------------------------------------------------------------------------
125 template<typename OBS>
127  Log::trace() << "ObsAuxIncrements<OBS>::~ObsAuxIncrements starting" << std::endl;
128  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs].reset();
129  Log::trace() << "ObsAuxIncrements<OBS>::~ObsAuxIncrements done" << std::endl;
130 }
131 // -----------------------------------------------------------------------------
132 template<typename OBS>
134  Log::trace() << "ObsAuxIncrements<OBS>::diff starting" << std::endl;
135  ASSERT(x1.size() == x2.size() && size() == x2.size());
136  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
137  auxs_[jobs]->diff(x1[jobs], x2[jobs]);
138  }
139  Log::trace() << "ObsAuxIncrements<OBS>::diff done" << std::endl;
140 }
141 // -----------------------------------------------------------------------------
142 template<typename OBS>
144  Log::trace() << "ObsAuxIncrements<OBS>::zero starting" << std::endl;
145  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
146  auxs_[jobs]->zero();
147  }
148  Log::trace() << "ObsAuxIncrements<OBS>::zero done" << std::endl;
149 }
150 // -----------------------------------------------------------------------------
151 template<typename OBS>
153  Log::trace() << "ObsAuxIncrements<OBS>::operator= starting" << std::endl;
154  ASSERT(size() == rhs.size());
155  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
156  *auxs_[jobs] = rhs[jobs];
157  }
158  Log::trace() << "ObsAuxIncrements<OBS>::operator= done" << std::endl;
159  return *this;
160 }
161 // -----------------------------------------------------------------------------
162 template<typename OBS>
164  Log::trace() << "ObsAuxIncrements<OBS>::operator+= starting" << std::endl;
165  ASSERT(size() == rhs.size());
166  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
167  *auxs_[jobs] += rhs[jobs];
168  }
169  Log::trace() << "ObsAuxIncrements<OBS>::operator+= done" << std::endl;
170  return *this;
171 }
172 // -----------------------------------------------------------------------------
173 template<typename OBS>
175  Log::trace() << "ObsAuxIncrements<OBS>::operator-= starting" << std::endl;
176  ASSERT(size() == rhs.size());
177  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
178  *auxs_[jobs] -= rhs[jobs];
179  }
180  Log::trace() << "ObsAuxIncrements<OBS>::operator-= done" << std::endl;
181  return *this;
182 }
183 // -----------------------------------------------------------------------------
184 template<typename OBS>
186  Log::trace() << "ObsAuxIncrements<OBS>::operator*= starting" << std::endl;
187  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
188  *auxs_[jobs] *= zz;
189  }
190  Log::trace() << "ObsAuxIncrements<OBS>::operator*= done" << std::endl;
191  return *this;
192 }
193 // -----------------------------------------------------------------------------
194 template<typename OBS>
195 void ObsAuxIncrements<OBS>::axpy(const double & zz, const ObsAuxIncrements & dx) {
196  Log::trace() << "ObsAuxIncrements<OBS>::axpy starting" << std::endl;
197  ASSERT(size() == dx.size());
198  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
199  auxs_[jobs]->axpy(zz, dx[jobs]);
200  }
201  Log::trace() << "ObsAuxIncrements<OBS>::axpy done" << std::endl;
202 }
203 // -----------------------------------------------------------------------------
204 template<typename OBS>
206  Log::trace() << "ObsAuxIncrements<OBS>::dot_product_with starting" << std::endl;
207  ASSERT(size() == dx.size());
208  double zz = static_cast<double>(0.0);
209  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
210  zz += auxs_[jobs]->dot_product_with(dx[jobs]);
211  }
212  Log::trace() << "ObsAuxIncrements<OBS>::dot_product_with done" << std::endl;
213  return zz;
214 }
215 // -----------------------------------------------------------------------------
216 template<typename OBS>
217 void ObsAuxIncrements<OBS>::read(const eckit::Configuration & conf) {
218  Log::trace() << "ObsAuxIncrements<OBS>::read starting" << std::endl;
219  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->read(conf);
220  Log::trace() << "ObsAuxIncrements<OBS>::read done" << std::endl;
221 }
222 // -----------------------------------------------------------------------------
223 template<typename OBS>
224 void ObsAuxIncrements<OBS>::write(const eckit::Configuration & conf) const {
225  Log::trace() << "ObsAuxIncrements<OBS>::write starting" << std::endl;
226  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->write(conf);
227  Log::trace() << "ObsAuxIncrements<OBS>::write done" << std::endl;
228 }
229 // -----------------------------------------------------------------------------
230 template<typename OBS>
232  Log::trace() << "ObsAuxIncrements<OBS>::norm starting" << std::endl;
233  double zz = static_cast<double>(0.0);
234  for (std::size_t jobs = 0; jobs < size(); ++jobs) {
235  zz += auxs_[jobs]->norm();
236  }
237  Log::trace() << "ObsAuxIncrements<OBS>::norm done" << std::endl;
238  return zz;
239 }
240 // -----------------------------------------------------------------------------
241 template<typename OBS>
243  Log::trace() << "ObsAuxIncrements<OBS>::serialSize starting" << std::endl;
244  size_t ss = 0;
245  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
246  ss += auxs_[jobs]->serialSize();
247  }
248  Log::trace() << "ObsAuxIncrements<OBS>::serialSize done" << std::endl;
249  return ss;
250 }
251 // -----------------------------------------------------------------------------
252 template<typename OBS>
253 void ObsAuxIncrements<OBS>::serialize(std::vector<double> & vect) const {
254  Log::trace() << "ObsAuxIncrements<OBS>::serialize starting" << std::endl;
255  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->serialize(vect);
256  Log::trace() << "ObsAuxIncrements<OBS>::serialize done" << std::endl;
257 }
258 // -----------------------------------------------------------------------------
259 template<typename OBS>
260 void ObsAuxIncrements<OBS>::deserialize(const std::vector<double> & vect, size_t & index) {
261  Log::trace() << "ObsAuxIncrements<OBS>::deserialize starting" << std::endl;
262  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
263  auxs_[jobs]->deserialize(vect, index);
264  }
265  Log::trace() << "ObsAuxIncrements<OBS>::deserialize done" << std::endl;
266 }
267 
268 // -----------------------------------------------------------------------------
269 template<typename OBS>
270 void ObsAuxIncrements<OBS>::print(std::ostream & os) const {
271  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) os << *auxs_[jobs];
272 }
273 // -----------------------------------------------------------------------------
274 
275 } // namespace oops
276 
277 #endif // OOPS_BASE_OBSAUXINCREMENTS_H_
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ObsAuxIncrements::classname
static const std::string classname()
Definition: ObsAuxIncrements.h:35
oops::operator+=
State4D< MODEL > & operator+=(State4D< MODEL > &xx, const Increment4D< MODEL > &dx)
Definition: Increment4D.h:126
ObsAuxIncrement.h
oops::ObsAuxIncrements::deserialize
void deserialize(const std::vector< double > &, size_t &) override
Definition: ObsAuxIncrements.h:260
oops::ObsAuxIncrements::serialSize
size_t serialSize() const override
Serialize-Deserialize.
Definition: ObsAuxIncrements.h:242
unstructured_interpolation_mod::write
subroutine write(self, filename_in)
Definition: unstructured_interpolation_mod.F90:363
oops::ObsAuxControls
Definition: ObsAuxControls.h:26
ObsSpaces.h
oops::ObsAuxIncrement
Definition: oops/interface/ObsAuxIncrement.h:38
oops::ObsAuxIncrements::ObsAuxIncrement_
ObsAuxIncrement< OBS > ObsAuxIncrement_
Definition: ObsAuxIncrements.h:30
oops::ObsAuxIncrements::operator=
ObsAuxIncrements & operator=(const ObsAuxIncrements &)
Definition: ObsAuxIncrements.h:152
oops::ObsAuxIncrements::operator[]
const ObsAuxIncrement_ & operator[](const std::size_t ii) const
Definition: ObsAuxIncrements.h:45
oops::ObsAuxIncrements::auxs_
std::vector< std::unique_ptr< ObsAuxIncrement_ > > auxs_
Definition: ObsAuxIncrements.h:70
oops::ObsAuxIncrements::dot_product_with
double dot_product_with(const ObsAuxIncrements &) const
Definition: ObsAuxIncrements.h:205
oops::ObsAuxIncrements::size
std::size_t size() const
Access.
Definition: ObsAuxIncrements.h:44
oops::ObsAuxIncrements::write
void write(const eckit::Configuration &) const
Definition: ObsAuxIncrements.h:224
oops::ObsAuxIncrements::diff
void diff(const ObsAuxControls_ &, const ObsAuxControls_ &)
Linear algebra operators.
Definition: ObsAuxIncrements.h:133
oops::ObsAuxIncrements::ObsAuxIncrements
ObsAuxIncrements(const ObsSpaces_ &, const eckit::Configuration &)
Constructor, destructor.
Definition: ObsAuxIncrements.h:89
ObsAuxControls.h
oops::ObsAuxIncrements::ObsAuxControls_
ObsAuxControls< OBS > ObsAuxControls_
Definition: ObsAuxIncrements.h:31
oops::ObsAuxIncrements::ObsSpaces_
ObsSpaces< OBS > ObsSpaces_
Definition: ObsAuxIncrements.h:32
oops::ObsAuxIncrements::operator-=
ObsAuxIncrements & operator-=(const ObsAuxIncrements &)
Definition: ObsAuxIncrements.h:174
oops::ObsAuxIncrements::operator*=
ObsAuxIncrements & operator*=(const double &)
Definition: ObsAuxIncrements.h:185
oops::ObsAuxIncrements::axpy
void axpy(const double &, const ObsAuxIncrements &)
Definition: ObsAuxIncrements.h:195
oops::ObsAuxIncrements::read
void read(const eckit::Configuration &)
I/O and diagnostics.
Definition: ObsAuxIncrements.h:217
oops::ObsAuxIncrements::~ObsAuxIncrements
~ObsAuxIncrements()
Definition: ObsAuxIncrements.h:126
oops::ObsAuxControls::size
std::size_t size() const
Access.
Definition: ObsAuxControls.h:38
oops::ObsAuxIncrements
Definition: ObsAuxIncrements.h:29
oops::ObsAuxIncrements::print
void print(std::ostream &) const override
Definition: ObsAuxIncrements.h:270
oops::ObsAuxIncrements::operator+=
ObsAuxIncrements & operator+=(const ObsAuxIncrements &)
Definition: ObsAuxIncrements.h:163
oops::ObsAuxIncrements::operator[]
ObsAuxIncrement_ & operator[](const std::size_t ii)
Definition: ObsAuxIncrements.h:46
oops::ObsSpaces
Definition: ObsSpaces.h:41
oops::ObsAuxIncrements::norm
double norm() const
Definition: ObsAuxIncrements.h:231
oops::ObsAuxIncrements::zero
void zero()
Definition: ObsAuxIncrements.h:143
oops::ObsAuxIncrements::serialize
void serialize(std::vector< double > &) const override
Definition: ObsAuxIncrements.h:253