IODA
src/ObsVector.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2017 UCAR
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
8 #ifndef OBSVECTOR_H_
9 #define OBSVECTOR_H_
10 
11 #include <Eigen/Dense>
12 #include <ostream>
13 #include <string>
14 #include <vector>
15 
16 #include "ioda/ObsDataVector.h"
17 #include "ioda/ObsSpace.h"
18 #include "oops/base/Variables.h"
19 #include "oops/util/ObjectCounter.h"
20 #include "oops/util/Printable.h"
21 
22 namespace ioda {
23 
24 //-----------------------------------------------------------------------------
25 /*! \brief ObsVector class to handle vectors in observation space for IODA
26  *
27  * \details This class holds observation vector data. Examples of an obs vector
28  * are the y vector and the H(x) vector. The methods of this class
29  * that implement vector operations (e.g., bitwise add, bitwise subtract,
30  * dot product) are capable of handling missing values in the obs data.
31  */
32 
33 class ObsVector : public util::Printable,
34  private util::ObjectCounter<ObsVector> {
35  public:
36  static const std::string classname() {return "ioda::ObsVector";}
37 
39  const std::string & name = "", const bool fail = true);
40  ObsVector(const ObsVector &);
41  ObsVector(ObsSpace &, const ObsVector &);
42  ~ObsVector();
43 
44  ObsVector & operator = (const ObsVector &);
45  ObsVector & operator*= (const double &);
46  ObsVector & operator+= (const ObsVector &);
47  ObsVector & operator-= (const ObsVector &);
48  ObsVector & operator*= (const ObsVector &);
49  ObsVector & operator/= (const ObsVector &);
50 
51  void zero();
52  void axpy(const double &, const ObsVector &);
53  void invert();
54  void random();
55  double dot_product_with(const ObsVector &) const;
56  double rms() const;
57 
58  std::size_t size() const {return values_.size();} // Size of vector in local memory
59  const double & operator[](const std::size_t ii) const {return values_.at(ii);}
60  double & operator[](const std::size_t ii) {return values_.at(ii);}
61  unsigned int nobs() const; // Number of active observations (missing values not included)
62  Eigen::VectorXd packEigen() const;
63 
64  const double & toFortran() const;
65  double & toFortran();
66 
67  const std::string & obstype() const {return obsdb_.obsname();}
68  const oops::Variables & varnames() const {return obsvars_;}
69  std::size_t nvars() const {return nvars_;}
70  std::size_t nlocs() const {return nlocs_;}
71  void mask(const ObsDataVector<int> &);
72  bool has(const std::string & var) const {return obsvars_.has(var);}
73 
74  int64_t getSeed() const {return obsdb_.getSeed();}
75 
76 // I/O
77  void save(const std::string &) const;
78  void read(const std::string &, const bool fail = true);
79 
80  private:
81  void print(std::ostream &) const;
82 
83  /*! \brief Associate ObsSpace object */
85 
86  /*! \brief Variables */
87  oops::Variables obsvars_;
88 
89  /*! \brief Number of variables */
90  std::size_t nvars_;
91  std::size_t nlocs_;
92 
93  /*! \brief Vector data */
94  std::vector<double> values_;
95 
96  /*! \brief Missing data mark */
97  const double missing_;
98 };
99 // -----------------------------------------------------------------------------
100 
101 } // namespace ioda
102 
103 #endif // OBSVECTOR_H_
ioda::ObsVector::invert
void invert()
Definition: ObsVector.cc:139
ioda::ObsVector::~ObsVector
~ObsVector()
Definition: ObsVector.cc:52
ioda::ObsVector::nvars
std::size_t nvars() const
Definition: src/ObsVector.h:69
ioda::ObsVector::rms
double rms() const
Definition: ObsVector.cc:169
ioda::ObsVector::obsdb_
ObsSpace & obsdb_
Associate ObsSpace object.
Definition: src/ObsVector.h:84
ioda::ObsVector::obsvars_
oops::Variables obsvars_
Variables.
Definition: src/ObsVector.h:87
ObsSpace.h
ioda::ObsVector::varnames
const oops::Variables & varnames() const
Definition: src/ObsVector.h:68
ioda::ObsVector::ObsVector
ObsVector(ObsSpace &, const std::string &name="", const bool fail=true)
Definition: ObsVector.cc:24
ioda::ObsVector::operator=
ObsVector & operator=(const ObsVector &)
Definition: ObsVector.cc:55
ioda::ObsVector::save
void save(const std::string &) const
Definition: ObsVector.cc:211
ioda::ObsVector::classname
static const std::string classname()
Definition: src/ObsVector.h:36
ioda::ObsVector::obstype
const std::string & obstype() const
Definition: src/ObsVector.h:67
ioda::ObsVector::mask
void mask(const ObsDataVector< int > &)
Definition: ObsVector.cc:240
ioda
Definition: IodaUtils.cc:13
ioda::ObsVector::print
void print(std::ostream &) const
Definition: ObsVector.cc:271
ioda::ObsVector::operator/=
ObsVector & operator/=(const ObsVector &)
Definition: ObsVector.cc:108
ioda::ObsVector::missing_
const double missing_
Missing data mark.
Definition: src/ObsVector.h:97
ioda::ObsVector
ObsVector class to handle vectors in observation space for IODA.
Definition: src/ObsVector.h:34
ioda::ObsVector::values_
std::vector< double > values_
Vector data.
Definition: src/ObsVector.h:94
ioda::ObsVector::nobs
unsigned int nobs() const
Definition: ObsVector.cc:252
ioda::ObsVector::random
void random()
Definition: ObsVector.cc:147
ioda::ObsVector::toFortran
const double & toFortran() const
Definition: ObsVector.cc:263
ioda::ObsSpace::obsname
const std::string & obsname() const
Definition: src/ObsSpace.h:97
ioda::ObsVector::dot_product_with
double dot_product_with(const ObsVector &) const
Definition: ObsVector.cc:154
ioda::ObsVector::axpy
void axpy(const double &, const ObsVector &)
Definition: ObsVector.cc:127
ioda::ObsVector::operator*=
ObsVector & operator*=(const double &)
Definition: ObsVector.cc:60
ioda::ObsVector::operator+=
ObsVector & operator+=(const ObsVector &)
Definition: ObsVector.cc:69
ioda::ObsVector::operator[]
double & operator[](const std::size_t ii)
Definition: src/ObsVector.h:60
ioda::ObsVector::has
bool has(const std::string &var) const
Definition: src/ObsVector.h:72
ioda::ObsVector::nvars_
std::size_t nvars_
Number of variables.
Definition: src/ObsVector.h:90
ioda::ObsDataVector
ObsDataVector<DATATYPE> handles vectors of data of type DATATYPE in observation space.
Definition: ObsDataVector.h:41
ioda::ObsVector::size
std::size_t size() const
Definition: src/ObsVector.h:58
ioda::ObsVector::packEigen
Eigen::VectorXd packEigen() const
Definition: ObsVector.cc:229
ioda::ObsSpace
Observation Space View.
Definition: src/ObsSpace.h:35
ioda::ObsVector::getSeed
int64_t getSeed() const
Definition: src/ObsVector.h:74
ioda::ObsVector::operator[]
const double & operator[](const std::size_t ii) const
Definition: src/ObsVector.h:59
ioda::ObsVector::read
void read(const std::string &, const bool fail=true)
Definition: ObsVector.cc:186
ioda::ObsVector::zero
void zero()
Definition: ObsVector.cc:121
ioda::ObsVector::nlocs
std::size_t nlocs() const
Definition: src/ObsVector.h:70
ioda::ObsVector::nlocs_
std::size_t nlocs_
Definition: src/ObsVector.h:91
ioda::ObsVector::operator-=
ObsVector & operator-=(const ObsVector &)
Definition: ObsVector.cc:82