OOPS
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  static const std::string classname() {return "oops::ObsAuxCovariance";}
43 
44  ObsAuxCovariance(const ObsSpace<OBS> &, const eckit::Configuration &);
46 
47 /// Operators
48  void linearize(const ObsAuxControl_ &, const eckit::Configuration &);
49  void multiply(const ObsAuxIncrement_ &, ObsAuxIncrement_ &) const;
50  void inverseMultiply(const ObsAuxIncrement_ &, ObsAuxIncrement_ &) const;
51  void randomize(ObsAuxIncrement_ &) const;
52 
53  const eckit::Configuration & config() const {return cov_->config();}
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 eckit::Configuration & conf) : cov_()
65 {
66  Log::trace() << "ObsAuxCovariance<OBS>::ObsAuxCovariance starting" << std::endl;
67  util::Timer timer(classname(), "ObsAuxCovariance");
68  cov_.reset(new ObsAuxCovariance_(os.obsspace(), conf));
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_
oops::ObsAuxCovariance::ObsAuxControl_
ObsAuxControl< OBS > ObsAuxControl_
Definition: oops/interface/ObsAuxCovariance.h:38
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
ObsAuxIncrement.h
oops::ObsAuxCovariance::classname
static const std::string classname()
Definition: oops/interface/ObsAuxCovariance.h:42
ObsAuxControl.h
oops::ObsAuxCovariance::multiply
void multiply(const ObsAuxIncrement_ &, ObsAuxIncrement_ &) const
Definition: oops/interface/ObsAuxCovariance.h:96
oops::ObsSpace
Definition: oops/interface/ObsSpace.h:42
oops::ObsAuxIncrement
Definition: oops/interface/ObsAuxIncrement.h:38
oops::ObsAuxCovariance::print
void print(std::ostream &) const
Definition: oops/interface/ObsAuxCovariance.h:127
oops::ObsAuxCovariance::randomize
void randomize(ObsAuxIncrement_ &) const
Definition: oops/interface/ObsAuxCovariance.h:117
oops::ObsSpace::obsspace
ObsSpace_ & obsspace() const
Interfacing.
Definition: oops/interface/ObsSpace.h:61
oops::ObsAuxCovariance::ObsAuxIncrement_
ObsAuxIncrement< OBS > ObsAuxIncrement_
Definition: oops/interface/ObsAuxCovariance.h:39
oops::ObsAuxCovariance::cov_
std::unique_ptr< ObsAuxCovariance_ > cov_
Definition: oops/interface/ObsAuxCovariance.h:57
oops::ObsAuxControl
Definition: oops/interface/ObsAuxControl.h:35
oops::ObsAuxIncrement::obsauxincrement
const ObsAuxIncrement_ & obsauxincrement() const
Interfacing.
Definition: oops/interface/ObsAuxIncrement.h:52
oops::ObsAuxCovariance::linearize
void linearize(const ObsAuxControl_ &, const eckit::Configuration &)
Operators.
Definition: oops/interface/ObsAuxCovariance.h:85
oops::ObsAuxCovariance::ObsAuxCovariance_
OBS::ObsAuxCovariance ObsAuxCovariance_
Definition: oops/interface/ObsAuxCovariance.h:37
oops::ObsAuxCovariance
Definition: oops/interface/ObsAuxCovariance.h:36
oops::ObsAuxCovariance::ObsAuxCovariance
ObsAuxCovariance(const ObsSpace< OBS > &, const eckit::Configuration &)
Definition: oops/interface/ObsAuxCovariance.h:63
oops::ObsAuxCovariance::~ObsAuxCovariance
~ObsAuxCovariance()
Definition: oops/interface/ObsAuxCovariance.h:75
ObsSpace.h
oops::ObsAuxCovariance::config
const eckit::Configuration & config() const
Definition: oops/interface/ObsAuxCovariance.h:53
oops::ObsAuxCovariance::inverseMultiply
void inverseMultiply(const ObsAuxIncrement_ &, ObsAuxIncrement_ &) const
Definition: oops/interface/ObsAuxCovariance.h:106
oops::ObsAuxControl::obsauxcontrol
const ObsAuxControl_ & obsauxcontrol() const
Interfacing.
Definition: oops/interface/ObsAuxControl.h:46