OOPS
oops/interface/ObsSpace.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2009-2016 ECMWF.
3  * (C) Copyright 2017-2019 UCAR.
4  *
5  * This software is licensed under the terms of the Apache Licence Version 2.0
6  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
7  * In applying this licence, ECMWF does not waive the privileges and immunities
8  * granted to it by virtue of its status as an intergovernmental organisation nor
9  * does it submit to any jurisdiction.
10  */
11 
12 #ifndef OOPS_INTERFACE_OBSSPACE_H_
13 #define OOPS_INTERFACE_OBSSPACE_H_
14 
15 #include <memory>
16 #include <ostream>
17 #include <string>
18 
19 #include "eckit/geometry/Point2.h"
20 #include "oops/base/Variables.h"
21 #include "oops/mpi/mpi.h"
22 #include "oops/util/Logger.h"
23 #include "oops/util/ObjectCounter.h"
24 #include "oops/util/Printable.h"
25 #include "oops/util/Timer.h"
26 
27 namespace eckit {
28  class Configuration;
29 }
30 
31 namespace util {
32  class DateTime;
33 }
34 
35 namespace oops {
36  template <typename T> class ObsVector;
37 
38 // -----------------------------------------------------------------------------
39 
40 template <typename OBS>
41 class ObsSpace : public util::Printable,
42  private util::ObjectCounter<ObsSpace<OBS> > {
43  typedef typename OBS::ObsSpace ObsSpace_;
45 
46  public:
47  static const std::string classname() {return "oops::ObsSpace";}
48 
49  ObsSpace(const eckit::Configuration &, const eckit::mpi::Comm &,
50  const util::DateTime &, const util::DateTime &,
51  const eckit::mpi::Comm & time = oops::mpi::myself());
52  ObsSpace(const ObsSpace &, const eckit::geometry::Point2 &,
53  const eckit::Configuration &);
54 /// Constructor added for generic 1d-var under development in ufo
55  ObsSpace(const ObsSpace_ &, const eckit::geometry::Point2 &,
56  const eckit::Configuration &);
57  explicit ObsSpace(const ObsSpace_ &);
58  ~ObsSpace();
59 
60 /// Interfacing
61  ObsSpace_ & obsspace() const {return *obsdb_;} // const problem? YT
62 
63 /// Assimilation window
64  const util::DateTime & windowStart() const {return obsdb_->windowStart();}
65  const util::DateTime & windowEnd() const {return obsdb_->windowEnd();}
66 
67  const Variables & obsvariables() const;
68 
69 // Other
70  void printJo(const ObsVector_ &, const ObsVector_ &) const;
71  const std::string & obsname() const {return obsdb_->obsname();}
72 
73  const eckit::mpi::Comm & timeComm() const {return time_;}
74 
75  private:
76  void print(std::ostream &) const;
77 
78  std::shared_ptr<ObsSpace_> obsdb_;
79  const eckit::mpi::Comm & time_;
80 };
81 
82 // -----------------------------------------------------------------------------
83 
84 template <typename OBS>
85 ObsSpace<OBS>::ObsSpace(const eckit::Configuration & conf,
86  const eckit::mpi::Comm & comm,
87  const util::DateTime & bgn,
88  const util::DateTime & end,
89  const eckit::mpi::Comm & time) : obsdb_(), time_(time) {
90  Log::trace() << "ObsSpace<OBS>::ObsSpace starting" << std::endl;
91  util::Timer timer(classname(), "ObsSpace");
92  obsdb_.reset(new ObsSpace_(conf, comm, bgn, end, time));
93  Log::trace() << "ObsSpace<OBS>::ObsSpace done" << std::endl;
94 }
95 
96 // -----------------------------------------------------------------------------
97 
98 template <typename OBS>
100  const eckit::geometry::Point2 & center,
101  const eckit::Configuration & conf) : obsdb_(), time_(oops::mpi::myself()) {
102  Log::trace() << "ObsSpace<OBS>::ObsSpace (local) starting" << std::endl;
103  util::Timer timer(classname(), "ObsSpace");
104  obsdb_.reset(new ObsSpace_(os.obsspace(), center, conf));
105  Log::trace() << "ObsSpace<OBS>::ObsSpace (local) done" << std::endl;
106 }
107 
108 // -----------------------------------------------------------------------------
109 /// Constructor added for generic 1d-var under development in ufo
110 template <typename OBS>
111 ObsSpace<OBS>::ObsSpace(const ObsSpace_ & os, const eckit::geometry::Point2 & center,
112  const eckit::Configuration & conf): obsdb_(), time_(oops::mpi::myself()) {
113  Log::trace() << "ObsSpace<OBS>::ObsSpace (local) derived state starting" << std::endl;
114  util::Timer timer(classname(), "ObsSpace");
115  obsdb_.reset(new ObsSpace_(os, center, conf));
116  Log::trace() << "ObsSpace<OBS>::ObsSpace (local) derived state done" << std::endl;
117 }
118 
119 // -----------------------------------------------------------------------------
120 
121 template <typename OBS>
122 ObsSpace<OBS>::ObsSpace(const ObsSpace_ & other) : obsdb_(), time_(other.time_) {
123  Log::trace() << "ObsSpace<OBS>::ObsSpace starting" << std::endl;
124  util::Timer timer(classname(), "ObsSpace");
125  obsdb_ = other.obsdb_;
126  Log::trace() << "ObsSpace<OBS>::ObsSpace done" << std::endl;
127 }
128 
129 // -----------------------------------------------------------------------------
130 
131 template <typename OBS>
133  Log::trace() << "ObsSpace<OBS>::~ObsSpace starting" << std::endl;
134  util::Timer timer(classname(), "~ObsSpace");
135  obsdb_.reset();
136  Log::trace() << "ObsSpace<OBS>::~ObsSpace done" << std::endl;
137 }
138 
139 // -----------------------------------------------------------------------------
140 
141 template <typename OBS>
142 void ObsSpace<OBS>::print(std::ostream & os) const {
143  Log::trace() << "ObsSpace<OBS>::print starting" << std::endl;
144  util::Timer timer(classname(), "print");
145  os << *obsdb_;
146  Log::trace() << "ObsSpace<OBS>::print done" << std::endl;
147 }
148 
149 // -----------------------------------------------------------------------------
150 //
151 template <typename OBS>
153  Log::trace() << "ObsSpace<OBS>::obsvariables starting" << std::endl;
154  util::Timer timer(classname(), "obsvariables");
155  return obsdb_->obsvariables();
156 }
157 
158 // -----------------------------------------------------------------------------
159 
160 template <typename OBS>
161 void ObsSpace<OBS>::printJo(const ObsVector_ & dy, const ObsVector_ & grad) const {
162  Log::trace() << "ObsSpace<OBS>::printJo starting" << std::endl;
163  util::Timer timer(classname(), "printJo");
164  obsdb_->printJo(dy.obsvector(), grad.obsvector());
165  Log::trace() << "ObsSpace<OBS>::printJo done" << std::endl;
166 }
167 
168 // -----------------------------------------------------------------------------
169 
170 } // namespace oops
171 
172 #endif // OOPS_INTERFACE_OBSSPACE_H_
oops::ObsVector::obsvector
ObsVector_ & obsvector()
Interfacing.
Definition: oops/interface/ObsVector.h:54
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ObsSpace::windowStart
const util::DateTime & windowStart() const
Assimilation window.
Definition: oops/interface/ObsSpace.h:64
oops::ObsSpace::windowEnd
const util::DateTime & windowEnd() const
Definition: oops/interface/ObsSpace.h:65
oops::ObsSpace::ObsVector_
ObsVector< OBS > ObsVector_
Definition: oops/interface/ObsSpace.h:44
oops::ObsSpace
Definition: oops/interface/ObsSpace.h:42
mpi.h
oops::ObsSpace::printJo
void printJo(const ObsVector_ &, const ObsVector_ &) const
Definition: oops/interface/ObsSpace.h:161
oops::ObsSpace::obsspace
ObsSpace_ & obsspace() const
Interfacing.
Definition: oops/interface/ObsSpace.h:61
oops::ObsSpace::time_
const eckit::mpi::Comm & time_
Definition: oops/interface/ObsSpace.h:79
oops::ObsSpace::obsname
const std::string & obsname() const
Definition: oops/interface/ObsSpace.h:71
oops::ObsSpace::~ObsSpace
~ObsSpace()
Definition: oops/interface/ObsSpace.h:132
oops::ObsVector
Definition: oops/interface/ObsSpace.h:36
oops::mpi::myself
const eckit::mpi::Comm & myself()
Default communicator with each MPI task by itself.
Definition: oops/mpi/mpi.cc:28
eckit
Definition: FieldL95.h:22
oops::ObsSpace::obsdb_
std::shared_ptr< ObsSpace_ > obsdb_
Definition: oops/interface/ObsSpace.h:78
oops::ObsSpace::obsvariables
const Variables & obsvariables() const
Definition: oops/interface/ObsSpace.h:152
oops::ObsSpace::ObsSpace
ObsSpace(const eckit::Configuration &, const eckit::mpi::Comm &, const util::DateTime &, const util::DateTime &, const eckit::mpi::Comm &time=oops::mpi::myself())
Definition: oops/interface/ObsSpace.h:85
oops::ObsSpace::classname
static const std::string classname()
Definition: oops/interface/ObsSpace.h:47
oops::ObsSpace::print
void print(std::ostream &) const
Definition: oops/interface/ObsSpace.h:142
oops::ObsSpace::ObsSpace_
OBS::ObsSpace ObsSpace_
Definition: oops/interface/ObsSpace.h:43
oops::ObsSpace::timeComm
const eckit::mpi::Comm & timeComm() const
Definition: oops/interface/ObsSpace.h:73
oops::Variables
Definition: oops/base/Variables.h:23
util
Definition: ObservationL95.h:32
Variables.h