OOPS
oops/interface/ErrorCovariance.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_ERRORCOVARIANCE_H_
12 #define OOPS_INTERFACE_ERRORCOVARIANCE_H_
13 
14 #include <memory>
15 #include <string>
16 
17 #include <boost/noncopyable.hpp>
18 
20 #include "oops/base/Variables.h"
23 #include "oops/interface/State.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 eckit {
30  class Configuration;
31 }
32 
33 namespace oops {
34 
35 // -----------------------------------------------------------------------------
36 
37 // Should factory be here and generic covariances wrtten at the MODEL::Increment level? YT
38 
39 /// Wrapper for model space error covariances.
40 /*!
41  * This class provides the operations associated with the model space error
42  * covariance matrices (B or Q). It wraps the actual error covariance matrix
43  * which can be a model specific one or a generic one.
44  */
45 
46 template <typename MODEL>
48  public util::Printable,
49  private util::ObjectCounter<ErrorCovariance<MODEL> >,
50  private boost::noncopyable {
51  typedef typename MODEL::Covariance Covariance_;
55 
56  public:
57  /// Defined as Covariance_::Parameters_ if Covariance_ defines a Parameters_ type; otherwise as
58  /// GenericModelSpaceCovarianceParameters<MODEL>.
59  typedef TParameters_IfAvailableElseFallbackType_t<
61 
62  static const std::string classname() {return "oops::ErrorCovariance";}
63 
64  ErrorCovariance(const Geometry_ &, const Variables &, const Parameters_ &,
65  const State_ &, const State_ &);
66  ErrorCovariance(const Geometry_ &, const Variables &, const eckit::Configuration &,
67  const State_ &, const State_ &);
68  virtual ~ErrorCovariance();
69 
70  private:
71  void doRandomize(Increment_ &) const override;
72  void doMultiply(const Increment_ &, Increment_ &) const override;
73  void doInverseMultiply(const Increment_ &, Increment_ &) const override;
74 
75  void print(std::ostream &) const override;
76 
77  std::unique_ptr<Covariance_> covariance_;
78 };
79 
80 // =============================================================================
81 
82 template<typename MODEL>
84  const Parameters_ & parameters,
85  const State_ & xb, const State_ & fg)
86  : ModelSpaceCovarianceBase<MODEL>(xb, fg, resol, parameters), covariance_()
87 {
88  Log::trace() << "ErrorCovariance<MODEL>::ErrorCovariance starting" << std::endl;
89  util::Timer timer(classname(), "ErrorCovariance");
90  covariance_.reset(new Covariance_(resol.geometry(), vars,
91  parametersOrConfiguration<HasParameters_<Covariance_>::value>(
92  parameters),
93  xb.state(), fg.state()));
94  Log::trace() << "ErrorCovariance<MODEL>::ErrorCovariance done" << std::endl;
95 }
96 
97 // -----------------------------------------------------------------------------
98 
99 template<typename MODEL>
101  const eckit::Configuration & conf,
102  const State_ & xb, const State_ & fg)
103  : ErrorCovariance<MODEL>(resol, vars,
104  validateAndDeserialize<Parameters_>(conf),
105  xb, fg)
106 {}
107 
108 // -----------------------------------------------------------------------------
109 
110 template<typename MODEL>
112  Log::trace() << "ErrorCovariance<MODEL>::~ErrorCovariance starting" << std::endl;
113  util::Timer timer(classname(), "~ErrorCovariance");
114  covariance_.reset();
115  Log::trace() << "ErrorCovariance<MODEL>::~ErrorCovariance done" << std::endl;
116 }
117 
118 // -----------------------------------------------------------------------------
119 
120 template<typename MODEL>
122  Log::trace() << "ErrorCovariance<MODEL>::doRandomize starting" << std::endl;
123  util::Timer timer(classname(), "doRandomize");
124  covariance_->randomize(dx.increment());
125  Log::trace() << "ErrorCovariance<MODEL>::doRandomize done" << std::endl;
126 }
127 
128 // -----------------------------------------------------------------------------
129 
130 template<typename MODEL>
132  Log::trace() << "ErrorCovariance<MODEL>::doMultiply starting" << std::endl;
133  util::Timer timer(classname(), "doMultiply");
134  covariance_->multiply(dx1.increment(), dx2.increment());
135  Log::trace() << "ErrorCovariance<MODEL>::doMultiply done" << std::endl;
136 }
137 
138 // -----------------------------------------------------------------------------
139 
140 template<typename MODEL>
142  Log::trace() << "ErrorCovariance<MODEL>::doInverseMultiply starting" << std::endl;
143  util::Timer timer(classname(), "doInverseMultiply");
144  covariance_->inverseMultiply(dx1.increment(), dx2.increment());
145  Log::trace() << "ErrorCovariance<MODEL>::doInverseMultiply done" << std::endl;
146 }
147 
148 // -----------------------------------------------------------------------------
149 
150 template<typename MODEL>
151 void ErrorCovariance<MODEL>::print(std::ostream & os) const {
152  Log::trace() << "ErrorCovariance<MODEL>::print starting" << std::endl;
153  util::Timer timer(classname(), "print");
154  os << *covariance_;
155  Log::trace() << "ErrorCovariance<MODEL>::print done" << std::endl;
156 }
157 
158 // -----------------------------------------------------------------------------
159 
160 } // namespace oops
161 
162 #endif // OOPS_INTERFACE_ERRORCOVARIANCE_H_
oops::GenericModelSpaceCovarianceParameters
A subclass of ModelSpaceCovarianceParametersBase storing the values of all options in a single Config...
Definition: ModelSpaceCovarianceBase.h:108
oops::ErrorCovariance::print
void print(std::ostream &) const override
Definition: oops/interface/ErrorCovariance.h:151
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ErrorCovariance::State_
State< MODEL > State_
Definition: oops/interface/ErrorCovariance.h:54
oops::ErrorCovariance::doMultiply
void doMultiply(const Increment_ &, Increment_ &) const override
Definition: oops/interface/ErrorCovariance.h:131
ModelSpaceCovarianceBase.h
oops::ErrorCovariance::doInverseMultiply
void doInverseMultiply(const Increment_ &, Increment_ &) const override
Definition: oops/interface/ErrorCovariance.h:141
oops::ErrorCovariance::classname
static const std::string classname()
Definition: oops/interface/ErrorCovariance.h:62
oops::ErrorCovariance::doRandomize
void doRandomize(Increment_ &) const override
Definition: oops/interface/ErrorCovariance.h:121
oops::State::state
State_ & state()
Interfacing.
Definition: oops/interface/State.h:56
oops::ErrorCovariance::covariance_
std::unique_ptr< Covariance_ > covariance_
Definition: oops/interface/ErrorCovariance.h:77
eckit
Definition: FieldL95.h:22
oops::ErrorCovariance::~ErrorCovariance
virtual ~ErrorCovariance()
Definition: oops/interface/ErrorCovariance.h:111
oops::Increment::increment
Increment_ & increment()
Interfacing.
Definition: oops/interface/Increment.h:65
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
oops::ErrorCovariance::Geometry_
Geometry< MODEL > Geometry_
Definition: oops/interface/ErrorCovariance.h:52
oops::ErrorCovariance::ErrorCovariance
ErrorCovariance(const Geometry_ &, const Variables &, const Parameters_ &, const State_ &, const State_ &)
Definition: oops/interface/ErrorCovariance.h:83
oops::ErrorCovariance
Wrapper for model space error covariances.
Definition: oops/interface/ErrorCovariance.h:50
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::ErrorCovariance::Covariance_
MODEL::Covariance Covariance_
Definition: oops/interface/ErrorCovariance.h:51
oops::ErrorCovariance::Increment_
Increment< MODEL > Increment_
Definition: oops/interface/ErrorCovariance.h:53
State.h
oops::Variables
Definition: oops/base/Variables.h:23
oops::ModelSpaceCovarianceBase
Definition: ModelSpaceCovarianceBase.h:61
oops::Increment
Increment Class: Difference between two states.
Definition: CostJbState.h:27
oops::ErrorCovariance::Parameters_
TParameters_IfAvailableElseFallbackType_t< Covariance_, GenericModelSpaceCovarianceParameters< MODEL > > Parameters_
Definition: oops/interface/ErrorCovariance.h:60
Variables.h
Geometry.h
oops::Geometry::geometry
const Geometry_ & geometry() const
Interfacing with other oops classes.
Definition: oops/interface/Geometry.h:206
Increment.h