8 #ifndef OOPS_BASE_OBSAUXCONTROLS_H_
9 #define OOPS_BASE_OBSAUXCONTROLS_H_
18 #include "oops/util/ConfigFunctions.h"
19 #include "oops/util/Logger.h"
20 #include "oops/util/parameters/Parameters.h"
21 #include "oops/util/Printable.h"
27 template <
typename OBS>
34 static const std::string
classname() {
return "oops::ObsAuxControls";}
47 void read(
const eckit::Configuration &);
48 void write(
const eckit::Configuration &)
const;
54 void print(std::ostream &)
const;
55 std::vector<std::unique_ptr<ObsAuxControl_> >
auxs_;
60 template<
typename OBS>
62 const std::vector<Parameters_> &
params)
66 for (std::size_t jobs = 0; jobs <
params.size(); ++jobs) {
74 template<
typename OBS>
79 validateAndDeserialize<
Parameters_>(
util::vectoriseAndFilter(conf,
"obs bias")))
84 template<
typename OBS>
88 Log::trace() <<
"ObsAuxControls<OBS>::ObsAuxControls copy starting" << std::endl;
89 for (std::size_t jobs = 0; jobs < other.
size(); ++jobs) {
92 Log::trace() <<
"ObsAuxControls<OBS>::ObsAuxControls copy done" << std::endl;
97 template<
typename OBS>
99 Log::trace() <<
"ObsAuxControls<OBS>::~ObsAuxControls starting" << std::endl;
100 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs].reset();
101 Log::trace() <<
"ObsAuxControls<OBS>::~ObsAuxControls done" << std::endl;
106 template<
typename OBS>
108 Log::trace() <<
"ObsAuxControls<OBS>::read starting" << std::endl;
109 std::vector<eckit::LocalConfiguration> obsconfs = conf.getSubConfigurations(
"observations");
110 ASSERT(obsconfs.size() == auxs_.size());
111 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
112 eckit::LocalConfiguration obsauxconf = obsconfs[jobs].getSubConfiguration(
"obs bias");
114 params.validateAndDeserialize(obsauxconf);
115 auxs_[jobs]->read(
params);
117 Log::trace() <<
"ObsAuxControls<OBS>::read done" << std::endl;
122 template<
typename OBS>
124 Log::trace() <<
"ObsAuxControls<OBS>::write starting" << std::endl;
125 std::vector<eckit::LocalConfiguration> obsconfs = conf.getSubConfigurations(
"observations");
126 ASSERT(obsconfs.size() == auxs_.size());
127 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
128 eckit::LocalConfiguration obsauxconf = obsconfs[jobs].getSubConfiguration(
"obs bias");
130 params.validateAndDeserialize(obsauxconf);
131 auxs_[jobs]->write(
params);
133 Log::trace() <<
"ObsAuxControls<OBS>::write done" << std::endl;
138 template<
typename OBS>
140 Log::trace() <<
"ObsAuxControls<OBS>::norm starting" << std::endl;
141 double zz =
static_cast<double>(0.0);
144 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
145 norm = auxs_[jobs]->norm();
151 Log::trace() <<
"ObsAuxControls<OBS>::norm done" << std::endl;
152 return std::sqrt(zz/ii);
157 template<
typename OBS>
159 for (
const auto & aux : auxs_) {
160 os << *aux << std::endl;
ObsAuxControl_::Parameters_ Parameters_
void read(const eckit::Configuration &)
I/O and diagnostics.
std::vector< std::unique_ptr< ObsAuxControl_ > > auxs_
const ObsAuxControl_ & operator[](const std::size_t ii) const
ObsSpaces< OBS > ObsSpaces_
void write(const eckit::Configuration &) const
void print(std::ostream &) const
ObsAuxControl_::Parameters_ Parameters_
ObsAuxControls(const ObsSpaces_ &, const eckit::Configuration &)
ObsAuxControl< OBS > ObsAuxControl_
std::size_t size() const
Access.
ObsAuxControls & operator=(const ObsAuxControls &)
static const std::string classname()
ObsAuxControl_ & operator[](const std::size_t ii)
std::size_t size() const
Access.
IODA_DL void copy(const ObjectSelection &from, ObjectSelection &to, const ScaleMapping &scale_map)
Generic data copying function.
The namespace for the main oops code.