8 #ifndef OOPS_BASE_OBSAUXINCREMENTS_H_
9 #define OOPS_BASE_OBSAUXINCREMENTS_H_
19 #include "oops/util/Logger.h"
20 #include "oops/util/ObjectCounter.h"
21 #include "oops/util/Printable.h"
22 #include "oops/util/Serializable.h"
28 template <
typename OBS>
30 public util::Serializable,
31 private util::ObjectCounter<ObsAuxIncrements<OBS> > {
37 static const std::string
classname() {
return "oops::ObsAuxIncrements";}
60 void read(
const eckit::Configuration &);
61 void write(
const eckit::Configuration &)
const;
66 void serialize(std::vector<double> &)
const override;
67 void deserialize(
const std::vector<double> &,
size_t &)
override;
70 void print(std::ostream &)
const override;
71 std::vector<std::unique_ptr<ObsAuxIncrement_> >
auxs_;
76 template <
typename OBS>
78 Log::trace() <<
"operator+=(ObsAuxControls, ObsAuxIncrements) starting" << std::endl;
80 for (std::size_t jobs = 0; jobs < xx.
size(); ++jobs) {
81 xx[jobs].obsauxcontrol() += dx[jobs].obsauxincrement();
83 Log::trace() <<
"operator+=(ObsAuxControls, ObsAuxIncrements) done" << std::endl;
89 template<
typename OBS>
93 Log::trace() <<
"ObsAuxIncrements<OBS>::ObsAuxIncrements starting" << std::endl;
95 std::vector<eckit::LocalConfiguration> obsconf = conf.getSubConfigurations();
96 for (std::size_t jobs = 0; jobs < obsconf.size(); ++jobs) {
97 eckit::LocalConfiguration obsauxconf = obsconf[jobs].getSubConfiguration(
"obs bias");
99 obsauxparams.validateAndDeserialize(obsauxconf);
101 std::unique_ptr<ObsAuxIncrement_>(
new ObsAuxIncrement_(odb[jobs], obsauxparams)));
102 bytes +=
auxs_[jobs]->serialSize();
104 this->setObjectSize(bytes*
sizeof(
double));
105 Log::trace() <<
"ObsAuxIncrements<OBS>::ObsAuxIncrements done" << std::endl;
108 template<
typename OBS>
110 : auxs_(other.size())
112 Log::trace() <<
"ObsAuxIncrements<OBS>::ObsAuxIncrements copy starting" << std::endl;
115 for (std::size_t jobs = 0; jobs < other.
size(); ++jobs) {
117 bytes +=
auxs_[jobs]->serialSize();
119 this->setObjectSize(bytes*
sizeof(
double));
120 Log::trace() <<
"ObsAuxIncrements<OBS>::ObsAuxIncrements copy done" << std::endl;
123 template<
typename OBS>
125 Log::trace() <<
"ObsAuxIncrements<OBS>::~ObsAuxIncrements starting" << std::endl;
126 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs].reset();
127 Log::trace() <<
"ObsAuxIncrements<OBS>::~ObsAuxIncrements done" << std::endl;
130 template<
typename OBS>
132 Log::trace() <<
"ObsAuxIncrements<OBS>::diff starting" << std::endl;
134 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
135 auxs_[jobs]->diff(x1[jobs], x2[jobs]);
137 Log::trace() <<
"ObsAuxIncrements<OBS>::diff done" << std::endl;
140 template<
typename OBS>
142 Log::trace() <<
"ObsAuxIncrements<OBS>::zero starting" << std::endl;
143 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
146 Log::trace() <<
"ObsAuxIncrements<OBS>::zero done" << std::endl;
149 template<
typename OBS>
151 Log::trace() <<
"ObsAuxIncrements<OBS>::operator= starting" << std::endl;
152 ASSERT(size() == rhs.
size());
153 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
154 *auxs_[jobs] = rhs[jobs];
156 Log::trace() <<
"ObsAuxIncrements<OBS>::operator= done" << std::endl;
160 template<
typename OBS>
162 Log::trace() <<
"ObsAuxIncrements<OBS>::operator+= starting" << std::endl;
163 ASSERT(size() == rhs.
size());
164 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
165 *auxs_[jobs] += rhs[jobs];
167 Log::trace() <<
"ObsAuxIncrements<OBS>::operator+= done" << std::endl;
171 template<
typename OBS>
173 Log::trace() <<
"ObsAuxIncrements<OBS>::operator-= starting" << std::endl;
174 ASSERT(size() == rhs.
size());
175 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
176 *auxs_[jobs] -= rhs[jobs];
178 Log::trace() <<
"ObsAuxIncrements<OBS>::operator-= done" << std::endl;
182 template<
typename OBS>
184 Log::trace() <<
"ObsAuxIncrements<OBS>::operator*= starting" << std::endl;
185 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
188 Log::trace() <<
"ObsAuxIncrements<OBS>::operator*= done" << std::endl;
192 template<
typename OBS>
194 Log::trace() <<
"ObsAuxIncrements<OBS>::axpy starting" << std::endl;
195 ASSERT(size() == dx.
size());
196 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
197 auxs_[jobs]->axpy(zz, dx[jobs]);
199 Log::trace() <<
"ObsAuxIncrements<OBS>::axpy done" << std::endl;
202 template<
typename OBS>
204 Log::trace() <<
"ObsAuxIncrements<OBS>::dot_product_with starting" << std::endl;
205 ASSERT(size() == dx.
size());
206 double zz =
static_cast<double>(0.0);
207 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
208 zz += auxs_[jobs]->dot_product_with(dx[jobs]);
210 Log::trace() <<
"ObsAuxIncrements<OBS>::dot_product_with done" << std::endl;
214 template<
typename OBS>
216 Log::trace() <<
"ObsAuxIncrements<OBS>::read starting" << std::endl;
217 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->read(conf);
218 Log::trace() <<
"ObsAuxIncrements<OBS>::read done" << std::endl;
221 template<
typename OBS>
223 Log::trace() <<
"ObsAuxIncrements<OBS>::write starting" << std::endl;
224 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->
write(conf);
225 Log::trace() <<
"ObsAuxIncrements<OBS>::write done" << std::endl;
228 template<
typename OBS>
230 Log::trace() <<
"ObsAuxIncrements<OBS>::norm starting" << std::endl;
231 double zz =
static_cast<double>(0.0);
232 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
233 zz += auxs_[jobs]->norm();
235 Log::trace() <<
"ObsAuxIncrements<OBS>::norm done" << std::endl;
239 template<
typename OBS>
241 Log::trace() <<
"ObsAuxIncrements<OBS>::serialSize starting" << std::endl;
243 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
244 ss += auxs_[jobs]->serialSize();
246 Log::trace() <<
"ObsAuxIncrements<OBS>::serialSize done" << std::endl;
250 template<
typename OBS>
252 Log::trace() <<
"ObsAuxIncrements<OBS>::serialize starting" << std::endl;
253 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->serialize(vect);
254 Log::trace() <<
"ObsAuxIncrements<OBS>::serialize done" << std::endl;
257 template<
typename OBS>
259 Log::trace() <<
"ObsAuxIncrements<OBS>::deserialize starting" << std::endl;
260 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
261 auxs_[jobs]->deserialize(vect, index);
263 Log::trace() <<
"ObsAuxIncrements<OBS>::deserialize done" << std::endl;
267 template<
typename OBS>
269 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) os << *auxs_[jobs];
std::size_t size() const
Access.
ObsAuxIncrement_::Parameters_ Parameters_
void print(std::ostream &) const override
void deserialize(const std::vector< double > &, size_t &) override
size_t serialSize() const override
Serialize-Deserialize.
ObsAuxIncrements & operator*=(const double &)
ObsAuxControls< OBS > ObsAuxControls_
ObsAuxIncrement_ & operator[](const std::size_t ii)
ObsAuxIncrements(const ObsSpaces_ &, const eckit::Configuration &)
Constructor, destructor.
double dot_product_with(const ObsAuxIncrements &) const
ObsSpaces< OBS > ObsSpaces_
void write(const eckit::Configuration &) const
void serialize(std::vector< double > &) const override
static const std::string classname()
ObsAuxIncrements & operator+=(const ObsAuxIncrements &)
const ObsAuxIncrement_ & operator[](const std::size_t ii) const
ObsAuxIncrements & operator=(const ObsAuxIncrements &)
void read(const eckit::Configuration &)
I/O and diagnostics.
std::vector< std::unique_ptr< ObsAuxIncrement_ > > auxs_
ObsAuxIncrement< OBS > ObsAuxIncrement_
std::size_t size() const
Access.
void diff(const ObsAuxControls_ &, const ObsAuxControls_ &)
Linear algebra operators.
ObsAuxIncrements & operator-=(const ObsAuxIncrements &)
void axpy(const double &, const ObsAuxIncrements &)
IODA_DL void copy(const ObjectSelection &from, ObjectSelection &to, const ScaleMapping &scale_map)
Generic data copying function.
The namespace for the main oops code.
State< MODEL > & operator+=(State< MODEL > &xx, const Increment< MODEL > &dx)
Add on dx incrment to model state xx.
subroutine write(self, filename_in)