IODA Bundle
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 
35 // -----------------------------------------------------------------------------
36 template <typename OBS>
37 class ObsSpaces : public util::Printable,
38  private util::ObjectCounter<ObsSpaces<OBS> > {
40 
41  public:
42  static const std::string classname() {return "oops::ObsSpaces";}
43 
44  ObsSpaces(const eckit::Configuration &, const eckit::mpi::Comm &,
45  const util::DateTime &, const util::DateTime &,
46  const eckit::mpi::Comm & time = oops::mpi::myself());
47  ~ObsSpaces();
48 
49 /// Save files
50  void save() const;
51 
52 /// Access
53  std::size_t size() const {return spaces_.size();}
54  ObsSpace_ & operator[](const std::size_t ii) {return *spaces_.at(ii);}
55  const ObsSpace_ & operator[](const std::size_t ii) const {return *spaces_.at(ii);}
56 
57 /// Assimilation window
58  const util::DateTime & windowStart() const {return wbgn_;}
59  const util::DateTime & windowEnd() const {return wend_;}
60 
61  private:
62  void print(std::ostream &) const;
63 
64  std::vector<std::shared_ptr<ObsSpace_> > spaces_;
65  const util::DateTime wbgn_;
66  const util::DateTime wend_;
67 };
68 
69 // -----------------------------------------------------------------------------
70 
71 template <typename OBS>
72 ObsSpaces<OBS>::ObsSpaces(const eckit::Configuration & conf, const eckit::mpi::Comm & comm,
73  const util::DateTime & bgn, const util::DateTime & end,
74  const eckit::mpi::Comm & time)
75  : spaces_(0), wbgn_(bgn), wend_(end)
76 {
77  std::vector<eckit::LocalConfiguration> typeconfs = conf.getSubConfigurations();
78  for (std::size_t jj = 0; jj < typeconfs.size(); ++jj) {
79  eckit::LocalConfiguration obsconf(typeconfs[jj], "obs space");
80  Log::debug() << "ObsSpaces::ObsSpaces : conf " << obsconf << std::endl;
81  std::shared_ptr<ObsSpace_> tmp(new ObsSpace_(obsconf, comm, bgn, end, time));
82  spaces_.push_back(tmp);
83  }
84  ASSERT(spaces_.size() >0);
85 }
86 
87 // -----------------------------------------------------------------------------
88 
89 template <typename OBS>
91 
92 // -----------------------------------------------------------------------------
93 
94 template <typename OBS>
95 void ObsSpaces<OBS>::save() const {
96  for (std::size_t jj = 0; jj < spaces_.size(); ++jj) {
97  spaces_[jj]->save();
98  }
99 }
100 
101 // -----------------------------------------------------------------------------
102 
103 template <typename OBS>
104 void ObsSpaces<OBS>::print(std::ostream & os) const {
105  for (std::size_t jj = 0; jj < spaces_.size(); ++jj) {
106  os << *spaces_[jj];
107  }
108 }
109 
110 // -----------------------------------------------------------------------------
111 
112 } // namespace oops
113 
114 #endif // OOPS_BASE_OBSSPACES_H_
ObsSpace_ & operator[](const std::size_t ii)
Definition: ObsSpaces.h:54
const util::DateTime wend_
Definition: ObsSpaces.h:66
ObsSpace< OBS > ObsSpace_
Definition: ObsSpaces.h:39
const util::DateTime wbgn_
Definition: ObsSpaces.h:65
static const std::string classname()
Definition: ObsSpaces.h:42
std::vector< std::shared_ptr< ObsSpace_ > > spaces_
Definition: ObsSpaces.h:64
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:72
void save() const
Save files.
Definition: ObsSpaces.h:95
const ObsSpace_ & operator[](const std::size_t ii) const
Definition: ObsSpaces.h:55
const util::DateTime & windowStart() const
Assimilation window.
Definition: ObsSpaces.h:58
const util::DateTime & windowEnd() const
Definition: ObsSpaces.h:59
std::size_t size() const
Access.
Definition: ObsSpaces.h:53
void print(std::ostream &) const
Definition: ObsSpaces.h:104
const eckit::mpi::Comm & myself()
Default communicator with each MPI task by itself.
Definition: oops/mpi/mpi.cc:90
The namespace for the main oops code.