OOPS
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;
69  conf.get("observations", obsconf);
70  for (std::size_t jobs = 0; jobs < obsconf.size(); ++jobs) {
71  cov_.push_back(
72  std::unique_ptr<ObsAuxCovariance_>(new ObsAuxCovariance_(odb[jobs], obsconf[jobs])));
73  }
74  Log::trace() << "ObsAuxCovariances<OBS>::ObsAuxCovariances done" << std::endl;
75 }
76 
77 // -----------------------------------------------------------------------------
78 
79 template<typename OBS>
81  Log::trace() << "ObsAuxCovariances<OBS>::~ObsAuxCovariances starting" << std::endl;
82  for (std::size_t jobs = 0; jobs < cov_.size(); ++jobs) {
83  cov_[jobs].reset();
84  }
85  Log::trace() << "ObsAuxCovariances<OBS>::~ObsAuxCovariances done" << std::endl;
86 }
87 
88 // -----------------------------------------------------------------------------
89 
90 template<typename OBS>
92  const eckit::Configuration & innerConf) {
93  Log::trace() << "ObsAuxCovariances<OBS>::linearize starting" << std::endl;
94  ASSERT(cov_.size() == xx.size());
95  for (std::size_t jobs = 0; jobs < xx.size(); ++jobs) {
96  cov_[jobs]->linearize(xx[jobs], innerConf);
97  }
98  Log::trace() << "ObsAuxCovariances<OBS>::linearize done" << std::endl;
99 }
100 
101 // -----------------------------------------------------------------------------
102 
103 template<typename OBS>
105  ObsAuxIncrements_ & dx2) const {
106  Log::trace() << "ObsAuxCovariances<OBS>::multiply starting" << std::endl;
107  ASSERT(dx1.size() == dx2.size() && cov_.size() == dx1.size());
108  for (std::size_t jobs = 0; jobs < dx1.size(); ++jobs) {
109  cov_[jobs]->multiply(dx1[jobs], dx2[jobs]);
110  }
111  Log::trace() << "ObsAuxCovariances<OBS>::multiply done" << std::endl;
112 }
113 
114 // -----------------------------------------------------------------------------
115 
116 template<typename OBS>
118  ObsAuxIncrements_ & dx2) const {
119  Log::trace() << "ObsAuxCovariances<OBS>::inverseMultiply starting" << std::endl;
120  ASSERT(dx1.size() == dx2.size() && cov_.size() == dx1.size());
121  for (std::size_t jobs = 0; jobs < dx1.size(); ++jobs) {
122  cov_[jobs]->inverseMultiply(dx1[jobs], dx2[jobs]);
123  }
124  Log::trace() << "ObsAuxCovariances<OBS>::inverseMultiply done" << std::endl;
125 }
126 
127 // -----------------------------------------------------------------------------
128 
129 template<typename OBS>
131  Log::trace() << "ObsAuxCovariances<OBS>::randomize starting" << std::endl;
132  ASSERT(cov_.size() == dx.size());
133  for (std::size_t jobs = 0; jobs < dx.size(); ++jobs) {
134  cov_[jobs]->randomize(dx[jobs]);
135  }
136  Log::trace() << "ObsAuxCovariances<OBS>::randomize done" << std::endl;
137 }
138 
139 // -----------------------------------------------------------------------------
140 
141 template<typename OBS>
142 void ObsAuxCovariances<OBS>::print(std::ostream & os) const {
143  Log::trace() << "ObsAuxCovariances<OBS>::print starting" << std::endl;
144  for (std::size_t jobs = 0; jobs < cov_.size(); ++jobs) os << *cov_.at(jobs) << " ";
145  Log::trace() << "ObsAuxCovariances<OBS>::print done" << std::endl;
146 }
147 
148 // -----------------------------------------------------------------------------
149 
150 } // namespace oops
151 
152 #endif // OOPS_BASE_OBSAUXCOVARIANCES_H_
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ObsAuxCovariances::classname
static const std::string classname()
Definition: ObsAuxCovariances.h:39
oops::ObsAuxCovariances::obspaces
const ObsSpaces_ & obspaces() const
Definition: ObsAuxCovariances.h:51
ObsAuxCovariance.h
oops::ObsAuxCovariances::inverseMultiply
void inverseMultiply(const ObsAuxIncrements_ &, ObsAuxIncrements_ &) const
Definition: ObsAuxCovariances.h:117
oops::ObsAuxControls
Definition: ObsAuxControls.h:26
oops::ObsAuxCovariances::config
const eckit::LocalConfiguration & config() const
Definition: ObsAuxCovariances.h:50
ObsSpaces.h
oops::ObsAuxCovariances::ObsAuxIncrements_
ObsAuxIncrements< OBS > ObsAuxIncrements_
Definition: ObsAuxCovariances.h:35
oops::ObsAuxIncrements::size
std::size_t size() const
Access.
Definition: ObsAuxIncrements.h:44
oops::ObsAuxCovariances::odb_
const ObsSpaces_ & odb_
Definition: ObsAuxCovariances.h:56
oops::ObsAuxCovariances::ObsAuxCovariance_
ObsAuxCovariance< OBS > ObsAuxCovariance_
Definition: ObsAuxCovariances.h:33
ObsAuxControls.h
oops::ObsAuxCovariance
Definition: oops/interface/ObsAuxCovariance.h:36
oops::ObsAuxCovariances::conf_
const eckit::LocalConfiguration conf_
Definition: ObsAuxCovariances.h:57
oops::ObsAuxCovariances::multiply
void multiply(const ObsAuxIncrements_ &, ObsAuxIncrements_ &) const
Definition: ObsAuxCovariances.h:104
oops::ObsAuxCovariances::~ObsAuxCovariances
~ObsAuxCovariances()
Definition: ObsAuxCovariances.h:80
oops::ObsAuxCovariances::ObsAuxCovariances
ObsAuxCovariances(const ObsSpaces_ &, const eckit::Configuration &)
Definition: ObsAuxCovariances.h:63
oops::ObsAuxCovariances::cov_
std::vector< std::unique_ptr< ObsAuxCovariance_ > > cov_
Definition: ObsAuxCovariances.h:55
ObsAuxIncrements.h
oops::ObsAuxCovariances::print
void print(std::ostream &) const
Definition: ObsAuxCovariances.h:142
oops::ObsAuxCovariances::ObsAuxControls_
ObsAuxControls< OBS > ObsAuxControls_
Definition: ObsAuxCovariances.h:34
oops::ObsAuxControls::size
std::size_t size() const
Access.
Definition: ObsAuxControls.h:38
oops::ObsAuxCovariances::linearize
void linearize(const ObsAuxControls_ &, const eckit::Configuration &)
Operators.
Definition: ObsAuxCovariances.h:91
oops::ObsAuxCovariances::ObsSpaces_
ObsSpaces< OBS > ObsSpaces_
Definition: ObsAuxCovariances.h:36
oops::ObsAuxIncrements
Definition: ObsAuxIncrements.h:29
oops::ObsSpaces
Definition: ObsSpaces.h:41
oops::ObsAuxCovariances::randomize
void randomize(ObsAuxIncrements_ &) const
Definition: ObsAuxCovariances.h:130
oops::ObsAuxCovariances
Definition: ObsAuxCovariances.h:32