IODA Bundle
ObsAuxCovariances.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_OBSAUXCOVARIANCES_H_
9 #define OOPS_BASE_OBSAUXCOVARIANCES_H_
10 
11 #include <iostream>
12 #include <memory>
13 #include <string>
14 #include <vector>
15 
16 #include <boost/noncopyable.hpp>
17 
18 #include "eckit/config/Configuration.h"
21 #include "oops/base/ObsSpaces.h"
23 #include "oops/util/Logger.h"
24 #include "oops/util/Printable.h"
25 
26 namespace oops {
27 
28 // -----------------------------------------------------------------------------
29 
30 template <typename OBS>
31 class ObsAuxCovariances : public util::Printable,
32  private boost::noncopyable {
37 
38  public:
39  static const std::string classname() {return "oops::ObsAuxCovariances";}
40 
41  ObsAuxCovariances(const ObsSpaces_ &, const eckit::Configuration &);
43 
44 /// Operators
45  void linearize(const ObsAuxControls_ &, const eckit::Configuration &);
46  void multiply(const ObsAuxIncrements_ &, ObsAuxIncrements_ &) const;
48  void randomize(ObsAuxIncrements_ &) const;
49 
50  const eckit::LocalConfiguration & config() const {return conf_;}
51  const ObsSpaces_ & obspaces() const {return odb_;}
52 
53  private:
54  void print(std::ostream &) const;
55  std::vector<std::unique_ptr<ObsAuxCovariance_> > cov_;
56  const ObsSpaces_ & odb_;
57  const eckit::LocalConfiguration conf_;
58 };
59 
60 // =============================================================================
61 
62 template<typename OBS>
64  const eckit::Configuration & conf)
65  : cov_(0), odb_(odb), conf_(conf)
66 {
67  Log::trace() << "ObsAuxCovariances<OBS>::ObsAuxCovariances starting" << std::endl;
68  std::vector<eckit::LocalConfiguration> obsconf = conf.getSubConfigurations();
69  for (std::size_t jobs = 0; jobs < obsconf.size(); ++jobs) {
70  eckit::LocalConfiguration obsauxconf = obsconf[jobs].getSubConfiguration("obs bias");
71  typename ObsAuxCovariance_::Parameters_ obsauxparams;
72  obsauxparams.validateAndDeserialize(obsauxconf);
73  cov_.push_back(
74  std::unique_ptr<ObsAuxCovariance_>(new ObsAuxCovariance_(odb[jobs], obsauxparams)));
75  }
76  Log::trace() << "ObsAuxCovariances<OBS>::ObsAuxCovariances done" << std::endl;
77 }
78 
79 // -----------------------------------------------------------------------------
80 
81 template<typename OBS>
83  Log::trace() << "ObsAuxCovariances<OBS>::~ObsAuxCovariances starting" << std::endl;
84  for (std::size_t jobs = 0; jobs < cov_.size(); ++jobs) {
85  cov_[jobs].reset();
86  }
87  Log::trace() << "ObsAuxCovariances<OBS>::~ObsAuxCovariances done" << std::endl;
88 }
89 
90 // -----------------------------------------------------------------------------
91 
92 template<typename OBS>
94  const eckit::Configuration & innerConf) {
95  Log::trace() << "ObsAuxCovariances<OBS>::linearize starting" << std::endl;
96  ASSERT(cov_.size() == xx.size());
97  for (std::size_t jobs = 0; jobs < xx.size(); ++jobs) {
98  cov_[jobs]->linearize(xx[jobs], innerConf);
99  }
100  Log::trace() << "ObsAuxCovariances<OBS>::linearize done" << std::endl;
101 }
102 
103 // -----------------------------------------------------------------------------
104 
105 template<typename OBS>
107  ObsAuxIncrements_ & dx2) const {
108  Log::trace() << "ObsAuxCovariances<OBS>::multiply starting" << std::endl;
109  ASSERT(dx1.size() == dx2.size() && cov_.size() == dx1.size());
110  for (std::size_t jobs = 0; jobs < dx1.size(); ++jobs) {
111  cov_[jobs]->multiply(dx1[jobs], dx2[jobs]);
112  }
113  Log::trace() << "ObsAuxCovariances<OBS>::multiply done" << std::endl;
114 }
115 
116 // -----------------------------------------------------------------------------
117 
118 template<typename OBS>
120  ObsAuxIncrements_ & dx2) const {
121  Log::trace() << "ObsAuxCovariances<OBS>::inverseMultiply starting" << std::endl;
122  ASSERT(dx1.size() == dx2.size() && cov_.size() == dx1.size());
123  for (std::size_t jobs = 0; jobs < dx1.size(); ++jobs) {
124  cov_[jobs]->inverseMultiply(dx1[jobs], dx2[jobs]);
125  }
126  Log::trace() << "ObsAuxCovariances<OBS>::inverseMultiply done" << std::endl;
127 }
128 
129 // -----------------------------------------------------------------------------
130 
131 template<typename OBS>
133  Log::trace() << "ObsAuxCovariances<OBS>::randomize starting" << std::endl;
134  ASSERT(cov_.size() == dx.size());
135  for (std::size_t jobs = 0; jobs < dx.size(); ++jobs) {
136  cov_[jobs]->randomize(dx[jobs]);
137  }
138  Log::trace() << "ObsAuxCovariances<OBS>::randomize done" << std::endl;
139 }
140 
141 // -----------------------------------------------------------------------------
142 
143 template<typename OBS>
144 void ObsAuxCovariances<OBS>::print(std::ostream & os) const {
145  Log::trace() << "ObsAuxCovariances<OBS>::print starting" << std::endl;
146  for (std::size_t jobs = 0; jobs < cov_.size(); ++jobs) os << *cov_.at(jobs) << " ";
147  Log::trace() << "ObsAuxCovariances<OBS>::print done" << std::endl;
148 }
149 
150 // -----------------------------------------------------------------------------
151 
152 } // namespace oops
153 
154 #endif // OOPS_BASE_OBSAUXCOVARIANCES_H_
std::size_t size() const
Access.
ObsAuxCovariance_::Parameters_ Parameters_
void multiply(const ObsAuxIncrements_ &, ObsAuxIncrements_ &) const
const eckit::LocalConfiguration & config() const
void print(std::ostream &) const
void linearize(const ObsAuxControls_ &, const eckit::Configuration &)
Operators.
void randomize(ObsAuxIncrements_ &) const
const eckit::LocalConfiguration conf_
ObsAuxCovariances(const ObsSpaces_ &, const eckit::Configuration &)
std::vector< std::unique_ptr< ObsAuxCovariance_ > > cov_
ObsSpaces< OBS > ObsSpaces_
const ObsSpaces_ & obspaces() const
ObsAuxIncrements< OBS > ObsAuxIncrements_
ObsAuxControls< OBS > ObsAuxControls_
const ObsSpaces_ & odb_
static const std::string classname()
void inverseMultiply(const ObsAuxIncrements_ &, ObsAuxIncrements_ &) const
ObsAuxCovariance< OBS > ObsAuxCovariance_
std::size_t size() const
Access.
The namespace for the main oops code.