8 #ifndef OOPS_BASE_OBSAUXINCREMENTS_H_
9 #define OOPS_BASE_OBSAUXINCREMENTS_H_
19 #include "oops/util/Logger.h"
20 #include "oops/util/Printable.h"
21 #include "oops/util/Serializable.h"
27 template <
typename OBS>
29 public util::Serializable {
35 static const std::string
classname() {
return "oops::ObsAuxIncrements";}
59 void read(
const eckit::Configuration &);
60 void write(
const eckit::Configuration &)
const;
65 void serialize(std::vector<double> &)
const override;
66 void deserialize(
const std::vector<double> &,
size_t &)
override;
69 void print(std::ostream &)
const override;
70 std::vector<std::unique_ptr<ObsAuxIncrement_> >
auxs_;
75 template <
typename OBS>
77 Log::trace() <<
"operator+=(ObsAuxControls, ObsAuxIncrements) starting" << std::endl;
79 for (std::size_t jobs = 0; jobs < xx.
size(); ++jobs) {
80 xx[jobs].obsauxcontrol() += dx[jobs].obsauxincrement();
82 Log::trace() <<
"operator+=(ObsAuxControls, ObsAuxIncrements) done" << std::endl;
88 template<
typename OBS>
92 std::vector<eckit::LocalConfiguration> obsconf;
93 conf.get(
"observations", obsconf);
94 for (std::size_t jobs = 0; jobs < obsconf.size(); ++jobs) {
96 std::unique_ptr<ObsAuxIncrement_>(
new ObsAuxIncrement_(odb[jobs], obsconf[jobs])));
100 template<
typename OBS>
102 : auxs_(other.size())
104 Log::trace() <<
"ObsAuxIncrements<OBS>::ObsAuxIncrements copy starting" << std::endl;
106 for (std::size_t jobs = 0; jobs < other.
size(); ++jobs) {
109 Log::trace() <<
"ObsAuxIncrements<OBS>::ObsAuxIncrements copy done" << std::endl;
112 template<
typename OBS>
114 const eckit::Configuration & conf) : auxs_(other.size())
116 Log::trace() <<
"ObsAuxIncrements<OBS>::ObsAuxIncrements interpolated starting" << std::endl;
117 std::vector<eckit::LocalConfiguration> obsconf;
119 for (std::size_t jobs = 0; jobs < other.
size(); ++jobs) {
122 Log::trace() <<
"ObsAuxIncrements<OBS>::ObsAuxIncrements interpolated done" << std::endl;
125 template<
typename OBS>
127 Log::trace() <<
"ObsAuxIncrements<OBS>::~ObsAuxIncrements starting" << std::endl;
128 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs].reset();
129 Log::trace() <<
"ObsAuxIncrements<OBS>::~ObsAuxIncrements done" << std::endl;
132 template<
typename OBS>
134 Log::trace() <<
"ObsAuxIncrements<OBS>::diff starting" << std::endl;
136 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
137 auxs_[jobs]->diff(x1[jobs], x2[jobs]);
139 Log::trace() <<
"ObsAuxIncrements<OBS>::diff done" << std::endl;
142 template<
typename OBS>
144 Log::trace() <<
"ObsAuxIncrements<OBS>::zero starting" << std::endl;
145 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
148 Log::trace() <<
"ObsAuxIncrements<OBS>::zero done" << std::endl;
151 template<
typename OBS>
153 Log::trace() <<
"ObsAuxIncrements<OBS>::operator= starting" << std::endl;
154 ASSERT(size() == rhs.
size());
155 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
156 *auxs_[jobs] = rhs[jobs];
158 Log::trace() <<
"ObsAuxIncrements<OBS>::operator= done" << std::endl;
162 template<
typename OBS>
164 Log::trace() <<
"ObsAuxIncrements<OBS>::operator+= starting" << std::endl;
165 ASSERT(size() == rhs.
size());
166 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
167 *auxs_[jobs] += rhs[jobs];
169 Log::trace() <<
"ObsAuxIncrements<OBS>::operator+= done" << std::endl;
173 template<
typename OBS>
175 Log::trace() <<
"ObsAuxIncrements<OBS>::operator-= starting" << std::endl;
176 ASSERT(size() == rhs.
size());
177 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
178 *auxs_[jobs] -= rhs[jobs];
180 Log::trace() <<
"ObsAuxIncrements<OBS>::operator-= done" << std::endl;
184 template<
typename OBS>
186 Log::trace() <<
"ObsAuxIncrements<OBS>::operator*= starting" << std::endl;
187 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
190 Log::trace() <<
"ObsAuxIncrements<OBS>::operator*= done" << std::endl;
194 template<
typename OBS>
196 Log::trace() <<
"ObsAuxIncrements<OBS>::axpy starting" << std::endl;
197 ASSERT(size() == dx.
size());
198 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
199 auxs_[jobs]->axpy(zz, dx[jobs]);
201 Log::trace() <<
"ObsAuxIncrements<OBS>::axpy done" << std::endl;
204 template<
typename OBS>
206 Log::trace() <<
"ObsAuxIncrements<OBS>::dot_product_with starting" << std::endl;
207 ASSERT(size() == dx.
size());
208 double zz =
static_cast<double>(0.0);
209 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
210 zz += auxs_[jobs]->dot_product_with(dx[jobs]);
212 Log::trace() <<
"ObsAuxIncrements<OBS>::dot_product_with done" << std::endl;
216 template<
typename OBS>
218 Log::trace() <<
"ObsAuxIncrements<OBS>::read starting" << std::endl;
219 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->read(conf);
220 Log::trace() <<
"ObsAuxIncrements<OBS>::read done" << std::endl;
223 template<
typename OBS>
225 Log::trace() <<
"ObsAuxIncrements<OBS>::write starting" << std::endl;
226 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->
write(conf);
227 Log::trace() <<
"ObsAuxIncrements<OBS>::write done" << std::endl;
230 template<
typename OBS>
232 Log::trace() <<
"ObsAuxIncrements<OBS>::norm starting" << std::endl;
233 double zz =
static_cast<double>(0.0);
234 for (std::size_t jobs = 0; jobs < size(); ++jobs) {
235 zz += auxs_[jobs]->norm();
237 Log::trace() <<
"ObsAuxIncrements<OBS>::norm done" << std::endl;
241 template<
typename OBS>
243 Log::trace() <<
"ObsAuxIncrements<OBS>::serialSize starting" << std::endl;
245 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
246 ss += auxs_[jobs]->serialSize();
248 Log::trace() <<
"ObsAuxIncrements<OBS>::serialSize done" << std::endl;
252 template<
typename OBS>
254 Log::trace() <<
"ObsAuxIncrements<OBS>::serialize starting" << std::endl;
255 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->serialize(vect);
256 Log::trace() <<
"ObsAuxIncrements<OBS>::serialize done" << std::endl;
259 template<
typename OBS>
261 Log::trace() <<
"ObsAuxIncrements<OBS>::deserialize starting" << std::endl;
262 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
263 auxs_[jobs]->deserialize(vect, index);
265 Log::trace() <<
"ObsAuxIncrements<OBS>::deserialize done" << std::endl;
269 template<
typename OBS>
271 for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) os << *auxs_[jobs];
277 #endif // OOPS_BASE_OBSAUXINCREMENTS_H_