11 #ifndef OOPS_INTERFACE_OBSVECTOR_H_
12 #define OOPS_INTERFACE_OBSVECTOR_H_
14 #include <Eigen/Dense>
23 #include "oops/util/gatherPrint.h"
24 #include "oops/util/Logger.h"
25 #include "oops/util/ObjectCounter.h"
26 #include "oops/util/Printable.h"
27 #include "oops/util/Timer.h"
41 template <
typename OBS>
43 private util::ObjectCounter<ObsVector<OBS> > {
47 static const std::string
classname() {
return "oops::ObsVector";}
96 void save(
const std::string &)
const;
97 void read(
const std::string &);
100 unsigned int nobs()
const;
103 void print(std::ostream &)
const;
109 template <
typename OBS>
111 : data_(), commTime_(os.timeComm()) {
112 Log::trace() <<
"ObsVector<OBS>::ObsVector starting " <<
name << std::endl;
113 util::Timer timer(
classname(),
"ObsVector");
115 this->setObjectSize(
data_->size() *
sizeof(
double));
116 Log::trace() <<
"ObsVector<OBS>::ObsVector done" << std::endl;
119 template <
typename OBS>
121 : data_(
std::move(obsvector)), commTime_(timeComm) {
122 Log::trace() <<
"ObsVector<OBS>::ObsVector starting " << std::endl;
123 util::Timer timer(
classname(),
"ObsVector");
124 this->setObjectSize(
data_->size() *
sizeof(
double));
125 Log::trace() <<
"ObsVector<OBS>::ObsVector done" << std::endl;
128 template <
typename OBS>
130 Log::trace() <<
"ObsVector<OBS>::ObsVector starting" << std::endl;
131 util::Timer timer(
classname(),
"ObsVector");
133 this->setObjectSize(
data_->size() *
sizeof(
double));
134 Log::trace() <<
"ObsVector<OBS>::ObsVector done" << std::endl;
137 template <
typename OBS>
139 Log::trace() <<
"ObsVector<OBS>::~ObsVector starting" << std::endl;
140 util::Timer timer(classname(),
"~ObsVector");
142 Log::trace() <<
"ObsVector<OBS>::~ObsVector done" << std::endl;
145 template <
typename OBS>
147 Log::trace() <<
"ObsVector<OBS>::operator= starting" << std::endl;
148 util::Timer timer(classname(),
"operator=");
152 Log::trace() <<
"ObsVector<OBS>::operator= done" << std::endl;
156 template <
typename OBS>
158 Log::trace() <<
"ObsVector<OBS>::operator*= starting" << std::endl;
159 util::Timer timer(classname(),
"operator*=");
163 Log::trace() <<
"ObsVector<OBS>::operator*= done" << std::endl;
167 template <
typename OBS>
169 Log::trace() <<
"ObsVector<OBS>::operator+= starting" << std::endl;
170 util::Timer timer(classname(),
"operator+=");
172 *data_ += *rhs.
data_;
174 Log::trace() <<
"ObsVector<OBS>::operator+= done" << std::endl;
178 template <
typename OBS>
180 Log::trace() <<
"ObsVector<OBS>::operator-= starting" << std::endl;
181 util::Timer timer(classname(),
"operator-=");
183 *data_ -= *rhs.
data_;
185 Log::trace() <<
"ObsVector<OBS>::operator-= done" << std::endl;
189 template <
typename OBS>
191 Log::trace() <<
"ObsVector<OBS>::operator*= starting" << std::endl;
192 util::Timer timer(classname(),
"operator*=");
194 *data_ *= *rhs.
data_;
196 Log::trace() <<
"ObsVector<OBS>::operator*= done" << std::endl;
200 template <
typename OBS>
202 Log::trace() <<
"ObsVector<OBS>::operator/= starting" << std::endl;
203 util::Timer timer(classname(),
"operator/=");
205 *data_ /= *rhs.
data_;
207 Log::trace() <<
"ObsVector<OBS>::operator/= done" << std::endl;
211 template <
typename OBS>
213 Log::trace() <<
"ObsVector<OBS>::zero starting" << std::endl;
214 util::Timer timer(classname(),
"zero");
218 Log::trace() <<
"ObsVector<OBS>::zero done" << std::endl;
221 template <
typename OBS>
223 Log::trace() <<
"ObsVector<OBS>::ones starting" << std::endl;
224 util::Timer timer(classname(),
"ones");
228 Log::trace() <<
"ObsVector<OBS>::ones done" << std::endl;
231 template <
typename OBS>
233 Log::trace() <<
"ObsVector<OBS>::axpy starting" << std::endl;
234 util::Timer timer(classname(),
"axpy");
236 data_->axpy(zz, *rhs.
data_);
238 Log::trace() <<
"ObsVector<OBS>::axpy done" << std::endl;
241 template <
typename OBS>
243 Log::trace() <<
"ObsVector<OBS>::invert starting" << std::endl;
244 util::Timer timer(classname(),
"invert");
248 Log::trace() <<
"ObsVector<OBS>::invert done" << std::endl;
251 template <
typename OBS>
253 Log::trace() <<
"ObsVector<OBS>::random starting" << std::endl;
254 util::Timer timer(classname(),
"random");
258 Log::trace() <<
"ObsVector<OBS>::random done" << std::endl;
261 template <
typename OBS>
263 Log::trace() <<
"ObsVector<OBS>::dot_product starting" << std::endl;
264 util::Timer timer(classname(),
"dot_product");
266 double zz = data_->dot_product_with(*other.
data_);
267 commTime_.allReduceInPlace(zz, eckit::mpi::Operation::SUM);
269 Log::trace() <<
"ObsVector<OBS>::dot_product done" << std::endl;
273 template <
typename OBS>
275 Log::trace() <<
"ObsVector<OBS>::mask starting" << std::endl;
276 util::Timer timer(classname(),
"mask");
277 data_->mask(
qc.obsdatavector());
278 Log::trace() <<
"ObsVector<OBS>::mask done" << std::endl;
281 template <
typename OBS>
283 Log::trace() <<
"ObsVector<OBS>::mask(ObsVector) starting" << std::endl;
284 util::Timer timer(classname(),
"mask(ObsVector)");
286 Log::trace() <<
"ObsVector<OBS>::mask(ObsVector) done" << std::endl;
289 template <
typename OBS>
291 Log::trace() <<
"ObsVector<OBS>::operator= starting" << std::endl;
292 util::Timer timer(classname(),
"operator=");
294 Log::trace() <<
"ObsVector<OBS>::operator= done" << std::endl;
298 template <
typename OBS>
300 Log::trace() <<
"ObsVector<OBS>::rms starting" << std::endl;
301 util::Timer timer(classname(),
"rms");
304 size_t ntot = this->
nobs();
307 double zzz = zz * zz *
static_cast<double>(data_->nobs());
308 commTime_.allReduceInPlace(zzz, eckit::mpi::Operation::SUM);
309 zzz /=
static_cast<double>(ntot);
313 Log::trace() <<
"ObsVector<OBS>::rms done" << std::endl;
317 template <
typename OBS>
319 int nobs = data_->nobs();
320 commTime_.allReduceInPlace(
nobs, eckit::mpi::Operation::SUM);
324 template <
typename OBS>
326 Log::trace() <<
"ObsVector<OBS>::print starting" << std::endl;
327 util::Timer timer(classname(),
"print");
328 if (commTime_.size() > 1) {
329 gatherPrint(os, *data_, commTime_);
333 Log::trace() <<
"ObsVector<OBS>::print done" << std::endl;
336 template <
typename OBS>
338 Log::trace() <<
"ObsVector<OBS>::save starting " <<
name << std::endl;
339 util::Timer timer(classname(),
"save");
343 Log::trace() <<
"ObsVector<OBS>::save done" << std::endl;
346 template <
typename OBS>
348 Log::trace() <<
"ObsVector<OBS>::packEigen starting " << std::endl;
349 util::Timer timer(classname(),
"packEigen");
351 Eigen::VectorXd vec = data_->packEigen(mask.
obsvector());
353 Log::trace() <<
"ObsVector<OBS>::packEigen done" << std::endl;
357 template <
typename OBS>
359 Log::trace() <<
"ObsVector<OBS>::packEigenSize starting " << std::endl;
360 util::Timer timer(classname(),
"packEigenSize");
362 size_t len = data_->packEigenSize(mask.
obsvector());
364 Log::trace() <<
"ObsVector<OBS>::packEigen done" << std::endl;
368 template <
typename OBS>
370 Log::trace() <<
"ObsVector<OBS>::read starting " <<
name << std::endl;
371 util::Timer timer(classname(),
"read");
375 Log::trace() <<
"ObsVector<OBS>::read done" << std::endl;
ObsDataVec_ & obsdatavector()
Interfacing.
ObsSpace_ & obsspace() const
Interfacing.
OBS::ObsVector ObsVector_
unsigned int nobs() const
number of non-masked out observations (across all MPI tasks)
void axpy(const double &, const ObsVector &)
const ObsVector_ & obsvector() const
void ones()
Set this ObsVector to ones (used in tests)
const eckit::mpi::Comm & commTime_
void save(const std::string &) const
void mask(const ObsDataVector< OBS, int > &mask)
Mask out elements of the vector where mask is > 0.
std::unique_ptr< ObsVector_ > data_
void print(std::ostream &) const
ObsVector & operator-=(const ObsVector &)
void read(const std::string &)
ObsVector_ & obsvector()
Interfacing.
size_t packEigenSize(const ObsVector &mask) const
Eigen::VectorXd packEigen(const ObsVector &mask) const
double dot_product_with(const ObsVector &) const
ObsVector & operator*=(const double &)
ObsVector & operator+=(const ObsVector &)
ObsVector(const ObsSpace< OBS > &obsspace, const std::string name="")
ObsVector & operator/=(const ObsVector &)
static const std::string classname()
ObsVector & operator=(const ObsVector &)
The namespace for the main oops code.