IODA Bundle
oops/interface/ObsAuxCovariance.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_INTERFACE_OBSAUXCOVARIANCE_H_
12 #define OOPS_INTERFACE_OBSAUXCOVARIANCE_H_
13 
14 #include <iostream>
15 #include <memory>
16 #include <string>
17 
18 #include <boost/noncopyable.hpp>
19 
20 #include "eckit/config/Configuration.h"
24 #include "oops/util/Logger.h"
25 #include "oops/util/ObjectCounter.h"
26 #include "oops/util/Printable.h"
27 #include "oops/util/Timer.h"
28 
29 namespace oops {
30 
31 // -----------------------------------------------------------------------------
32 
33 template <typename OBS>
34 class ObsAuxCovariance : public util::Printable,
35  private boost::noncopyable,
36  private util::ObjectCounter<ObsAuxCovariance<OBS> > {
37  typedef typename OBS::ObsAuxCovariance ObsAuxCovariance_;
40 
41  public:
42  typedef typename ObsAuxCovariance_::Parameters_ Parameters_;
43 
44  static const std::string classname() {return "oops::ObsAuxCovariance";}
45 
46  ObsAuxCovariance(const ObsSpace<OBS> &, const Parameters_ &);
48 
49 /// Operators
50  void linearize(const ObsAuxControl_ &, const eckit::Configuration &);
51  void multiply(const ObsAuxIncrement_ &, ObsAuxIncrement_ &) const;
52  void inverseMultiply(const ObsAuxIncrement_ &, ObsAuxIncrement_ &) const;
53  void randomize(ObsAuxIncrement_ &) const;
54 
55  private:
56  void print(std::ostream &) const;
57  std::unique_ptr<ObsAuxCovariance_> cov_;
58 };
59 
60 // =============================================================================
61 
62 template<typename OBS>
64  const Parameters_ & params) : cov_()
65 {
66  Log::trace() << "ObsAuxCovariance<OBS>::ObsAuxCovariance starting" << std::endl;
67  util::Timer timer(classname(), "ObsAuxCovariance");
68  cov_.reset(new ObsAuxCovariance_(os.obsspace(), params));
69  Log::trace() << "ObsAuxCovariance<OBS>::ObsAuxCovariance done" << std::endl;
70 }
71 
72 // -----------------------------------------------------------------------------
73 
74 template<typename OBS>
76  Log::trace() << "ObsAuxCovariance<OBS>::~ObsAuxCovariance starting" << std::endl;
77  util::Timer timer(classname(), "~ObsAuxCovariance");
78  cov_.reset();
79  Log::trace() << "ObsAuxCovariance<OBS>::~ObsAuxCovariance done" << std::endl;
80 }
81 
82 // -----------------------------------------------------------------------------
83 
84 template<typename OBS>
86  const eckit::Configuration & innerConf) {
87  Log::trace() << "ObsAuxCovariance<OBS>::linearize starting" << std::endl;
88  util::Timer timer(classname(), "linearize");
89  cov_->linearize(xx.obsauxcontrol(), innerConf);
90  Log::trace() << "ObsAuxCovariance<OBS>::linearize done" << std::endl;
91 }
92 
93 // -----------------------------------------------------------------------------
94 
95 template<typename OBS>
97  Log::trace() << "ObsAuxCovariance<OBS>::multiply starting" << std::endl;
98  util::Timer timer(classname(), "multiply");
99  cov_->multiply(dx1.obsauxincrement(), dx2.obsauxincrement());
100  Log::trace() << "ObsAuxCovariance<OBS>::multiply done" << std::endl;
101 }
102 
103 // -----------------------------------------------------------------------------
104 
105 template<typename OBS>
107  ObsAuxIncrement_ & dx2) const {
108  Log::trace() << "ObsAuxCovariance<OBS>::inverseMultiply starting" << std::endl;
109  util::Timer timer(classname(), "inverseMultiply");
110  cov_->inverseMultiply(dx1.obsauxincrement(), dx2.obsauxincrement());
111  Log::trace() << "ObsAuxCovariance<OBS>::inverseMultiply done" << std::endl;
112 }
113 
114 // -----------------------------------------------------------------------------
115 
116 template<typename OBS>
118  Log::trace() << "ObsAuxCovariance<OBS>::randomize starting" << std::endl;
119  util::Timer timer(classname(), "randomize");
120  cov_->randomize(dx.obsauxincrement());
121  Log::trace() << "ObsAuxCovariance<OBS>::randomize done" << std::endl;
122 }
123 
124 // -----------------------------------------------------------------------------
125 
126 template<typename OBS>
127 void ObsAuxCovariance<OBS>::print(std::ostream & os) const {
128  Log::trace() << "ObsAuxCovariance<OBS>::print starting" << std::endl;
129  util::Timer timer(classname(), "print");
130  os << *cov_;
131  Log::trace() << "ObsAuxCovariance<OBS>::print done" << std::endl;
132 }
133 
134 // -----------------------------------------------------------------------------
135 
136 } // namespace oops
137 
138 #endif // OOPS_INTERFACE_OBSAUXCOVARIANCE_H_
const ObsAuxControl_ & obsauxcontrol() const
Interfacing.
static const std::string classname()
ObsAuxIncrement< OBS > ObsAuxIncrement_
void linearize(const ObsAuxControl_ &, const eckit::Configuration &)
Operators.
void multiply(const ObsAuxIncrement_ &, ObsAuxIncrement_ &) const
void print(std::ostream &) const
std::unique_ptr< ObsAuxCovariance_ > cov_
ObsAuxCovariance_::Parameters_ Parameters_
void randomize(ObsAuxIncrement_ &) const
void inverseMultiply(const ObsAuxIncrement_ &, ObsAuxIncrement_ &) const
ObsAuxCovariance(const ObsSpace< OBS > &, const Parameters_ &)
const ObsAuxIncrement_ & obsauxincrement() const
Interfacing.
ObsSpace_ & obsspace() const
Interfacing.
The namespace for the main oops code.