OOPS
oops/base/Departures.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_DEPARTURES_H_
12 #define OOPS_BASE_DEPARTURES_H_
13 
14 #include <Eigen/Dense>
15 #include <cstddef>
16 #include <iostream>
17 #include <string>
18 #include <vector>
19 
21 #include "oops/base/ObsSpaces.h"
22 #include "oops/base/QCData.h"
24 #include "oops/util/dot_product.h"
25 #include "oops/util/Logger.h"
26 #include "oops/util/Printable.h"
27 
28 namespace oops {
29 
30 template<typename OBS> class Observations;
31 
32 /// Difference between two observation vectors.
33 /*!
34  * A departure is the difference between two observations.
35  * The archetypal example is \f$ \mathbf{y} - {\cal H}(\mathbf{x}) \f$.
36  *
37  * Keeping an observation space vector here is necessary for the implementation
38  * of generic observation error covariance matrices.
39  */
40 
41 // -----------------------------------------------------------------------------
42 template <typename OBS>
43 class Departures : public util::Printable,
44  public GeneralizedDepartures {
48 
49  public:
50 /// \brief create Departures for all obs (read from ObsSpace if name is specified)
51  Departures(const ObsSpaces_ &,
52  const std::string & name = "", const bool failIfNameNotFound = true);
53 /// \brief create local Departures
54  Departures(const ObsSpaces_ &, const Departures &);
55 
56 /// Access
57  size_t size() const {return dep_.size();}
58  ObsVector_ & operator[](const size_t ii) {return dep_.at(ii);}
59  const ObsVector_ & operator[](const size_t ii) const {return dep_.at(ii);}
60 
61 // Linear algebra operators
62  Departures & operator+=(const Departures &);
63  Departures & operator-=(const Departures &);
64  Departures & operator*=(const double &);
65  Departures & operator*=(const Departures &);
66  Departures & operator/=(const Departures &);
67  void zero();
68  void random();
69  void invert();
70  void axpy(const double &, const Departures &);
71  double dot_product_with(const Departures &) const;
72  double rms() const;
73 /// Return number of departures (excluding departures that are masked out)
74  size_t nobs() const;
75 
76 /// Mask out departures where the passed in qc flags are > 0
77  void mask(const QCData_ &);
78 
79 /// Pack departures in an Eigen vector (excluding departures that are masked out)
80  Eigen::VectorXd packEigen() const;
81 
82 /// Save departures values
83  void save(const std::string &) const;
84 
85  private:
86  void print(std::ostream &) const;
87 
88 /// Data
89  std::vector<ObsVector_> dep_;
90 };
91 
92 // =============================================================================
93 
94 template<typename OBS>
96  const std::string & name, const bool fail): dep_()
97 {
98  dep_.reserve(obsdb.size());
99  for (size_t jj = 0; jj < obsdb.size(); ++jj) {
100  dep_.emplace_back(obsdb[jj], name, fail);
101  }
102  Log::trace() << "Departures created" << std::endl;
103 }
104 // -----------------------------------------------------------------------------
105 template<typename OBS>
107  const Departures & other): dep_() {
108  dep_.reserve(obsdb.size());
109  for (size_t jj = 0; jj < other.dep_.size(); ++jj) {
110  dep_.emplace_back(obsdb[jj], other[jj]);
111  }
112  Log::trace() << "Local Departures created" << std::endl;
113 }
114 // -----------------------------------------------------------------------------
115 template<typename OBS>
117  for (size_t jj = 0; jj < dep_.size(); ++jj) {
118  dep_[jj] += rhs[jj];
119  }
120  return *this;
121 }
122 // -----------------------------------------------------------------------------
123 template<typename OBS>
125  for (size_t jj = 0; jj < dep_.size(); ++jj) {
126  dep_[jj] -= rhs[jj];
127  }
128  return *this;
129 }
130 // -----------------------------------------------------------------------------
131 template<typename OBS>
133  for (size_t jj = 0; jj < dep_.size(); ++jj) {
134  dep_[jj] *= zz;
135  }
136  return *this;
137 }
138 // -----------------------------------------------------------------------------
139 template<typename OBS>
141  for (size_t jj = 0; jj < dep_.size(); ++jj) {
142  dep_[jj] *= rhs[jj];
143  }
144  return *this;
145 }
146 // -----------------------------------------------------------------------------
147 template<typename OBS>
149  for (size_t jj = 0; jj < dep_.size(); ++jj) {
150  dep_[jj] /= rhs[jj];
151  }
152  return *this;
153 }
154 // -----------------------------------------------------------------------------
155 template<typename OBS>
157  for (size_t jj = 0; jj < dep_.size(); ++jj) {
158  dep_[jj].zero();
159  }
160 }
161 // -----------------------------------------------------------------------------
162 template<typename OBS>
164  for (size_t jj = 0; jj < dep_.size(); ++jj) {
165  dep_[jj].random();
166  }
167 }
168 // -----------------------------------------------------------------------------
169 template<typename OBS>
171  for (size_t jj = 0; jj < dep_.size(); ++jj) {
172  dep_[jj].invert();
173  }
174 }
175 // -----------------------------------------------------------------------------
176 template<typename OBS>
177 void Departures<OBS>::axpy(const double & zz, const Departures & rhs) {
178  for (size_t jj = 0; jj < dep_.size(); ++jj) {
179  dep_[jj].axpy(zz, rhs[jj]);
180  }
181 }
182 // -----------------------------------------------------------------------------
183 template<typename OBS>
184 double Departures<OBS>::dot_product_with(const Departures & other) const {
185  double zz = 0.0;
186  for (size_t jj = 0; jj < dep_.size(); ++jj) {
187  zz += dot_product(dep_[jj], other[jj]);
188  }
189  return zz;
190 }
191 // -----------------------------------------------------------------------------
192 template<typename OBS>
193 double Departures<OBS>::rms() const {
194  return sqrt(dot_product_with(*this) / this->nobs());
195 }
196 // -----------------------------------------------------------------------------
197 template<typename OBS>
198 size_t Departures<OBS>::nobs() const {
199  size_t nobs = 0;
200  for (size_t jj = 0; jj < dep_.size(); ++jj) {
201  nobs += dep_[jj].nobs();
202  }
203  return nobs;
204 }
205 // -----------------------------------------------------------------------------
206 template<typename OBS>
207 void Departures<OBS>::mask(const QCData_ & qc) {
208  for (size_t ii = 0; ii < dep_.size(); ++ii) {
209  dep_[ii].mask(*qc.qcFlags(ii));
210  }
211 }
212 // -----------------------------------------------------------------------------
213 template <typename OBS>
214 Eigen::VectorXd Departures<OBS>::packEigen() const {
215  Eigen::VectorXd vec(nobs());
216  size_t ii = 0;
217  for (size_t idep = 0; idep < dep_.size(); ++idep) {
218  vec.segment(ii, dep_[idep].nobs()) = dep_[idep].packEigen();
219  ii += dep_[idep].nobs();
220  }
221  ASSERT(ii == nobs());
222  return vec;
223 }
224 // -----------------------------------------------------------------------------
225 template <typename OBS>
226 void Departures<OBS>::save(const std::string & name) const {
227  for (size_t jj = 0; jj < dep_.size(); ++jj) {
228  dep_[jj].save(name);
229  }
230 }
231 // -----------------------------------------------------------------------------
232 template <typename OBS>
233 void Departures<OBS>::print(std::ostream & os) const {
234  for (size_t jj = 0; jj < dep_.size(); ++jj) {
235  os << dep_[jj] << std::endl;
236  }
237 }
238 // -----------------------------------------------------------------------------
239 } // namespace oops
240 
241 #endif // OOPS_BASE_DEPARTURES_H_
oops::Departures::dep_
std::vector< ObsVector_ > dep_
Data.
Definition: oops/base/Departures.h:89
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::GeneralizedDepartures
Abstract base class for quantities.
Definition: GeneralizedDepartures.h:22
oops::QCData
container for QC-related things (flags & obserrors)
Definition: QCData.h:24
oops::Departures::operator-=
Departures & operator-=(const Departures &)
Definition: oops/base/Departures.h:124
oops::Departures::mask
void mask(const QCData_ &)
Mask out departures where the passed in qc flags are > 0.
Definition: oops/base/Departures.h:207
oops::Departures::operator*=
Departures & operator*=(const double &)
Definition: oops/base/Departures.h:132
oops::Departures::operator[]
ObsVector_ & operator[](const size_t ii)
Definition: oops/base/Departures.h:58
QCData.h
ObsSpaces.h
oops::Departures::dot_product_with
double dot_product_with(const Departures &) const
Definition: oops/base/Departures.h:184
oops::Departures::operator+=
Departures & operator+=(const Departures &)
Definition: oops/base/Departures.h:116
oops::Departures::save
void save(const std::string &) const
Save departures values.
Definition: oops/base/Departures.h:226
oops::Departures::ObsSpaces_
ObsSpaces< OBS > ObsSpaces_
Definition: oops/base/Departures.h:45
oops::ObsVector
Definition: oops/interface/ObsSpace.h:36
oops::Departures::operator[]
const ObsVector_ & operator[](const size_t ii) const
Definition: oops/base/Departures.h:59
oops::ObsSpaces::size
std::size_t size() const
Access.
Definition: ObsSpaces.h:57
oops::Departures::print
void print(std::ostream &) const
Definition: oops/base/Departures.h:233
oops::Departures::packEigen
Eigen::VectorXd packEigen() const
Pack departures in an Eigen vector (excluding departures that are masked out)
Definition: oops/base/Departures.h:214
oops::Departures
Difference between two observation vectors.
Definition: oops/base/Departures.h:44
oops::Departures::size
size_t size() const
Access.
Definition: oops/base/Departures.h:57
oops::Departures::ObsVector_
ObsVector< OBS > ObsVector_
Definition: oops/base/Departures.h:46
oops::Departures::zero
void zero()
Definition: oops/base/Departures.h:156
oops::Departures::operator/=
Departures & operator/=(const Departures &)
Definition: oops/base/Departures.h:148
oops::Departures::invert
void invert()
Definition: oops/base/Departures.h:170
oops::Departures::nobs
size_t nobs() const
Return number of departures (excluding departures that are masked out)
Definition: oops/base/Departures.h:198
oops::Departures::rms
double rms() const
Definition: oops/base/Departures.h:193
oops::Observations
Observations Class.
Definition: oops/base/Departures.h:30
GeneralizedDepartures.h
oops::Departures::Departures
Departures(const ObsSpaces_ &, const std::string &name="", const bool failIfNameNotFound=true)
create Departures for all obs (read from ObsSpace if name is specified)
Definition: oops/base/Departures.h:95
ObsVector.h
oops::ObsSpaces
Definition: ObsSpaces.h:41
oops::Departures::random
void random()
Definition: oops/base/Departures.h:163
oops::Departures::axpy
void axpy(const double &, const Departures &)
Definition: oops/base/Departures.h:177
oops::Departures::QCData_
QCData< OBS > QCData_
Definition: oops/base/Departures.h:47
oops::QCData::qcFlags
const ObsDataPtr_< int > qcFlags(const size_t ii) const
accessor to QC flag
Definition: QCData.h:35