OOPS
EnsembleCovariance.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_ENSEMBLECOVARIANCE_H_
12 #define OOPS_BASE_ENSEMBLECOVARIANCE_H_
13 
14 #include <memory>
15 #include <vector>
16 
17 #include "eckit/config/LocalConfiguration.h"
18 #include "eckit/exception/Exceptions.h"
24 #include "oops/base/Variables.h"
27 #include "oops/interface/State.h"
28 #include "oops/util/Logger.h"
29 
30 namespace oops {
31 
32 /// Generic ensemble based model space error covariance.
33 
34 // -----------------------------------------------------------------------------
35 template <typename MODEL>
42  typedef std::shared_ptr<IncrementEnsemble<MODEL>> EnsemblePtr_;
43 
44  public:
45  EnsembleCovariance(const Geometry_ &, const Variables &,
46  const eckit::Configuration &, const State_ &, const State_ &);
48 
49  private:
50  void doRandomize(Increment_ &) const override;
51  void doMultiply(const Increment_ &, Increment_ &) const override;
52  void doInverseMultiply(const Increment_ &, Increment_ &) const override;
53 
55  std::unique_ptr<Localization_> loc_;
56 };
57 
58 // =============================================================================
59 
60 /// Constructor, destructor
61 // -----------------------------------------------------------------------------
62 template<typename MODEL>
64  const eckit::Configuration & conf,
65  const State_ & xb, const State_ & fg)
66  : ModelSpaceCovarianceBase<MODEL>(xb, fg, resol, conf), ens_(), loc_()
67 {
68  Log::trace() << "EnsembleCovariance::EnsembleCovariance start" << std::endl;
69  ens_.reset(new Ensemble_(conf, xb, fg, resol, vars));
70  if (conf.has("localization")) {
71  const eckit::LocalConfiguration confloc(conf, "localization");
72  loc_ = LocalizationFactory<MODEL>::create(resol, xb.validTime(), confloc);
73  }
74  Log::trace() << "EnsembleCovariance::EnsembleCovariance done" << std::endl;
75 }
76 // -----------------------------------------------------------------------------
77 template<typename MODEL>
79  Log::trace() << "EnsembleCovariance destructed." << std::endl;
80 }
81 // -----------------------------------------------------------------------------
82 template<typename MODEL>
84  dxo.zero();
85  for (unsigned int ie = 0; ie < ens_->size(); ++ie) {
86  if (loc_) {
87  // Localized covariance matrix
88  Increment_ dx(dxi);
89  dx.schur_product_with((*ens_)[ie]);
90  loc_->localize(dx);
91  dx.schur_product_with((*ens_)[ie]);
92  dxo.axpy(1.0, dx, false);
93  } else {
94  // Raw covariance matrix
95  double wgt = dxi.dot_product_with((*ens_)[ie]);
96  dxo.axpy(wgt, (*ens_)[ie], false);
97  }
98  }
99  const double rk = 1.0/(static_cast<double>(ens_->size()) - 1.0);
100  dxo *= rk;
101 }
102 // -----------------------------------------------------------------------------
103 template<typename MODEL>
106  dxo.zero();
107  GMRESR(dxo, dxi, *this, Id, 10, 1.0e-3);
108 }
109 // -----------------------------------------------------------------------------
110 template<typename MODEL>
112  throw eckit::NotImplemented("EnsembleCovariance::doRandomize: Would it make sense?", Here());
113 }
114 // -----------------------------------------------------------------------------
115 } // namespace oops
116 
117 #endif // OOPS_BASE_ENSEMBLECOVARIANCE_H_
oops::State::validTime
const util::DateTime validTime() const
Time.
Definition: oops/interface/State.h:60
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
oops::LocalizationBase
Model-space localization base class.
Definition: LocalizationBase.h:38
IncrementEnsemble.h
IdentityMatrix.h
oops::EnsembleCovariance::loc_
std::unique_ptr< Localization_ > loc_
Definition: EnsembleCovariance.h:55
ModelSpaceCovarianceBase.h
oops::Increment::zero
void zero()
Linear algebra operators.
Definition: oops/interface/Increment.h:206
oops::EnsembleCovariance::EnsemblePtr_
std::shared_ptr< IncrementEnsemble< MODEL > > EnsemblePtr_
Definition: EnsembleCovariance.h:42
GMRESR.h
GMRESR solver for Ax=b.
oops::EnsembleCovariance::State_
State< MODEL > State_
Definition: EnsembleCovariance.h:40
oops::EnsembleCovariance::Geometry_
Geometry< MODEL > Geometry_
Definition: EnsembleCovariance.h:37
oops::Increment::dot_product_with
double dot_product_with(const Increment &) const
Definition: oops/interface/Increment.h:300
oops::EnsembleCovariance::ens_
EnsemblePtr_ ens_
Definition: EnsembleCovariance.h:54
oops::LocalizationFactory::create
static std::unique_ptr< LocalizationBase< MODEL > > create(const Geometry_ &, const util::DateTime &, const eckit::Configuration &)
Definition: LocalizationBase.h:141
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::EnsembleCovariance::doInverseMultiply
void doInverseMultiply(const Increment_ &, Increment_ &) const override
Definition: EnsembleCovariance.h:104
oops::EnsembleCovariance::Increment_
Increment< MODEL > Increment_
Definition: EnsembleCovariance.h:38
LocalizationBase.h
oops::EnsembleCovariance::Localization_
LocalizationBase< MODEL > Localization_
Definition: EnsembleCovariance.h:39
oops::EnsembleCovariance::EnsembleCovariance
EnsembleCovariance(const Geometry_ &, const Variables &, const eckit::Configuration &, const State_ &, const State_ &)
Constructor, destructor.
Definition: EnsembleCovariance.h:63
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
oops::EnsembleCovariance::doRandomize
void doRandomize(Increment_ &) const override
Definition: EnsembleCovariance.h:111
oops::Increment::schur_product_with
void schur_product_with(const Increment &)
Definition: oops/interface/Increment.h:312
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::IdentityMatrix
Identity matrix.
Definition: IdentityMatrix.h:18
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::IncrementEnsemble
Ensemble of inrements.
Definition: IncrementEnsemble.h:37
oops::EnsembleCovariance::doMultiply
void doMultiply(const Increment_ &, Increment_ &) const override
Definition: EnsembleCovariance.h:83
oops::EnsembleCovariance::Ensemble_
IncrementEnsemble< MODEL > Ensemble_
Definition: EnsembleCovariance.h:41
Variables.h
oops::EnsembleCovariance::~EnsembleCovariance
~EnsembleCovariance()
Definition: EnsembleCovariance.h:78
Geometry.h
Increment.h