OOPS
ObsAuxControls.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2017-2019 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 OOPS_BASE_OBSAUXCONTROLS_H_
9 #define OOPS_BASE_OBSAUXCONTROLS_H_
10 
11 #include <iostream>
12 #include <memory>
13 #include <string>
14 #include <vector>
15 
16 #include "oops/base/ObsSpaces.h"
18 #include "oops/util/Logger.h"
19 #include "oops/util/Printable.h"
20 
21 namespace oops {
22 
23 // -----------------------------------------------------------------------------
24 
25 template <typename OBS>
26 class ObsAuxControls : public util::Printable {
29 
30  public:
31  static const std::string classname() {return "oops::ObsAuxControls";}
32 
33  ObsAuxControls(const ObsSpaces_ &, const eckit::Configuration &);
34  explicit ObsAuxControls(const ObsAuxControls &, const bool copy = true);
36 
37 /// Access
38  std::size_t size() const {return auxs_.size();}
39  const ObsAuxControl_ & operator[](const std::size_t ii) const {return *auxs_.at(ii);}
40  ObsAuxControl_ & operator[](const std::size_t ii) {return *auxs_.at(ii);}
41 
42 /// I/O and diagnostics
43  void read(const eckit::Configuration &);
44  void write(const eckit::Configuration &) const;
45  double norm() const;
46 
48 
49  private:
50  void print(std::ostream &) const;
51  std::vector<std::unique_ptr<ObsAuxControl_> > auxs_;
52 };
53 
54 // =============================================================================
55 
56 template<typename OBS>
57 ObsAuxControls<OBS>::ObsAuxControls(const ObsSpaces_ & odb, const eckit::Configuration & conf)
58  : auxs_(0)
59 {
60  std::vector<eckit::LocalConfiguration> obsconf;
61  conf.get("observations", obsconf);
62  for (std::size_t jobs = 0; jobs < obsconf.size(); ++jobs) {
63  auxs_.push_back(
64  std::unique_ptr<ObsAuxControl_>(new ObsAuxControl_(odb[jobs], obsconf[jobs])));
65  }
66 }
67 
68 // -----------------------------------------------------------------------------
69 
70 template<typename OBS>
71 ObsAuxControls<OBS>::ObsAuxControls(const ObsAuxControls & other, const bool copy)
72  : auxs_(other.size())
73 {
74  Log::trace() << "ObsAuxControls<OBS>::ObsAuxControls copy starting" << std::endl;
75  for (std::size_t jobs = 0; jobs < other.size(); ++jobs) {
76  auxs_[jobs].reset(new ObsAuxControl_(other[jobs], copy));
77  }
78  Log::trace() << "ObsAuxControls<OBS>::ObsAuxControls copy done" << std::endl;
79 }
80 
81 // -----------------------------------------------------------------------------
82 
83 template<typename OBS>
85  Log::trace() << "ObsAuxControls<OBS>::~ObsAuxControls starting" << std::endl;
86  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs].reset();
87  Log::trace() << "ObsAuxControls<OBS>::~ObsAuxControls done" << std::endl;
88 }
89 
90 // -----------------------------------------------------------------------------
91 
92 template<typename OBS>
93 void ObsAuxControls<OBS>::read(const eckit::Configuration & conf) {
94  Log::trace() << "ObsAuxControls<OBS>::read starting" << std::endl;
95  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->read(conf);
96  Log::trace() << "ObsAuxControls<OBS>::read done" << std::endl;
97 }
98 
99 // -----------------------------------------------------------------------------
100 
101 template<typename OBS>
102 void ObsAuxControls<OBS>::write(const eckit::Configuration & conf) const {
103  Log::trace() << "ObsAuxControls<OBS>::write starting" << std::endl;
104  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) auxs_[jobs]->write(conf);
105  Log::trace() << "ObsAuxControls<OBS>::write done" << std::endl;
106 }
107 
108 // -----------------------------------------------------------------------------
109 
110 template<typename OBS>
112  Log::trace() << "ObsAuxControls<OBS>::norm starting" << std::endl;
113  double zz = static_cast<double>(0.0);
114  std::size_t ii = 0;
115  double norm;
116  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) {
117  norm = auxs_[jobs]->norm();
118  if (norm > 0.0) {
119  zz += norm*norm;
120  ++ii;
121  }
122  }
123  Log::trace() << "ObsAuxControls<OBS>::norm done" << std::endl;
124  return std::sqrt(zz/ii);
125 }
126 
127 // -----------------------------------------------------------------------------
128 
129 template<typename OBS>
130 void ObsAuxControls<OBS>::print(std::ostream & os) const {
131  for (std::size_t jobs = 0; jobs < auxs_.size(); ++jobs) os << *auxs_[jobs];
132 }
133 
134 // -----------------------------------------------------------------------------
135 
136 } // namespace oops
137 
138 #endif // OOPS_BASE_OBSAUXCONTROLS_H_
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ObsAuxControls::operator=
ObsAuxControls & operator=(const ObsAuxControls &)
ObsAuxControl.h
oops::ObsAuxControls::auxs_
std::vector< std::unique_ptr< ObsAuxControl_ > > auxs_
Definition: ObsAuxControls.h:51
unstructured_interpolation_mod::write
subroutine write(self, filename_in)
Definition: unstructured_interpolation_mod.F90:363
oops::ObsAuxControls
Definition: ObsAuxControls.h:26
ObsSpaces.h
oops::ObsAuxControls::operator[]
ObsAuxControl_ & operator[](const std::size_t ii)
Definition: ObsAuxControls.h:40
oops::ObsAuxControls::write
void write(const eckit::Configuration &) const
Definition: ObsAuxControls.h:102
oops::ObsAuxControl
Definition: oops/interface/ObsAuxControl.h:35
oops::ObsAuxControls::operator[]
const ObsAuxControl_ & operator[](const std::size_t ii) const
Definition: ObsAuxControls.h:39
oops::ObsAuxControls::ObsSpaces_
ObsSpaces< OBS > ObsSpaces_
Definition: ObsAuxControls.h:28
oops::ObsAuxControls::ObsAuxControl_
ObsAuxControl< OBS > ObsAuxControl_
Definition: ObsAuxControls.h:27
oops::ObsAuxControls::size
std::size_t size() const
Access.
Definition: ObsAuxControls.h:38
oops::ObsAuxControls::~ObsAuxControls
~ObsAuxControls()
Definition: ObsAuxControls.h:84
oops::ObsAuxControls::read
void read(const eckit::Configuration &)
I/O and diagnostics.
Definition: ObsAuxControls.h:93
oops::ObsSpaces
Definition: ObsSpaces.h:41
oops::ObsAuxControls::norm
double norm() const
Definition: ObsAuxControls.h:111
oops::ObsAuxControls::classname
static const std::string classname()
Definition: ObsAuxControls.h:31
oops::ObsAuxControls::ObsAuxControls
ObsAuxControls(const ObsSpaces_ &, const eckit::Configuration &)
Definition: ObsAuxControls.h:57
oops::ObsAuxControls::print
void print(std::ostream &) const
Definition: ObsAuxControls.h:130