12 #ifndef OOPS_INTERFACE_STATE_H_
13 #define OOPS_INTERFACE_STATE_H_
19 #include "eckit/config/Configuration.h"
23 #include "oops/util/DateTime.h"
24 #include "oops/util/gatherPrint.h"
25 #include "oops/util/ObjectCounter.h"
26 #include "oops/util/Printable.h"
27 #include "oops/util/Serializable.h"
28 #include "oops/util/Timer.h"
36 template <
typename MODEL>
37 class State :
public util::Printable,
38 public util::Serializable,
39 private util::ObjectCounter<State<MODEL> > {
40 typedef typename MODEL::State
State_;
44 static const std::string
classname() {
return "oops::State";}
64 void read(
const eckit::Configuration &);
65 void write(
const eckit::Configuration &)
const;
76 void serialize(std::vector<double> &)
const override;
77 void deserialize(
const std::vector<double> &,
size_t &)
override;
80 void print(std::ostream &)
const override;
87 template<
typename MODEL>
89 const util::DateTime & time) : state_(), commTime_(resol.timeComm())
91 Log::trace() <<
"State<MODEL>::State starting" << std::endl;
94 Log::trace() <<
"State<MODEL>::State done" << std::endl;
99 template<
typename MODEL>
101 : state_(), commTime_(resol.timeComm())
103 Log::trace() <<
"State<MODEL>::State read starting" << std::endl;
106 eckit::LocalConfiguration myconf;
107 if (conf.has(
"states")) {
109 std::vector<eckit::LocalConfiguration> confs;
110 conf.get(
"states", confs);
111 ASSERT(confs.size() == resol.
timeComm().size());
112 myconf = confs[resol.
timeComm().rank()];
115 myconf = eckit::LocalConfiguration(conf);
119 Log::trace() <<
"State<MODEL>::State read done" << std::endl;
124 template<
typename MODEL>
126 : state_(), commTime_(resol.timeComm())
128 Log::trace() <<
"State<MODEL>::State interpolated starting" << std::endl;
131 Log::trace() <<
"State<MODEL>::State interpolated done" << std::endl;
136 template<
typename MODEL>
139 Log::trace() <<
"State<MODEL>::State starting copy" << std::endl;
142 Log::trace() <<
"State<MODEL>::State copy done" << std::endl;
147 template<
typename MODEL>
150 Log::trace() <<
"State<MODEL>::State starting copy from derived state" << std::endl;
152 Log::warning() <<
"State<MODEL>::State creating State from derived state" << std::endl;
154 Log::trace() <<
"State<MODEL>::State copy from derived state done" << std::endl;
159 template<
typename MODEL>
161 Log::trace() <<
"State<MODEL>::~State starting" << std::endl;
162 util::Timer timer(classname(),
"~State");
164 Log::trace() <<
"State<MODEL>::~State done" << std::endl;
169 template<
typename MODEL>
171 Log::trace() <<
"State<MODEL>::operator= starting" << std::endl;
172 util::Timer timer(classname(),
"operator=");
173 *state_ = *rhs.state_;
174 Log::trace() <<
"State<MODEL>::operator= done" << std::endl;
180 template<
typename MODEL>
182 Log::trace() <<
"State<MODEL>::read starting" << std::endl;
183 util::Timer timer(classname(),
"read");
185 Log::trace() <<
"State<MODEL>::read done" << std::endl;
190 template<
typename MODEL>
192 Log::trace() <<
"State<MODEL>::write starting" << std::endl;
193 util::Timer timer(classname(),
"write");
195 Log::trace() <<
"State<MODEL>::write done" << std::endl;
200 template<
typename MODEL>
202 Log::trace() <<
"State<MODEL>::norm starting" << std::endl;
203 util::Timer timer(classname(),
"norm");
204 double zz = state_->norm();
206 commTime_.allReduceInPlace(zz, eckit::mpi::Operation::SUM);
208 Log::trace() <<
"State<MODEL>::norm done" << std::endl;
214 template<
typename MODEL>
216 Log::trace() <<
"State<MODEL>::geometry starting" << std::endl;
217 util::Timer timer(classname(),
"geometry");
219 Log::trace() <<
"State<MODEL>::geometry done" << std::endl;
225 template<
typename MODEL>
227 Log::trace() <<
"State<MODEL>::variables starting" << std::endl;
228 util::Timer timer(classname(),
"variables");
229 return state_->variables();
234 template<
typename MODEL>
236 Log::trace() <<
"State<MODEL>::serialSize" << std::endl;
237 util::Timer timer(classname(),
"serialSize");
238 return state_->serialSize();
243 template<
typename MODEL>
245 Log::trace() <<
"State<MODEL>::serialize starting" << std::endl;
246 util::Timer timer(classname(),
"serialize");
247 state_->serialize(vect);
248 Log::trace() <<
"State<MODEL>::serialize done" << std::endl;
253 template<
typename MODEL>
255 Log::trace() <<
"State<MODEL>::State deserialize starting" << std::endl;
256 util::Timer timer(classname(),
"deserialize");
257 state_->deserialize(vect, current);
258 Log::trace() <<
"State<MODEL>::State deserialize done" << std::endl;
263 template<
typename MODEL>
265 Log::trace() <<
"State<MODEL>::print starting" << std::endl;
266 util::Timer timer(classname(),
"print");
267 if (commTime_.size() > 1) {
268 gatherPrint(os, *state_, commTime_);
272 Log::trace() <<
"State<MODEL>::print done" << std::endl;
277 template<
typename MODEL>
279 Log::trace() <<
"State<MODEL>::zero starting" << std::endl;
280 util::Timer timer(classname(),
"zero");
282 Log::trace() <<
"State<MODEL>::zero done" << std::endl;
287 template<
typename MODEL>
289 Log::trace() <<
"State<MODEL>::accumul starting" << std::endl;
290 util::Timer timer(classname(),
"accumul");
291 state_->accumul(zz, *xx.state_);
292 Log::trace() <<
"State<MODEL>::accumul done" << std::endl;
299 #endif // OOPS_INTERFACE_STATE_H_