OOPS
ObsErrorDiag.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_GENERIC_OBSERRORDIAG_H_
12 #define OOPS_GENERIC_OBSERRORDIAG_H_
13 
14 #include <sstream>
15 
16 #include "eckit/config/Configuration.h"
17 #include "oops/base/ObsErrorBase.h"
20 #include "oops/util/Logger.h"
21 #include "oops/util/parameters/Parameter.h"
22 #include "oops/util/parameters/Parameters.h"
23 
24 namespace oops {
25 
26 /// \brief Parameters for diagonal obs errors
27 class ObsErrorDiagParameters : public Parameters {
28  OOPS_CONCRETE_PARAMETERS(ObsErrorDiagParameters, Parameters)
29  public:
30  /// perturbation amplitude multiplier
31  Parameter<double> pert{"random amplitude", 1.0, this};
32 };
33 
34 // -----------------------------------------------------------------------------
35 /// \brief Diagonal observation error covariance matrix.
36 template<typename OBS>
37 class ObsErrorDiag : public ObsErrorBase<OBS> {
40 
41  public:
42  ObsErrorDiag(const eckit::Configuration &, const ObsSpace_ &);
43 
44 /// Multiply a Departure by \f$R\f$
45  void multiply(ObsVector_ &) const override;
46 
47 /// Multiply a Departure by \f$R^{-1}\f$
48  void inverseMultiply(ObsVector_ &) const override;
49 
50 /// Generate random perturbation
51  void randomize(ObsVector_ &) const override;
52 
53 /// Get mean error for Jo table
54  double getRMSE() const override {return stddev_.rms();}
55 
56 /// Return inverseVariance
57  const ObsVector_ & inverseVariance() const override {return inverseVariance_;}
58 
59  protected:
62 
63  private:
64  void print(std::ostream &) const override;
66 };
67 
68 // =============================================================================
69 
70 template<typename OBS>
71 ObsErrorDiag<OBS>::ObsErrorDiag(const eckit::Configuration & conf, const ObsSpace_ & obsgeom)
72  : stddev_(obsgeom, "EffectiveError"), inverseVariance_(obsgeom)
73 {
74  options_.deserialize(conf);
78  Log::trace() << "ObsErrorDiag:ObsErrorDiag constructed nobs = " << stddev_.nobs() << std::endl;
79 }
80 
81 // -----------------------------------------------------------------------------
82 
83 template<typename OBS>
85  dy /= inverseVariance_;
86 }
87 
88 // -----------------------------------------------------------------------------
89 
90 template<typename OBS>
92  dy *= inverseVariance_;
93 }
94 
95 // -----------------------------------------------------------------------------
96 
97 template<typename OBS>
99  dy.random();
100  dy *= stddev_;
101  dy *= options_.pert;
102 }
103 
104 // -----------------------------------------------------------------------------
105 
106 template<typename OBS>
107 void ObsErrorDiag<OBS>::print(std::ostream & os) const {
108  os << "Diagonal observation error covariance, inverse variances: "
109  << inverseVariance_ << std::endl;
110 }
111 
112 // -----------------------------------------------------------------------------
113 
114 
115 } // namespace oops
116 
117 #endif // OOPS_GENERIC_OBSERRORDIAG_H_
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ObsErrorDiag::inverseMultiply
void inverseMultiply(ObsVector_ &) const override
Multiply a Departure by .
Definition: ObsErrorDiag.h:91
oops::ObsErrorDiag::ObsVector_
ObsVector< OBS > ObsVector_
Definition: ObsErrorDiag.h:39
oops::ObsVector::nobs
unsigned int nobs() const
Definition: oops/interface/ObsVector.h:279
oops::ObsSpace
Definition: oops/interface/ObsSpace.h:42
oops::ObsErrorBase
Base class for observation error covariance matrices.
Definition: ObsErrorBase.h:32
oops::ObsVector::rms
double rms() const
Definition: oops/interface/ObsVector.h:260
oops::ObsErrorDiag::stddev_
ObsVector_ stddev_
Definition: ObsErrorDiag.h:60
oops::ObsErrorDiag::ObsSpace_
ObsSpace< OBS > ObsSpace_
Definition: ObsErrorDiag.h:38
oops::ObsErrorDiag::options_
ObsErrorDiagParameters options_
Definition: ObsErrorDiag.h:65
oops::ObsErrorDiagParameters::pert
Parameter< double > pert
perturbation amplitude multiplier
Definition: ObsErrorDiag.h:31
oops::ObsVector
Definition: oops/interface/ObsSpace.h:36
oops::ObsErrorDiag::randomize
void randomize(ObsVector_ &) const override
Generate random perturbation.
Definition: ObsErrorDiag.h:98
oops::ObsVector::random
void random()
Definition: oops/interface/ObsVector.h:230
oops::ObsErrorDiag::multiply
void multiply(ObsVector_ &) const override
Multiply a Departure by .
Definition: ObsErrorDiag.h:84
ObsSpace.h
oops::ObsVector::invert
void invert()
Definition: oops/interface/ObsVector.h:220
oops::ObsErrorDiag::inverseVariance_
ObsVector_ inverseVariance_
Definition: ObsErrorDiag.h:61
oops::ObsErrorDiagParameters
Parameters for diagonal obs errors.
Definition: ObsErrorDiag.h:27
oops::ObsErrorDiag::print
void print(std::ostream &) const override
Definition: ObsErrorDiag.h:107
ObsVector.h
ObsErrorBase.h
oops::ObsErrorDiag::inverseVariance
const ObsVector_ & inverseVariance() const override
Return inverseVariance.
Definition: ObsErrorDiag.h:57
oops::ObsErrorDiag::ObsErrorDiag
ObsErrorDiag(const eckit::Configuration &, const ObsSpace_ &)
Definition: ObsErrorDiag.h:71
oops::ObsErrorDiag::getRMSE
double getRMSE() const override
Get mean error for Jo table.
Definition: ObsErrorDiag.h:54
oops::ObsErrorDiag
Diagonal observation error covariance matrix.
Definition: ObsErrorDiag.h:37