8 #ifndef OOPS_BASE_OBSAUXCOVARIANCES_H_
9 #define OOPS_BASE_OBSAUXCOVARIANCES_H_
16 #include <boost/noncopyable.hpp>
18 #include "eckit/config/Configuration.h"
23 #include "oops/util/Logger.h"
24 #include "oops/util/Printable.h"
30 template <
typename OBS>
32 private boost::noncopyable {
39 static const std::string
classname() {
return "oops::ObsAuxCovariances";}
50 const eckit::LocalConfiguration &
config()
const {
return conf_;}
54 void print(std::ostream &)
const;
55 std::vector<std::unique_ptr<ObsAuxCovariance_> >
cov_;
57 const eckit::LocalConfiguration
conf_;
62 template<
typename OBS>
64 const eckit::Configuration & conf)
65 : cov_(0), odb_(odb), conf_(conf)
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) {
72 std::unique_ptr<ObsAuxCovariance_>(
new ObsAuxCovariance_(odb[jobs], obsconf[jobs])));
74 Log::trace() <<
"ObsAuxCovariances<OBS>::ObsAuxCovariances done" << std::endl;
79 template<
typename OBS>
81 Log::trace() <<
"ObsAuxCovariances<OBS>::~ObsAuxCovariances starting" << std::endl;
82 for (std::size_t jobs = 0; jobs < cov_.size(); ++jobs) {
85 Log::trace() <<
"ObsAuxCovariances<OBS>::~ObsAuxCovariances done" << std::endl;
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);
98 Log::trace() <<
"ObsAuxCovariances<OBS>::linearize done" << std::endl;
103 template<
typename OBS>
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]);
111 Log::trace() <<
"ObsAuxCovariances<OBS>::multiply done" << std::endl;
116 template<
typename OBS>
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]);
124 Log::trace() <<
"ObsAuxCovariances<OBS>::inverseMultiply done" << std::endl;
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]);
136 Log::trace() <<
"ObsAuxCovariances<OBS>::randomize done" << std::endl;
141 template<
typename OBS>
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;
152 #endif // OOPS_BASE_OBSAUXCOVARIANCES_H_