OOPS
ObsSpaces.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2009-2016 ECMWF.
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  * In applying this licence, ECMWF does not waive the privileges and immunities
7  * granted to it by virtue of its status as an intergovernmental organisation nor
8  * does it submit to any jurisdiction.
9  */
10 
11 #ifndef OOPS_BASE_OBSSPACES_H_
12 #define OOPS_BASE_OBSSPACES_H_
13 
14 #include <cstddef>
15 #include <map>
16 #include <memory>
17 #include <ostream>
18 #include <string>
19 #include <vector>
20 
21 #include "eckit/config/LocalConfiguration.h"
22 #include "eckit/exception/Exceptions.h"
23 #include "eckit/geometry/Point2.h"
24 
26 #include "oops/mpi/mpi.h"
27 #include "oops/util/DateTime.h"
28 #include "oops/util/Logger.h"
29 #include "oops/util/ObjectCounter.h"
30 #include "oops/util/Printable.h"
31 #include "oops/util/Timer.h"
32 
33 namespace oops {
34  template <typename T>
35  class Departures;
36 
37 // -----------------------------------------------------------------------------
38 
39 template <typename OBS>
40 class ObsSpaces : public util::Printable,
41  private util::ObjectCounter<ObsSpaces<OBS> > {
44 
45  public:
46  static const std::string classname() {return "oops::ObsSpaces";}
47 
48  ObsSpaces(const eckit::Configuration &, const eckit::mpi::Comm &,
49  const util::DateTime &, const util::DateTime &,
50  const eckit::mpi::Comm & time = oops::mpi::myself());
51  ObsSpaces(const ObsSpaces &, const eckit::geometry::Point2 &, const eckit::Configuration &);
52 /// Constructor added for generic 1d-var under development in ufo
53  explicit ObsSpaces(const std::shared_ptr<ObsSpace_> &);
54  ~ObsSpaces();
55 
56 /// Access
57  std::size_t size() const {return spaces_.size();}
58  ObsSpace_ & operator[](const std::size_t ii) {return *spaces_.at(ii);}
59  const ObsSpace_ & operator[](const std::size_t ii) const {return *spaces_.at(ii);}
60 
61 /// Assimilation window
62  const util::DateTime & windowStart() const {return wbgn_;}
63  const util::DateTime & windowEnd() const {return wend_;}
64 
65 /// Other
66  void printJo(const Departures_ &, const Departures_ &) const; // To be changed
67 
68  private:
69  void print(std::ostream &) const;
70 
71  std::vector<std::shared_ptr<ObsSpace_> > spaces_;
72  const util::DateTime wbgn_;
73  const util::DateTime wend_;
74 };
75 
76 // -----------------------------------------------------------------------------
77 
78 template <typename OBS>
79 ObsSpaces<OBS>::ObsSpaces(const eckit::Configuration & conf, const eckit::mpi::Comm & comm,
80  const util::DateTime & bgn, const util::DateTime & end,
81  const eckit::mpi::Comm & time)
82  : spaces_(0), wbgn_(bgn), wend_(end)
83 {
84  const int seed_member = conf.getInt("obs perturbations seed", 0);
85  std::vector<eckit::LocalConfiguration> typeconfs;
86  conf.get("observations", typeconfs);
87  for (std::size_t jj = 0; jj < typeconfs.size(); ++jj) {
88  eckit::LocalConfiguration obsconf(typeconfs[jj], "obs space");
89  obsconf.set("obs perturbations seed", seed_member);
90  Log::debug() << "ObsSpaces::ObsSpaces : conf " << obsconf << std::endl;
91  std::shared_ptr<ObsSpace_> tmp(new ObsSpace_(obsconf, comm, bgn, end, time));
92  spaces_.push_back(tmp);
93  }
94  ASSERT(spaces_.size() >0);
95 }
96 
97 // -----------------------------------------------------------------------------
98 
99 template <typename OBS>
100 ObsSpaces<OBS>::ObsSpaces(const ObsSpaces<OBS> & obss, const eckit::geometry::Point2 & center,
101  const eckit::Configuration & conf)
102  : spaces_(0), wbgn_(obss.wbgn_), wend_(obss.wend_)
103 {
104  std::vector<eckit::LocalConfiguration> typeconfs;
105  conf.get("observations", typeconfs);
106  for (std::size_t jj = 0; jj < obss.size(); ++jj) {
107  eckit::LocalConfiguration locconf(typeconfs[jj], "obs error.localization");
108  std::shared_ptr<ObsSpace_> tmp(new ObsSpace_(obss[jj], center, locconf));
109  spaces_.push_back(tmp);
110  }
111  ASSERT(spaces_.size() == obss.size());
112 }
113 
114 // -----------------------------------------------------------------------------
115 /// Constructor added for generic 1d-var under development in ufo
116 template <typename OBS>
117 ObsSpaces<OBS>::ObsSpaces(const std::shared_ptr<ObsSpace_> & obss)
118  : spaces_(obss), wbgn_(obss->windowStart()), wend_(obss->windowEnd())
119 {}
120 
121 // -----------------------------------------------------------------------------
122 
123 template <typename OBS>
125 
126 // -----------------------------------------------------------------------------
127 
128 template <typename OBS>
129 void ObsSpaces<OBS>::print(std::ostream & os) const {
130  for (std::size_t jj = 0; jj < spaces_.size(); ++jj) {
131  os << *spaces_[jj];
132  }
133 }
134 
135 // -----------------------------------------------------------------------------
136 
137 template <typename OBS>
138 void ObsSpaces<OBS>::printJo(const Departures_ & dy, const Departures_ & grad) const {
139  for (std::size_t jj = 0; jj < spaces_.size(); ++jj) {
140  spaces_[jj]->printJo(dy[jj], grad[jj]);
141  }
142 }
143 
144 // -----------------------------------------------------------------------------
145 
146 } // namespace oops
147 
148 #endif // OOPS_BASE_OBSSPACES_H_
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ObsSpaces::operator[]
const ObsSpace_ & operator[](const std::size_t ii) const
Definition: ObsSpaces.h:59
oops::ObsSpaces::wbgn_
const util::DateTime wbgn_
Definition: ObsSpaces.h:72
oops::ObsSpaces::~ObsSpaces
~ObsSpaces()
Definition: ObsSpaces.h:124
oops::ObsSpaces::operator[]
ObsSpace_ & operator[](const std::size_t ii)
Definition: ObsSpaces.h:58
oops::ObsSpace
Definition: oops/interface/ObsSpace.h:42
mpi.h
oops::ObsSpaces::classname
static const std::string classname()
Definition: ObsSpaces.h:46
oops::mpi::myself
const eckit::mpi::Comm & myself()
Default communicator with each MPI task by itself.
Definition: oops/mpi/mpi.cc:28
oops::ObsSpaces::wend_
const util::DateTime wend_
Definition: ObsSpaces.h:73
oops::ObsSpaces::windowStart
const util::DateTime & windowStart() const
Assimilation window.
Definition: ObsSpaces.h:62
oops::ObsSpaces::size
std::size_t size() const
Access.
Definition: ObsSpaces.h:57
oops::Departures
Difference between two observation vectors.
Definition: oops/base/Departures.h:44
oops::ObsSpaces::windowEnd
const util::DateTime & windowEnd() const
Definition: ObsSpaces.h:63
oops::ObsSpaces::spaces_
std::vector< std::shared_ptr< ObsSpace_ > > spaces_
Definition: ObsSpaces.h:71
ObsSpace.h
oops::ObsSpaces::ObsSpace_
ObsSpace< OBS > ObsSpace_
Definition: ObsSpaces.h:43
oops::ObsSpaces::printJo
void printJo(const Departures_ &, const Departures_ &) const
Other.
Definition: ObsSpaces.h:138
oops::ObsSpaces::ObsSpaces
ObsSpaces(const eckit::Configuration &, const eckit::mpi::Comm &, const util::DateTime &, const util::DateTime &, const eckit::mpi::Comm &time=oops::mpi::myself())
Definition: ObsSpaces.h:79
oops::ObsSpaces
Definition: ObsSpaces.h:41
oops::ObsSpaces::Departures_
Departures< OBS > Departures_
Definition: ObsSpaces.h:42
oops::ObsSpaces::print
void print(std::ostream &) const
Definition: ObsSpaces.h:129