OOPS
ObsErrors.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_OBSERRORS_H_
12 #define OOPS_BASE_OBSERRORS_H_
13 
14 #include <Eigen/Dense>
15 #include <memory>
16 #include <string>
17 #include <vector>
18 
19 #include <boost/noncopyable.hpp>
20 
21 #include "oops/base/Departures.h"
22 #include "oops/base/ObsErrorBase.h"
23 #include "oops/base/ObsSpaces.h"
24 #include "oops/util/Logger.h"
25 #include "oops/util/Printable.h"
26 
27 namespace oops {
28 
29 // -----------------------------------------------------------------------------
30 /// \biref Container for ObsErrors for all observation types that are used in DA
31 template <typename OBS>
32 class ObsErrors : public util::Printable,
33  private boost::noncopyable {
38 
39  public:
40  static const std::string classname() {return "oops::ObsErrors";}
41 
42  ObsErrors(const eckit::Configuration &, const ObsSpaces_ &);
43 
44 /// Accessor and size
45  size_t size() const {return err_.size();}
46  const ObsError_ & operator[](const size_t ii) const {return *err_.at(ii);}
47 
48 /// Multiply a Departure by \f$R\f$
49  void multiply(Departures_ &) const;
50 /// Multiply a Departure by \f$R^{-1}\f$
51  void inverseMultiply(Departures_ &) const;
52 
53 /// Generate random perturbation
54  void randomize(Departures_ &) const;
55 
56 /// Pack inverseVariance into an Eigen vector (excluding observations
57 /// that are masked out)
58  Eigen::VectorXd packInverseVarianceEigen() const;
59 
60  private:
61  void print(std::ostream &) const;
62  std::vector<std::unique_ptr<ObsError_> > err_;
63 };
64 
65 // -----------------------------------------------------------------------------
66 
67 template <typename OBS>
68 ObsErrors<OBS>::ObsErrors(const eckit::Configuration & config,
69  const ObsSpaces_ & os) : err_() {
70  std::vector<eckit::LocalConfiguration> obsconf;
71  config.get("observations", obsconf);
72  for (size_t jj = 0; jj < os.size(); ++jj) {
73  eckit::LocalConfiguration conf(obsconf[jj], "obs error");
74  err_.emplace_back(ObsErrorFactory<OBS>::create(conf, os[jj]));
75  }
76 }
77 
78 // -----------------------------------------------------------------------------
79 
80 template <typename OBS>
82  for (size_t jj = 0; jj < err_.size(); ++jj) {
83  err_[jj]->multiply(dy[jj]);
84  }
85 }
86 
87 // -----------------------------------------------------------------------------
88 
89 template <typename OBS>
91  for (size_t jj = 0; jj < err_.size(); ++jj) {
92  err_[jj]->inverseMultiply(dy[jj]);
93  }
94 }
95 
96 // -----------------------------------------------------------------------------
97 
98 template <typename OBS>
100  for (size_t jj = 0; jj < err_.size(); ++jj) {
101  err_[jj]->randomize(dy[jj]);
102  }
103 }
104 
105 // -----------------------------------------------------------------------------
106 
107 template <typename OBS>
109  // compute nobs accross all obs errors
110  unsigned int nobs = 0;
111  for (size_t iov = 0; iov < err_.size(); ++iov) {
112  const ObsVector_ & ov = err_[iov]->inverseVariance();
113  nobs += ov.nobs();
114  }
115 
116  // concatinate all inverseVariance into a 1d vector
117  Eigen::VectorXd vec(nobs);
118  unsigned int ii = 0;
119  for (size_t iov = 0; iov < err_.size(); ++iov) {
120  const ObsVector_ & ov = err_[iov]->inverseVariance();
121  vec.segment(ii, ov.nobs()) = ov.packEigen();
122  ii += ov.nobs();
123  }
124  ASSERT(ii == nobs);
125  return vec;
126 }
127 
128 // -----------------------------------------------------------------------------
129 
130 template<typename OBS>
131 void ObsErrors<OBS>::print(std::ostream & os) const {
132  for (size_t jj = 0; jj < err_.size(); ++jj) os << *err_[jj];
133 }
134 
135 // -----------------------------------------------------------------------------
136 
137 } // namespace oops
138 
139 #endif // OOPS_BASE_OBSERRORS_H_
oops::ObsErrorFactory
ObsErrorFactory Factory.
Definition: ObsErrorBase.h:59
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ObsErrors::ObsErrors
ObsErrors(const eckit::Configuration &, const ObsSpaces_ &)
Definition: ObsErrors.h:68
oops::ObsVector::nobs
unsigned int nobs() const
Definition: oops/interface/ObsVector.h:279
ObsSpaces.h
oops::ObsErrorBase
Base class for observation error covariance matrices.
Definition: ObsErrorBase.h:32
oops::ObsErrors
\biref Container for ObsErrors for all observation types that are used in DA
Definition: ObsErrors.h:33
oops::ObsVector
Definition: oops/interface/ObsSpace.h:36
Departures.h
oops::ObsErrors::ObsError_
ObsErrorBase< OBS > ObsError_
Definition: ObsErrors.h:35
oops::ObsSpaces::size
std::size_t size() const
Access.
Definition: ObsSpaces.h:57
oops::ObsErrors::classname
static const std::string classname()
Definition: ObsErrors.h:40
oops::Departures
Difference between two observation vectors.
Definition: oops/base/Departures.h:44
oops::ObsErrors::err_
std::vector< std::unique_ptr< ObsError_ > > err_
Definition: ObsErrors.h:62
oops::ObsErrors::size
size_t size() const
Accessor and size.
Definition: ObsErrors.h:45
oops::ObsErrors::Departures_
Departures< OBS > Departures_
Definition: ObsErrors.h:34
oops::ObsErrors::operator[]
const ObsError_ & operator[](const size_t ii) const
Definition: ObsErrors.h:46
oops::ObsErrors::multiply
void multiply(Departures_ &) const
Multiply a Departure by .
Definition: ObsErrors.h:81
oops::ObsErrors::print
void print(std::ostream &) const
Definition: ObsErrors.h:131
oops::ObsErrors::ObsVector_
ObsVector< OBS > ObsVector_
Definition: ObsErrors.h:37
oops::ObsSpaces
Definition: ObsSpaces.h:41
ObsErrorBase.h
oops::ObsVector::packEigen
Eigen::VectorXd packEigen() const
Pack into an Eigen vector (excluding vector elements that are masked out)
Definition: oops/interface/ObsVector.h:308
oops::ObsErrors::randomize
void randomize(Departures_ &) const
Generate random perturbation.
Definition: ObsErrors.h:99
oops::ObsErrors::packInverseVarianceEigen
Eigen::VectorXd packInverseVarianceEigen() const
Definition: ObsErrors.h:108
oops::ObsErrors::inverseMultiply
void inverseMultiply(Departures_ &) const
Multiply a Departure by .
Definition: ObsErrors.h:90
oops::ObsErrors::ObsSpaces_
ObsSpaces< OBS > ObsSpaces_
Definition: ObsErrors.h:36