OOPS
Variational.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_VARIATIONAL_H_
12 #define OOPS_RUNS_VARIATIONAL_H_
13 
14 #include <memory>
15 #include <string>
16 
17 
18 #include "eckit/config/LocalConfiguration.h"
26 #include "oops/base/Observations.h"
28 #include "oops/base/StateInfo.h"
29 #include "oops/base/StateWriter.h"
34 #include "oops/interface/Model.h"
35 #include "oops/interface/State.h"
36 #include "oops/mpi/mpi.h"
37 #include "oops/runs/Application.h"
38 #include "oops/util/DateTime.h"
39 #include "oops/util/Duration.h"
40 #include "oops/util/Logger.h"
41 
42 namespace oops {
43 
44 template <typename MODEL, typename OBS> class Variational : public Application {
48 
49  public:
50 // -----------------------------------------------------------------------------
51  explicit Variational(const eckit::mpi::Comm & comm = oops::mpi::world()) : Application(comm) {
52  instantiateCostFactory<MODEL, OBS>();
53  instantiateCovarFactory<MODEL>();
54  instantiateMinFactory<MODEL, OBS>();
55  instantiateObsErrorFactory<OBS>();
56  instantiateObsFilterFactory<OBS>();
57  instantiateTlmFactory<MODEL>();
58  instantiateVariableChangeFactory<MODEL>();
59  }
60 // -----------------------------------------------------------------------------
61  virtual ~Variational() {}
62 // -----------------------------------------------------------------------------
63  int execute(const eckit::Configuration & fullConfig) const {
64 /// The background is constructed inside the cost function because its valid
65 /// time within the assimilation window can be different (3D-Var vs. 4D-Var),
66 /// it can be 3D or 4D (strong vs weak constraint), etc...
67 
68 // Setup cost function
69  eckit::LocalConfiguration cfConf(fullConfig, "cost function");
70  std::unique_ptr<CostFunction<MODEL, OBS>>
71  J(CostFactory<MODEL, OBS>::create(cfConf, this->getComm()));
72  Log::trace() << "Variational: cost function has been set up" << std::endl;
73 
74 // Initialize first guess from background
75  ControlVariable<MODEL, OBS> xx(J->jb().getBackground());
76  Log::trace() << "Variational: first guess has been set up" << std::endl;
77 
78 // Perform Incremental Variational Assimilation
79  eckit::LocalConfiguration varConf(fullConfig, "variational");
80  int iouter = IncrementalAssimilation<MODEL, OBS>(xx, *J, varConf);
81  Log::info() << "Variational: incremental assimilation done "
82  << iouter << " iterations." << std::endl;
83 
84 // Save analysis and final diagnostics
86  const util::DateTime winbgn(cfConf.getString("window begin"));
87  const eckit::LocalConfiguration outConfig(fullConfig, "output");
88  post.enrollProcessor(new StateWriter<State_>(outConfig));
89 
90  eckit::LocalConfiguration finalConfig(fullConfig, "final");
91  finalConfig.set("iteration", iouter);
92  if (finalConfig.has("prints")) {
93  const eckit::LocalConfiguration prtConfig(finalConfig, "prints");
94  post.enrollProcessor(new StateInfo<State_>("final", prtConfig));
95  }
96 
97  J->evaluate(xx, finalConfig, post);
98 
99 // Save ObsAux
100  xx.obsVar().write(cfConf);
101 
102  return 0;
103  }
104 // -----------------------------------------------------------------------------
105  private:
106  std::string appname() const {
107  return "oops::Variational<" + MODEL::name() + ", " + OBS::name() + ">";
108  }
109 // -----------------------------------------------------------------------------
110 };
111 
112 } // namespace oops
113 #endif // OOPS_RUNS_VARIATIONAL_H_
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
instantiateObsFilterFactory.h
oops::ControlVariable::obsVar
ObsAuxCtrls_ & obsVar()
Get augmented observation control variable.
Definition: ControlVariable.h:77
oops::Variational::Model_
Model< MODEL > Model_
Definition: Variational.h:46
instantiateTlmFactory.h
oops::Variational::State_
State< MODEL > State_
Definition: Variational.h:47
IncrementalAssimilation.h
oops::ControlVariable
Control variable.
Definition: ControlVariable.h:41
CostFunction.h
mpi.h
instantiateCostFactory.h
instantiateObsErrorFactory.h
oops::StateWriter
Handles writing-out of forecast fields.
Definition: StateWriter.h:26
oops::CostFactory
Cost Function Factory.
Definition: CostFunction.h:129
Observations.h
oops::PostProcessor::enrollProcessor
void enrollProcessor(PostBase_ *pp)
Definition: PostProcessor.h:38
Application.h
oops::Variational::appname
std::string appname() const
Definition: Variational.h:106
instantiateVariableChangeFactory.h
oops::Application::getComm
const eckit::mpi::Comm & getComm() const
Definition: Application.h:36
PostProcessor.h
oops::StateInfo
Handles writing-out of forecast fields.
Definition: StateInfo.h:28
oops::Variational::Geometry_
Geometry< MODEL > Geometry_
Definition: Variational.h:45
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
Model.h
oops::Variational::Variational
Variational(const eckit::mpi::Comm &comm=oops::mpi::world())
Definition: Variational.h:51
instantiateCovarFactory.h
oops::Variational
Definition: Variational.h:44
StateInfo.h
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::Application
Definition: Application.h:29
oops::PostProcessor
Control model post processing.
Definition: PostProcessor.h:30
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::Variational::execute
int execute(const eckit::Configuration &fullConfig) const
Definition: Variational.h:63
StateWriter.h
instantiateMinFactory.h
oops::Variational::~Variational
virtual ~Variational()
Definition: Variational.h:61
ControlVariable.h
oops::Model
Encapsulates the nonlinear forecast model Note: to see methods that need to be implemented in the for...
Definition: oops/interface/Model.h:54
Geometry.h