12 #ifndef OOPS_INTERFACE_INCREMENT_H_
13 #define OOPS_INTERFACE_INCREMENT_H_
19 #include "atlas/field.h"
28 #include "oops/util/DateTime.h"
29 #include "oops/util/Duration.h"
30 #include "oops/util/gatherPrint.h"
31 #include "oops/util/ObjectCounter.h"
32 #include "oops/util/Printable.h"
33 #include "oops/util/Serializable.h"
34 #include "oops/util/Timer.h"
45 template <
typename MODEL>
47 public util::Printable,
48 public util::Serializable,
49 private util::ObjectCounter<Increment<MODEL> > {
56 static const std::string
classname() {
return "oops::Increment";}
77 void zero(
const util::DateTime &);
79 void dirac(
const eckit::Configuration &);
84 void axpy(
const double &,
const Increment &,
const bool check =
true);
91 void read(
const eckit::Configuration &);
92 void write(
const eckit::Configuration &)
const;
103 void setAtlas(atlas::FieldSet *)
const;
104 void toAtlas(atlas::FieldSet *)
const;
112 const atlas::FieldSet &
atlas()
const {
118 void serialize(std::vector<double> &)
const override;
119 void deserialize(
const std::vector<double> &,
size_t &)
override;
126 void print(std::ostream &)
const override;
135 template <
typename MODEL>
137 Log::trace() <<
"operator+=(State, Increment) starting" << std::endl;
138 util::Timer timer(
"oops::Increment",
"operator+=(State, Increment)");
139 xx.
state() += dx.increment();
140 Log::trace() <<
"operator+=(State, Increment) done" << std::endl;
148 template<
typename MODEL>
150 const util::DateTime & time)
151 : increment_(), variables_(vars), commTime_(resol.timeComm())
153 Log::trace() <<
"Increment<MODEL>::Increment starting" << std::endl;
154 util::Timer timer(
classname(),
"Increment");
156 Log::trace() <<
"Increment<MODEL>::Increment done" << std::endl;
161 template<
typename MODEL>
163 : increment_(), variables_(other.variables_), commTime_(other.commTime_)
165 Log::trace() <<
"Increment<MODEL>::Increment starting" << std::endl;
166 util::Timer timer(
classname(),
"Increment");
168 Log::trace() <<
"Increment<MODEL>::Increment done" << std::endl;
173 template<
typename MODEL>
175 : increment_(), variables_(other.variables_), commTime_(other.commTime_)
177 Log::trace() <<
"Increment<MODEL>::Increment copy starting" << std::endl;
178 util::Timer timer(
classname(),
"Increment");
180 Log::trace() <<
"Increment<MODEL>::Increment copy done" << std::endl;
185 template<
typename MODEL>
187 Log::trace() <<
"Increment<MODEL>::~Increment starting" << std::endl;
188 util::Timer timer(classname(),
"~Increment");
190 Log::trace() <<
"Increment<MODEL>::~Increment done" << std::endl;
195 template<
typename MODEL>
197 Log::trace() <<
"Increment<MODEL>::diff starting" << std::endl;
198 util::Timer timer(classname(),
"diff");
200 Log::trace() <<
"Increment<MODEL>::diff done" << std::endl;
205 template<
typename MODEL>
207 Log::trace() <<
"Increment<MODEL>::zero starting" << std::endl;
208 util::Timer timer(classname(),
"zero");
210 Log::trace() <<
"Increment<MODEL>::zero done" << std::endl;
215 template<
typename MODEL>
217 Log::trace() <<
"Increment<MODEL>::zero starting" << std::endl;
218 util::Timer timer(classname(),
"zero");
219 increment_->zero(tt);
220 Log::trace() <<
"Increment<MODEL>::zero done" << std::endl;
225 template<
typename MODEL>
227 Log::trace() <<
"Increment<MODEL>::ones starting" << std::endl;
228 util::Timer timer(classname(),
"ones");
230 Log::trace() <<
"Increment<MODEL>::ones done" << std::endl;
235 template<
typename MODEL>
237 Log::trace() <<
"Increment<MODEL>::dirac starting" << std::endl;
238 util::Timer timer(classname(),
"dirac");
239 increment_->dirac(config);
240 Log::trace() <<
"Increment<MODEL>::dirac done" << std::endl;
245 template<
typename MODEL>
247 Log::trace() <<
"Increment<MODEL>::operator= starting" << std::endl;
248 util::Timer timer(classname(),
"operator=");
249 *increment_ = *rhs.increment_;
250 Log::trace() <<
"Increment<MODEL>::operator= done" << std::endl;
256 template<
typename MODEL>
258 Log::trace() <<
"Increment<MODEL>::operator+= starting" << std::endl;
259 util::Timer timer(classname(),
"operator+=");
260 *increment_ += *rhs.increment_;
261 Log::trace() <<
"Increment<MODEL>::operator+= done" << std::endl;
267 template<
typename MODEL>
269 Log::trace() <<
"Increment<MODEL>::operator-= starting" << std::endl;
270 util::Timer timer(classname(),
"operator-=");
271 *increment_ -= *rhs.increment_;
272 Log::trace() <<
"Increment<MODEL>::operator-= done" << std::endl;
278 template<
typename MODEL>
280 Log::trace() <<
"Increment<MODEL>::operator*= starting" << std::endl;
281 util::Timer timer(classname(),
"operator*=");
283 Log::trace() <<
"Increment<MODEL>::operator*= done" << std::endl;
289 template<
typename MODEL>
291 Log::trace() <<
"Increment<MODEL>::axpy starting" << std::endl;
292 util::Timer timer(classname(),
"axpy");
293 increment_->axpy(zz, *dx.increment_, check);
294 Log::trace() <<
"Increment<MODEL>::axpy done" << std::endl;
299 template<
typename MODEL>
301 Log::trace() <<
"Increment<MODEL>::dot_product_with starting" << std::endl;
302 util::Timer timer(classname(),
"dot_product_with");
303 double zz = increment_->dot_product_with(*dx.increment_);
304 commTime_.allReduceInPlace(zz, eckit::mpi::Operation::SUM);
305 Log::trace() <<
"Increment<MODEL>::dot_product_with done" << std::endl;
311 template<
typename MODEL>
313 Log::trace() <<
"Increment<MODEL>::schur_product_with starting" << std::endl;
314 util::Timer timer(classname(),
"schur_product_with");
315 increment_->schur_product_with(*dx.increment_);
316 Log::trace() <<
"Increment<MODEL>::schur_product_with done" << std::endl;
321 template<
typename MODEL>
323 Log::trace() <<
"Increment<MODEL>::random starting" << std::endl;
324 util::Timer timer(classname(),
"random");
325 increment_->random();
326 Log::trace() <<
"Increment<MODEL>::random done" << std::endl;
331 template<
typename MODEL>
333 Log::trace() <<
"Increment<MODEL>::accumul starting" << std::endl;
334 util::Timer timer(classname(),
"accumul");
335 increment_->accumul(zz, xx.
state());
336 Log::trace() <<
"Increment<MODEL>::accumul done" << std::endl;
341 template<
typename MODEL>
343 Log::trace() <<
"Increment<MODEL>::getLocal starting" << std::endl;
344 util::Timer timer(classname(),
"getLocal");
346 Log::trace() <<
"Increment<MODEL>::getLocal done" << std::endl;
351 template<
typename MODEL>
354 Log::trace() <<
"Increment<MODEL>::setLocal starting" << std::endl;
355 util::Timer timer(classname(),
"setLocal");
357 Log::trace() <<
"Increment<MODEL>::setLocal done" << std::endl;
362 template<
typename MODEL>
364 Log::trace() <<
"Increment<MODEL>::read starting" << std::endl;
365 util::Timer timer(classname(),
"read");
366 increment_->read(conf);
367 Log::trace() <<
"Increment<MODEL>::read done" << std::endl;
372 template<
typename MODEL>
374 Log::trace() <<
"Increment<MODEL>::write starting" << std::endl;
375 util::Timer timer(classname(),
"write");
376 increment_->write(conf);
377 Log::trace() <<
"Increment<MODEL>::write done" << std::endl;
382 template<
typename MODEL>
384 Log::trace() <<
"Increment<MODEL>::norm starting" << std::endl;
385 util::Timer timer(classname(),
"norm");
386 double zz = increment_->norm();
388 commTime_.allReduceInPlace(zz, eckit::mpi::Operation::SUM);
390 Log::trace() <<
"Increment<MODEL>::norm done" << std::endl;
396 template<
typename MODEL>
398 Log::trace() <<
"Increment<MODEL>::geometry starting" << std::endl;
399 util::Timer timer(classname(),
"geometry");
401 Log::trace() <<
"Increment<MODEL>::geometry done" << std::endl;
407 template<
typename MODEL>
409 Log::trace() <<
"Increment<MODEL>::setAtlas starting" << std::endl;
410 util::Timer timer(classname(),
"setAtlas");
411 increment_->setAtlas(atlasFieldSet);
412 Log::trace() <<
"Increment<MODEL>::setAtlas done" << std::endl;
417 template<
typename MODEL>
419 Log::trace() <<
"Increment<MODEL>::toAtlas starting" << std::endl;
420 util::Timer timer(classname(),
"toAtlas");
421 increment_->toAtlas(atlasFieldSet);
422 Log::trace() <<
"Increment<MODEL>::toAtlas done" << std::endl;
427 template<
typename MODEL>
429 Log::trace() <<
"Increment<MODEL>::fromAtlas starting" << std::endl;
430 util::Timer timer(classname(),
"fromAtlas");
431 increment_->fromAtlas(atlasFieldSet);
432 Log::trace() <<
"Increment<MODEL>::fromAtlas done" << std::endl;
437 template<
typename MODEL>
439 Log::trace() <<
"Increment<MODEL>::toAtlas starting" << std::endl;
440 increment_->toAtlas(&atlasFieldSet_);
442 Log::trace() <<
"Increment<MODEL>::toAtlas done" << std::endl;
447 template<
typename MODEL>
449 Log::trace() <<
"Increment<MODEL>::serialSize" << std::endl;
450 util::Timer timer(classname(),
"serialSize");
451 return increment_->serialSize();
456 template<
typename MODEL>
458 Log::trace() <<
"Increment<MODEL>::serialize starting" << std::endl;
459 util::Timer timer(classname(),
"serialize");
460 increment_->serialize(vect);
461 Log::trace() <<
"Increment<MODEL>::serialize done" << std::endl;
466 template<
typename MODEL>
468 Log::trace() <<
"Increment<MODEL>::Increment deserialize starting" << std::endl;
469 util::Timer timer(classname(),
"deserialize");
470 increment_->deserialize(vect, current);
471 Log::trace() <<
"Increment<MODEL>::Increment deserialize done" << std::endl;
476 template<
typename MODEL>
478 Log::trace() <<
"Increment<MODEL>::Increment shift_forward starting" << std::endl;
479 util::Timer timer(classname(),
"shift_forward");
480 static int tag = 159357;
481 size_t mytime = commTime_.rank();
484 if (mytime + 1 < commTime_.size()) {
492 increment_->zero(begin);
496 Log::trace() <<
"Increment<MODEL>::Increment shift_forward done" << std::endl;
501 template<
typename MODEL>
503 Log::trace() <<
"Increment<MODEL>::Increment shift_backward starting" << std::endl;
504 util::Timer timer(classname(),
"shift_backward");
505 static int tag = 753951;
506 size_t mytime = commTime_.rank();
514 if (mytime + 1 < commTime_.size()) {
517 increment_->zero(end);
521 Log::trace() <<
"Increment<MODEL>::Increment shift_backward done" << std::endl;
526 template<
typename MODEL>
528 Log::trace() <<
"Increment<MODEL>::print starting" << std::endl;
529 util::Timer timer(classname(),
"print");
530 if (commTime_.size() > 1) {
531 gatherPrint(os, *increment_, commTime_);
535 Log::trace() <<
"Increment<MODEL>::print done" << std::endl;
542 #endif // OOPS_INTERFACE_INCREMENT_H_