11 #ifndef OOPS_INTERFACE_OBSVECTOR_H_
12 #define OOPS_INTERFACE_OBSVECTOR_H_
14 #include <Eigen/Dense>
22 #include "oops/util/gatherPrint.h"
23 #include "oops/util/Logger.h"
24 #include "oops/util/ObjectCounter.h"
25 #include "oops/util/Printable.h"
26 #include "oops/util/Timer.h"
40 template <
typename OBS>
41 class ObsVector :
public util::Printable,
42 private util::ObjectCounter<ObsVector<OBS> > {
46 static const std::string
classname() {
return "oops::ObsVector";}
78 void save(
const std::string &)
const;
79 void read(
const std::string &);
81 unsigned int nobs()
const;
84 void print(std::ostream &)
const;
85 std::unique_ptr<ObsVector_>
data_;
90 template <
typename OBS>
92 const bool fail): data_(), commTime_(os.timeComm()) {
93 Log::trace() <<
"ObsVector<OBS>::ObsVector starting " << name << std::endl;
94 util::Timer timer(
classname(),
"ObsVector");
98 Log::trace() <<
"ObsVector<OBS>::ObsVector done" << std::endl;
101 template <
typename OBS>
103 Log::trace() <<
"ObsVector<OBS>::ObsVector starting" << std::endl;
104 util::Timer timer(
classname(),
"ObsVector");
108 Log::trace() <<
"ObsVector<OBS>::ObsVector done" << std::endl;
111 template <
typename OBS>
113 : data_(), commTime_(os.timeComm())
115 Log::trace() <<
"ObsVector<OBS>::ObsVector starting" << std::endl;
116 util::Timer timer(
classname(),
"ObsVector");
120 Log::trace() <<
"ObsVector<OBS>::ObsVector done" << std::endl;
123 template <
typename OBS>
125 Log::trace() <<
"ObsVector<OBS>::~ObsVector starting" << std::endl;
126 util::Timer timer(classname(),
"~ObsVector");
130 Log::trace() <<
"ObsVector<OBS>::~ObsVector done" << std::endl;
133 template <
typename OBS>
135 Log::trace() <<
"ObsVector<OBS>::operator= starting" << std::endl;
136 util::Timer timer(classname(),
"operator=");
140 Log::trace() <<
"ObsVector<OBS>::operator= done" << std::endl;
144 template <
typename OBS>
146 Log::trace() <<
"ObsVector<OBS>::operator*= starting" << std::endl;
147 util::Timer timer(classname(),
"operator*=");
151 Log::trace() <<
"ObsVector<OBS>::operator*= done" << std::endl;
155 template <
typename OBS>
157 Log::trace() <<
"ObsVector<OBS>::operator+= starting" << std::endl;
158 util::Timer timer(classname(),
"operator+=");
160 *data_ += *rhs.data_;
162 Log::trace() <<
"ObsVector<OBS>::operator+= done" << std::endl;
166 template <
typename OBS>
168 Log::trace() <<
"ObsVector<OBS>::operator-= starting" << std::endl;
169 util::Timer timer(classname(),
"operator-=");
171 *data_ -= *rhs.data_;
173 Log::trace() <<
"ObsVector<OBS>::operator-= done" << std::endl;
177 template <
typename OBS>
179 Log::trace() <<
"ObsVector<OBS>::operator*= starting" << std::endl;
180 util::Timer timer(classname(),
"operator*=");
182 *data_ *= *rhs.data_;
184 Log::trace() <<
"ObsVector<OBS>::operator*= done" << std::endl;
188 template <
typename OBS>
190 Log::trace() <<
"ObsVector<OBS>::operator/= starting" << std::endl;
191 util::Timer timer(classname(),
"operator/=");
193 *data_ /= *rhs.data_;
195 Log::trace() <<
"ObsVector<OBS>::operator/= done" << std::endl;
199 template <
typename OBS>
201 Log::trace() <<
"ObsVector<OBS>::zero starting" << std::endl;
202 util::Timer timer(classname(),
"zero");
206 Log::trace() <<
"ObsVector<OBS>::zero done" << std::endl;
209 template <
typename OBS>
211 Log::trace() <<
"ObsVector<OBS>::axpy starting" << std::endl;
212 util::Timer timer(classname(),
"axpy");
214 data_->axpy(zz, *rhs.data_);
216 Log::trace() <<
"ObsVector<OBS>::axpy done" << std::endl;
219 template <
typename OBS>
221 Log::trace() <<
"ObsVector<OBS>::invert starting" << std::endl;
222 util::Timer timer(classname(),
"invert");
226 Log::trace() <<
"ObsVector<OBS>::invert done" << std::endl;
229 template <
typename OBS>
231 Log::trace() <<
"ObsVector<OBS>::random starting" << std::endl;
232 util::Timer timer(classname(),
"random");
236 Log::trace() <<
"ObsVector<OBS>::random done" << std::endl;
239 template <
typename OBS>
241 Log::trace() <<
"ObsVector<OBS>::dot_product starting" << std::endl;
242 util::Timer timer(classname(),
"dot_product");
244 double zz = data_->dot_product_with(*other.data_);
245 commTime_.allReduceInPlace(zz, eckit::mpi::Operation::SUM);
247 Log::trace() <<
"ObsVector<OBS>::dot_product done" << std::endl;
251 template <
typename OBS>
253 Log::trace() <<
"ObsVector<OBS>::mask starting" << std::endl;
254 util::Timer timer(classname(),
"mask");
256 Log::trace() <<
"ObsVector<OBS>::mask done" << std::endl;
259 template <
typename OBS>
261 Log::trace() <<
"ObsVector<OBS>::rms starting" << std::endl;
262 util::Timer timer(classname(),
"rms");
265 size_t ntot = this->nobs();
268 double zzz = zz * zz *
static_cast<double>(data_->nobs());
269 commTime_.allReduceInPlace(zzz, eckit::mpi::Operation::SUM);
270 zzz /=
static_cast<double>(ntot);
274 Log::trace() <<
"ObsVector<OBS>::rms done" << std::endl;
278 template <
typename OBS>
280 int nobs = data_->nobs();
281 commTime_.allReduceInPlace(nobs, eckit::mpi::Operation::SUM);
285 template <
typename OBS>
287 Log::trace() <<
"ObsVector<OBS>::print starting" << std::endl;
288 util::Timer timer(classname(),
"print");
289 if (commTime_.size() > 1) {
290 gatherPrint(os, *data_, commTime_);
294 Log::trace() <<
"ObsVector<OBS>::print done" << std::endl;
297 template <
typename OBS>
299 Log::trace() <<
"ObsVector<OBS>::save starting " << name << std::endl;
300 util::Timer timer(classname(),
"save");
304 Log::trace() <<
"ObsVector<OBS>::save done" << std::endl;
307 template <
typename OBS>
309 Log::trace() <<
"ObsVector<OBS>::packEigen starting " << std::endl;
310 util::Timer timer(classname(),
"packEigen");
312 Eigen::VectorXd vec = data_->packEigen();
313 ASSERT(vec.size() == nobs());
315 Log::trace() <<
"ObsVector<OBS>::packEigen done" << std::endl;
319 template <
typename OBS>
321 Log::trace() <<
"ObsVector<OBS>::read starting " << name << std::endl;
322 util::Timer timer(classname(),
"read");
326 Log::trace() <<
"ObsVector<OBS>::read done" << std::endl;
332 #endif // OOPS_INTERFACE_OBSVECTOR_H_