OOPS
EnsVariance.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 UCAR
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  */
7 
8 #ifndef OOPS_RUNS_ENSVARIANCE_H_
9 #define OOPS_RUNS_ENSVARIANCE_H_
10 
11 #include <memory>
12 #include <string>
13 #include <vector>
14 
15 
16 #include "eckit/config/LocalConfiguration.h"
18 #include "oops/base/Variables.h"
20 #include "oops/interface/State.h"
21 #include "oops/mpi/mpi.h"
22 #include "oops/runs/Application.h"
23 #include "oops/util/DateTime.h"
24 
25 namespace oops {
26 
27 template <typename MODEL> class EnsVariance : public Application {
32 
33  public:
34  // -----------------------------------------------------------------------------
35  explicit EnsVariance(const eckit::mpi::Comm & comm = oops::mpi::world()) : Application(comm) {}
36  // -----------------------------------------------------------------------------
37  virtual ~EnsVariance() {}
38  // -----------------------------------------------------------------------------
39  int execute(const eckit::Configuration & fullConfig) const {
40  // Setup Geometry
41  const eckit::LocalConfiguration resolConfig(fullConfig, "geometry");
42  const Geometry_ resol(resolConfig, this->getComm());
43 
44  // Setup background
45  const eckit::LocalConfiguration bkgConfig(fullConfig, "background");
46  State_ xx(resol, bkgConfig);
47 
48  // Compute transformed ensemble perturbations
49  // ens_k = K^-1 dx_k
50  const eckit::LocalConfiguration ensConfig(fullConfig, "ensemble");
51  Variables vars(ensConfig, "output variables");
52  Ensemble_ ens_k(ensConfig, xx, xx, resol, vars);
53 
54  // Get ensemble size
55  unsigned nm = ens_k.size();
56 
57  // Compute ensemble standard deviation
58  Increment_ km1dx(ens_k[0]);
59  km1dx.zero();
60  Increment_ sigb2(km1dx);
61  sigb2.zero();
62 
63  for (unsigned jj = 0; jj < nm; ++jj) {
64  km1dx = ens_k[jj];
65 
66  // Accumulate km1dx^2
67  km1dx.schur_product_with(km1dx);
68  sigb2 += km1dx;
69  }
70  const double rk = 1.0/(static_cast<double>(nm) - 1.0);
71  sigb2 *= rk;
72 
73  // Write variance to file
74  const eckit::LocalConfiguration varianceout(fullConfig, "variance output");
75  sigb2.write(varianceout);
76  Log::test() << "Variance: " << std::endl << sigb2 << std::endl;
77 
78  return 0;
79  }
80  // -----------------------------------------------------------------------------
81  private:
82  std::string appname() const {
83  return "oops::EnsVariance<" + MODEL::name() + ">";
84  }
85  // -----------------------------------------------------------------------------
86 };
87 
88 } // namespace oops
89 
90 #endif // OOPS_RUNS_ENSVARIANCE_H_
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
IncrementEnsemble.h
oops::EnsVariance::execute
int execute(const eckit::Configuration &fullConfig) const
Definition: EnsVariance.h:39
mpi.h
oops::EnsVariance::EnsVariance
EnsVariance(const eckit::mpi::Comm &comm=oops::mpi::world())
Definition: EnsVariance.h:35
oops::Increment::zero
void zero()
Linear algebra operators.
Definition: oops/interface/Increment.h:206
oops::EnsVariance::Ensemble_
IncrementEnsemble< MODEL > Ensemble_
Definition: EnsVariance.h:28
oops::EnsVariance::~EnsVariance
virtual ~EnsVariance()
Definition: EnsVariance.h:37
oops::EnsVariance::Geometry_
Geometry< MODEL > Geometry_
Definition: EnsVariance.h:29
oops::EnsVariance::appname
std::string appname() const
Definition: EnsVariance.h:82
Application.h
oops::Application::getComm
const eckit::mpi::Comm & getComm() const
Definition: Application.h:36
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
oops::EnsVariance
Definition: EnsVariance.h:27
oops::IncrementEnsemble::size
size_t size() const
Accessors.
Definition: IncrementEnsemble.h:58
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::Increment::write
void write(const eckit::Configuration &) const
Definition: oops/interface/Increment.h:373
oops::Application
Definition: Application.h:29
State.h
oops::mpi::world
const eckit::mpi::Comm & world()
Default communicator with all MPI tasks (ie MPI_COMM_WORLD)
Definition: oops/mpi/mpi.cc:22
oops::Variables
Definition: oops/base/Variables.h:23
oops::Increment
Increment Class: Difference between two states.
Definition: CostJbState.h:27
oops::EnsVariance::Increment_
Increment< MODEL > Increment_
Definition: EnsVariance.h:30
oops::IncrementEnsemble
Ensemble of inrements.
Definition: IncrementEnsemble.h:37
oops::EnsVariance::State_
State< MODEL > State_
Definition: EnsVariance.h:31
Variables.h
Geometry.h