11 #ifndef OOPS_ASSIMILATION_INCREMENT4D_H_
12 #define OOPS_ASSIMILATION_INCREMENT4D_H_
20 #include <boost/ptr_container/ptr_map.hpp>
22 #include "atlas/field.h"
24 #include "eckit/config/LocalConfiguration.h"
25 #include "eckit/exception/Exceptions.h"
32 #include "oops/util/DateTime.h"
33 #include "oops/util/dot_product.h"
34 #include "oops/util/Duration.h"
35 #include "oops/util/Logger.h"
36 #include "oops/util/Printable.h"
37 #include "oops/util/Serializable.h"
48 template<
typename MODEL>
class Increment4D :
public util::Printable,
49 public util::Serializable {
56 static const std::string
classname() {
return "Increment4D";}
75 void dirac(std::vector<eckit::LocalConfiguration>);
85 void read(
const eckit::Configuration &);
86 void write(
const eckit::Configuration &)
const;
92 void setAtlas(atlas::FieldSet *)
const;
93 void toAtlas(atlas::FieldSet *)
const;
109 void serialize(std::vector<double> &)
const override;
110 void deserialize(
const std::vector<double> &,
size_t &)
override;
115 void print(std::ostream &)
const override;
117 typedef typename boost::ptr_map<int, Increment_>::iterator
iter_;
118 typedef typename boost::ptr_map<int, Increment_>::const_iterator
icst_;
125 template <
typename MODEL>
127 Log::trace() <<
"operator+=(State4D, Increment4D) starting" << std::endl;
128 for (
size_t ii = 0; ii < xx.
size(); ++ii) {
131 Log::trace() <<
"operator+=(State4D, Increment4D) done" << std::endl;
135 template<
typename MODEL>
137 : incr4d_(), first_(0), last_(jb.nstates() - 1)
139 for (
int jsub = 0; jsub <=
last_; ++jsub) {
143 Log::trace() <<
"Increment4D:Increment4D created." << std::endl;
146 template<
typename MODEL>
148 : incr4d_(), first_(0), last_(0)
152 Log::trace() <<
"Increment4D:Increment4D created." << std::endl;
155 template<
typename MODEL>
158 const std::vector<util::DateTime> & timeslots)
159 : incr4d_(), first_(0), last_(timeslots.size() - 1)
161 for (
int jsub = 0; jsub <=
last_; ++jsub) {
165 Log::trace() <<
"Increment4D:Increment4D created." << std::endl;
168 template<
typename MODEL>
170 : incr4d_(), first_(other.first_), last_(other.last_)
173 int isub = jsub->first;
177 Log::trace() <<
"Increment4D:Increment4D copied." << std::endl;
181 template<
typename MODEL>
183 : incr4d_(), first_(other.first_), last_(other.last_)
186 int isub = jsub->first;
190 Log::trace() <<
"Increment4D:Increment4D copied." << std::endl;
193 template<
typename MODEL>
195 iter_ it = incr4d_.find(ii);
196 ASSERT(it != incr4d_.end());
200 template<
typename MODEL>
202 icst_ it = incr4d_.find(ii);
203 ASSERT(it != incr4d_.end());
207 template<
typename MODEL>
210 template<
typename MODEL>
212 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
213 jsub->second->zero();
217 template<
typename MODEL>
219 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
220 jsub->second->random();
224 template<
typename MODEL>
226 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
227 jsub->second->ones();
231 template<
typename MODEL>
234 for (
const auto & conf : confs) {
235 const util::DateTime date(conf.getString(
"date"));
236 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
237 if (date == jsub->second->validTime()) {
238 jsub->second->dirac(conf);
244 template<
typename MODEL>
246 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
247 jsub->second->diff(cv1[jsub->first], cv2[jsub->first]);
251 template<
typename MODEL>
257 template<
typename MODEL>
259 for (
int jsub = rhs.
first(); jsub <= rhs.
last(); ++jsub) {
260 this->get(jsub) += rhs[jsub];
265 template<
typename MODEL>
267 for (
int jsub = rhs.
first(); jsub <= rhs.
last(); ++jsub) {
268 this->get(jsub) -= rhs[jsub];
273 template<
typename MODEL>
275 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
281 template<
typename MODEL>
283 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
284 jsub->second->axpy(zz, rhs[jsub->first], check);
288 template<
typename MODEL>
290 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
291 std::stringstream ss;
293 std::string query =
"increment[@indx='" + ss.str() +
"']";
294 eckit::LocalConfiguration fileConfig(config, query);
295 jsub->second->read(fileConfig);
296 Log::info() <<
"Increment4D:read increment" << *jsub->second << std::endl;
300 template<
typename MODEL>
302 for (
icst_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
303 jsub->second->write(config);
307 template<
typename MODEL>
309 for (
icst_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
310 jsub->second->setAtlas(afieldset);
314 template<
typename MODEL>
316 for (
icst_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
317 jsub->second->toAtlas(afieldset);
321 template<
typename MODEL>
323 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
324 jsub->second->fromAtlas(afieldset);
328 template <
typename MODEL>
330 for (
icst_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
331 outs << *jsub->second << std::endl;
335 template<
typename MODEL>
338 for (
icst_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
339 zz += dot_product(*jsub->second, x2[jsub->first]);
344 template<
typename MODEL>
346 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
347 jsub->second->schur_product_with(x2[jsub->first]);
351 template<
typename MODEL>
353 typedef typename boost::ptr_map<int, Increment_>::reverse_iterator rit;
354 for (rit jsub = incr4d_.rbegin(); jsub != incr4d_.rend(); ++jsub) {
355 const int isub = jsub->first;
356 if (isub > first_) this->get(isub) = this->get(isub-1);
358 incr4d_.erase(first_);
359 Log::info() <<
"Increment4D::shift_forward erased " << first_ << std::endl;
363 template<
typename MODEL>
365 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
366 const int isub = jsub->first;
367 if (isub < last_) this->get(isub) = this->get(isub+1);
369 incr4d_.erase(last_);
370 Log::info() <<
"Increment4D::shift_backward erased " << last_ << std::endl;
374 template<
typename MODEL>
377 for (
icst_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
378 ss += jsub->second->serialSize();
384 template<
typename MODEL>
386 vect.push_back(-98765.4321);
387 for (
icst_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
388 jsub->second->serialize(vect);
389 vect.push_back(-98765.4321);
393 template<
typename MODEL>
395 ASSERT(vect.at(current) == -98765.4321);
397 for (
iter_ jsub = incr4d_.begin(); jsub != incr4d_.end(); ++jsub) {
398 jsub->second->deserialize(vect, current);
399 ASSERT(vect.at(current) == -98765.4321);
407 #endif // OOPS_ASSIMILATION_INCREMENT4D_H_