OOPS
HybridCovariance.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_BASE_HYBRIDCOVARIANCE_H_
12 #define OOPS_BASE_HYBRIDCOVARIANCE_H_
13 
14 #include <memory>
15 
16 #include "eckit/config/LocalConfiguration.h"
17 #include "eckit/exception/Exceptions.h"
22 #include "oops/base/Variables.h"
25 #include "oops/interface/State.h"
26 #include "oops/util/DateTime.h"
27 #include "oops/util/Logger.h"
28 
29 namespace oops {
30 
31 /// Generic hybrid static-ensemble model space error covariance.
32 
33 // -----------------------------------------------------------------------------
34 template <typename MODEL>
39 
40  public:
41  HybridCovariance(const Geometry_ &, const Variables &,
42  const eckit::Configuration &, const State_ &, const State_ &);
44 
45  private:
46  void doRandomize(Increment_ &) const override;
47  void doMultiply(const Increment_ &, Increment_ &) const override;
48  void doInverseMultiply(const Increment_ &, Increment_ &) const override;
49 
50  std::unique_ptr< ModelSpaceCovarianceBase<MODEL> > static_;
51  std::unique_ptr< EnsembleCovariance<MODEL> > ensemble_;
52  double ensWeight_;
53  double staWeight_;
54 };
55 
56 // =============================================================================
57 
58 /// Constructor, destructor
59 // -----------------------------------------------------------------------------
60 template<typename MODEL>
62  const eckit::Configuration & config,
63  const State_ & xb, const State_ & fg)
64  : ModelSpaceCovarianceBase<MODEL>(xb, fg, resol, config),
65  static_(CovarianceFactory<MODEL>::create(
66  eckit::LocalConfiguration(config, "static"), resol, vars, xb, fg))
67 {
68  const eckit::LocalConfiguration ensConf(config, "ensemble");
69  ensemble_.reset(new EnsembleCovariance<MODEL>(resol, vars, ensConf, xb, fg));
70 
71  ensWeight_ = config.getDouble("ensemble weight");
72  ASSERT(ensWeight_ > 0.0);
73  staWeight_ = config.getDouble("static weight");
74  ASSERT(staWeight_ > 0.0);
75  Log::trace() << "HybridCovariance created." << std::endl;
76 }
77 // -----------------------------------------------------------------------------
78 template<typename MODEL>
80  Log::trace() << "HybridCovariance destructed" << std::endl;
81 }
82 // -----------------------------------------------------------------------------
83 template<typename MODEL>
85  static_->multiply(dxi, dxo);
86  dxo *= staWeight_;
87  Increment_ tmp(dxo);
88  ensemble_->multiply(dxi, tmp);
89  dxo.axpy(ensWeight_, tmp);
90 }
91 // -----------------------------------------------------------------------------
92 template<typename MODEL>
95  dxo.zero();
96  GMRESR(dxo, dxi, *this, Id, 10, 1.0e-3);
97 }
98 // -----------------------------------------------------------------------------
99 template<typename MODEL>
101  throw eckit::NotImplemented("HybridCovariance::doRandomize: Would it make sense?", Here());
102 }
103 // -----------------------------------------------------------------------------
104 } // namespace oops
105 
106 #endif // OOPS_BASE_HYBRIDCOVARIANCE_H_
oops::HybridCovariance::State_
State< MODEL > State_
Definition: HybridCovariance.h:38
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::GMRESR
double GMRESR(VECTOR &xx, const VECTOR &bb, const AMATRIX &A, const PMATRIX &precond, const int maxiter, const double tolerance)
Definition: GMRESR.h:63
IdentityMatrix.h
ModelSpaceCovarianceBase.h
oops::CovarianceFactory
Covariance Factory.
Definition: ModelSpaceCovarianceBase.h:93
oops::Increment::zero
void zero()
Linear algebra operators.
Definition: oops/interface/Increment.h:206
oops::HybridCovariance::ensWeight_
double ensWeight_
Definition: HybridCovariance.h:52
GMRESR.h
GMRESR solver for Ax=b.
oops::HybridCovariance::staWeight_
double staWeight_
Definition: HybridCovariance.h:53
oops::HybridCovariance::doRandomize
void doRandomize(Increment_ &) const override
Definition: HybridCovariance.h:100
oops::Increment::axpy
void axpy(const double &, const Increment &, const bool check=true)
Definition: oops/interface/Increment.h:290
oops::EnsembleCovariance
Generic ensemble based model space error covariance.
Definition: EnsembleCovariance.h:36
oops::HybridCovariance::HybridCovariance
HybridCovariance(const Geometry_ &, const Variables &, const eckit::Configuration &, const State_ &, const State_ &)
Constructor, destructor.
Definition: HybridCovariance.h:61
oops::HybridCovariance::doInverseMultiply
void doInverseMultiply(const Increment_ &, Increment_ &) const override
Definition: HybridCovariance.h:93
eckit
Definition: FieldL95.h:22
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
oops::HybridCovariance::Increment_
Increment< MODEL > Increment_
Definition: HybridCovariance.h:37
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::IdentityMatrix
Identity matrix.
Definition: IdentityMatrix.h:18
oops::HybridCovariance::Geometry_
Geometry< MODEL > Geometry_
Definition: HybridCovariance.h:36
State.h
oops::HybridCovariance::~HybridCovariance
~HybridCovariance()
Definition: HybridCovariance.h:79
oops::Variables
Definition: oops/base/Variables.h:23
oops::ModelSpaceCovarianceBase
Definition: ModelSpaceCovarianceBase.h:61
oops::HybridCovariance::ensemble_
std::unique_ptr< EnsembleCovariance< MODEL > > ensemble_
Definition: HybridCovariance.h:51
EnsembleCovariance.h
oops::Increment
Increment Class: Difference between two states.
Definition: CostJbState.h:27
oops::HybridCovariance
Generic hybrid static-ensemble model space error covariance.
Definition: HybridCovariance.h:35
oops::HybridCovariance::doMultiply
void doMultiply(const Increment_ &, Increment_ &) const override
Definition: HybridCovariance.h:84
Variables.h
Geometry.h
Increment.h
oops::HybridCovariance::static_
std::unique_ptr< ModelSpaceCovarianceBase< MODEL > > static_
Definition: HybridCovariance.h:50