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 = conf.getSubConfigurations();
69 for (std::size_t jobs = 0; jobs < obsconf.size(); ++jobs) {
70 eckit::LocalConfiguration obsauxconf = obsconf[jobs].getSubConfiguration(
"obs bias");
72 obsauxparams.validateAndDeserialize(obsauxconf);
74 std::unique_ptr<ObsAuxCovariance_>(
new ObsAuxCovariance_(odb[jobs], obsauxparams)));
76 Log::trace() <<
"ObsAuxCovariances<OBS>::ObsAuxCovariances done" << std::endl;
81 template<
typename OBS>
83 Log::trace() <<
"ObsAuxCovariances<OBS>::~ObsAuxCovariances starting" << std::endl;
84 for (std::size_t jobs = 0; jobs < cov_.size(); ++jobs) {
87 Log::trace() <<
"ObsAuxCovariances<OBS>::~ObsAuxCovariances done" << std::endl;
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);
100 Log::trace() <<
"ObsAuxCovariances<OBS>::linearize done" << std::endl;
105 template<
typename OBS>
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]);
113 Log::trace() <<
"ObsAuxCovariances<OBS>::multiply done" << std::endl;
118 template<
typename OBS>
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]);
126 Log::trace() <<
"ObsAuxCovariances<OBS>::inverseMultiply done" << std::endl;
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]);
138 Log::trace() <<
"ObsAuxCovariances<OBS>::randomize done" << std::endl;
143 template<
typename OBS>
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;
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_
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.