OOPS
Dirac.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_RUNS_DIRAC_H_
12 #define OOPS_RUNS_DIRAC_H_
13 
14 #include <memory>
15 #include <sstream>
16 #include <string>
17 #include <vector>
18 
19 #include "eckit/config/Configuration.h"
24 #include "oops/base/Variables.h"
27 #include "oops/interface/State.h"
28 #include "oops/mpi/mpi.h"
29 #include "oops/runs/Application.h"
30 #include "oops/util/DateTime.h"
31 #include "oops/util/Duration.h"
32 #include "oops/util/Logger.h"
33 
34 namespace oops {
35 
36 template <typename MODEL> class Dirac : public Application {
42  typedef std::shared_ptr<IncrementEnsemble<MODEL>> EnsemblePtr_;
43 
44  public:
45 // -----------------------------------------------------------------------------
46  explicit Dirac(const eckit::mpi::Comm & comm = oops::mpi::world()) : Application(comm) {
47  instantiateCovarFactory<MODEL>();
48  }
49 // -----------------------------------------------------------------------------
50  virtual ~Dirac() {}
51 // -----------------------------------------------------------------------------
52  int execute(const eckit::Configuration & fullConfig) const {
53  const eckit::LocalConfiguration backgroundConfig(fullConfig, "initial condition");
54  std::vector<eckit::LocalConfiguration> confs;
55  backgroundConfig.get("states", confs);
56  size_t nslots = confs.size();
57 
58  const eckit::mpi::Comm * commSpace = &this->getComm();
59  const eckit::mpi::Comm * commTime = &oops::mpi::myself();
60  if (nslots > 1) {
61  size_t ntasks = this->getComm().size();
62  ASSERT(ntasks % nslots == 0);
63  size_t myrank = this->getComm().rank();
64  size_t ntaskpslot = ntasks / nslots;
65  size_t myslot = myrank / ntaskpslot;
66 
67  // Create a communicator for same sub-window, to be used for communications in space
68  std::string sgeom = "comm_geom_" + std::to_string(myslot);
69  char const *geomName = sgeom.c_str();
70  commSpace = &this->getComm().split(myslot, geomName);
71  ASSERT(commSpace->size() == ntaskpslot);
72 
73  // Create a communicator for same local area, to be used for communications in time
74  size_t myarea = commSpace->rank();
75  std::string stime = "comm_time_" + std::to_string(myarea);
76  char const *timeName = stime.c_str();
77  commTime = &this->getComm().split(myarea, timeName);
78  ASSERT(commTime->size() == nslots);
79  }
80 
81  // Setup resolution
82  const eckit::LocalConfiguration resolConfig(fullConfig, "geometry");
83  const Geometry_ resol(resolConfig, *commSpace, *commTime);
84 
85  // Setup background state
86  State_ xx(resol, backgroundConfig);
87 
88  // Setup variables
89  const Variables vars = xx.variables();
90 
91  // Setup time
92  util::DateTime time = xx.validTime();
93 
94  // Apply B to Dirac
95  const eckit::LocalConfiguration covarConfig(fullConfig, "background error");
96 
97  // Covariance
98  std::unique_ptr<ModelSpaceCovarianceBase<MODEL>> B(CovarianceFactory<MODEL>::create(
99  covarConfig, resol, vars, xx, xx));
100 
101  // Setup Dirac
102  Increment_ dxdirin(resol, vars, time);
103  Increment_ dxdirout(resol, vars, time);
104  const eckit::LocalConfiguration diracConfig(fullConfig, "dirac");
105  dxdirin.dirac(diracConfig);
106  Log::test() << "Input Dirac increment: " << dxdirin << std::endl;
107 
108  // Apply 3D B matrix to Dirac increment
109  B->multiply(dxdirin, dxdirout);
110 
111  // Write increment
112  const eckit::LocalConfiguration output_B(fullConfig, "output B");
113  dxdirout.write(output_B);
114  Log::test() << "B * Increment: " << dxdirout << std::endl;
115 
116  // Setup localization and ensemble configurations
117  eckit::LocalConfiguration locConfig;
118  eckit::LocalConfiguration ensConfig;
119  bool hasLoc(false);
120  if (covarConfig.has("localization")) {
121  locConfig = eckit::LocalConfiguration(covarConfig, "localization");
122  ensConfig = covarConfig;
123  hasLoc = true;
124  } else {
125  if (covarConfig.has("ensemble")) {
126  ensConfig = eckit::LocalConfiguration(covarConfig, "ensemble");
127  if (ensConfig.has("localization")) {
128  locConfig = eckit::LocalConfiguration(ensConfig, "localization");
129  hasLoc = true;
130  }
131  }
132  }
133 
134  if (hasLoc) {
135  // Apply localization to Dirac
136 
137  // Setup Dirac
138  Increment_ dxdir(resol, vars, time);
139  const eckit::LocalConfiguration diracConfig(fullConfig, "dirac");
140  dxdir.dirac(diracConfig);
141 
142  // Setup localization
143  std::unique_ptr<Localization_> loc_ =
144  LocalizationFactory<MODEL>::create(resol, time, locConfig);
145 
146  // Apply localization
147  loc_->localize(dxdir);
148 
149  // Write increment
150  const eckit::LocalConfiguration output_localization(fullConfig, "output localization");
151  dxdir.write(output_localization);
152  Log::test() << "Localized Increment: " << dxdir << std::endl;
153  }
154 
155  return 0;
156  }
157 // -----------------------------------------------------------------------------
158  private:
159  std::string appname() const {
160  return "oops::Dirac<" + MODEL::name() + ">";
161  }
162 // -----------------------------------------------------------------------------
163 };
164 
165 } // namespace oops
166 #endif // OOPS_RUNS_DIRAC_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::Dirac::EnsemblePtr_
std::shared_ptr< IncrementEnsemble< MODEL > > EnsemblePtr_
Definition: Dirac.h:42
oops::LocalizationBase
Model-space localization base class.
Definition: LocalizationBase.h:38
oops::State::variables
const Variables & variables() const
Definition: oops/interface/State.h:226
IncrementEnsemble.h
oops::Dirac::Ensemble_
IncrementEnsemble< MODEL > Ensemble_
Definition: Dirac.h:41
ModelSpaceCovarianceBase.h
oops::CovarianceFactory
Covariance Factory.
Definition: ModelSpaceCovarianceBase.h:93
mpi.h
oops::Increment::dirac
void dirac(const eckit::Configuration &)
Definition: oops/interface/Increment.h:236
oops::mpi::myself
const eckit::mpi::Comm & myself()
Default communicator with each MPI task by itself.
Definition: oops/mpi/mpi.cc:28
oops::LocalizationFactory::create
static std::unique_ptr< LocalizationBase< MODEL > > create(const Geometry_ &, const util::DateTime &, const eckit::Configuration &)
Definition: LocalizationBase.h:141
oops::Dirac::Dirac
Dirac(const eckit::mpi::Comm &comm=oops::mpi::world())
Definition: Dirac.h:46
oops::Dirac::execute
int execute(const eckit::Configuration &fullConfig) const
Definition: Dirac.h:52
oops::Dirac::State_
State< MODEL > State_
Definition: Dirac.h:39
oops::Dirac
Definition: Dirac.h:36
oops::Dirac::Localization_
LocalizationBase< MODEL > Localization_
Definition: Dirac.h:40
oops::Dirac::~Dirac
virtual ~Dirac()
Definition: Dirac.h:50
Application.h
oops::Application::getComm
const eckit::mpi::Comm & getComm() const
Definition: Application.h:36
PostProcessor.h
oops::Dirac::appname
std::string appname() const
Definition: Dirac.h:159
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
instantiateCovarFactory.h
oops::Dirac::Increment_
Increment< MODEL > Increment_
Definition: Dirac.h:38
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::Dirac::Geometry_
Geometry< MODEL > Geometry_
Definition: Dirac.h:37
oops::IncrementEnsemble
Ensemble of inrements.
Definition: IncrementEnsemble.h:37
Variables.h
Geometry.h
Increment.h