OOPS
CostFct4DVar.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_ASSIMILATION_COSTFCT4DVAR_H_
12 #define OOPS_ASSIMILATION_COSTFCT4DVAR_H_
13 
14 #include <memory>
15 
16 #include "eckit/config/LocalConfiguration.h"
17 #include "eckit/mpi/Comm.h"
26 #include "oops/base/StateInfo.h"
29 #include "oops/base/Variables.h"
33 #include "oops/interface/Model.h"
34 #include "oops/interface/State.h"
35 #include "oops/util/DateTime.h"
36 #include "oops/util/Duration.h"
37 #include "oops/util/Logger.h"
38 
39 namespace oops {
40 
41 /// Strong Constraint 4D-Var Cost Function
42 /*!
43  * This class is not really necessary since it is only a special
44  * case of the more general weak constraint 4D-Var cost function
45  * with one sub-window. It is provided for readability.
46  */
47 
48 // -----------------------------------------------------------------------------
49 
50 template<typename MODEL, typename OBS> class CostFct4DVar : public CostFunction<MODEL, OBS> {
61 
62  public:
63  CostFct4DVar(const eckit::Configuration &, const eckit::mpi::Comm &);
65 
68  const bool idModel = false) const override;
71  const bool idModel = false) const override;
72  void zeroAD(CtrlInc_ &) const override;
73 
74  void runNL(CtrlVar_ &, PostProcessor<State_>&) const override;
75 
76  private:
77  void addIncr(CtrlVar_ &, const CtrlInc_ &, PostProcessor<Increment_>&) const override;
78 
79  CostJb3D<MODEL> * newJb(const eckit::Configuration &, const Geometry_ &,
80  const CtrlVar_ &) const override;
81  CostJo<MODEL, OBS> * newJo(const eckit::Configuration &) const override;
82  CostTermBase<MODEL, OBS> * newJc(const eckit::Configuration &, const Geometry_ &) const override;
83  void doLinearize(const Geometry_ &, const eckit::Configuration &,
84  const CtrlVar_ &, const CtrlVar_ &,
86  const Geometry_ & geometry() const override {return resol_;}
87 
88  util::Duration windowLength_;
89  util::DateTime windowBegin_;
90  util::DateTime windowEnd_;
91  const eckit::mpi::Comm & comm_;
95  std::shared_ptr<LinearModel_> tlm_;
96  std::unique_ptr<VarCha_> an2model_;
97  std::unique_ptr<LinVarCha_> inc2model_;
98 };
99 
100 // =============================================================================
101 
102 template<typename MODEL, typename OBS>
103 CostFct4DVar<MODEL, OBS>::CostFct4DVar(const eckit::Configuration & config,
104  const eckit::mpi::Comm & comm)
105  : CostFunction<MODEL, OBS>::CostFunction(config), comm_(comm),
106  resol_(eckit::LocalConfiguration(config, "geometry"), comm),
107  model_(resol_, eckit::LocalConfiguration(config, "model")),
108  ctlvars_(config, "analysis variables"), tlm_(), an2model_(), inc2model_()
109 {
110  Log::trace() << "CostFct4DVar:CostFct4DVar" << std::endl;
111  windowLength_ = util::Duration(config.getString("window length"));
112  windowBegin_ = util::DateTime(config.getString("window begin"));
114  this->setupTerms(config);
115  // ASSERT(ctlvars_ <= this->background().state().variables());
117  Log::trace() << "CostFct4DVar constructed" << std::endl;
118 }
119 
120 // -----------------------------------------------------------------------------
121 
122 template <typename MODEL, typename OBS>
123 CostJb3D<MODEL> * CostFct4DVar<MODEL, OBS>::newJb(const eckit::Configuration & jbConf,
124  const Geometry_ & resol,
125  const CtrlVar_ & xb) const {
126  return new CostJb3D<MODEL>(jbConf, resol, ctlvars_, windowLength_, xb.state());
127 }
128 
129 // -----------------------------------------------------------------------------
130 
131 template <typename MODEL, typename OBS>
132 CostJo<MODEL, OBS> * CostFct4DVar<MODEL, OBS>::newJo(const eckit::Configuration & joConf) const {
133  return new CostJo<MODEL, OBS>(joConf, comm_, windowBegin_, windowEnd_);
134 }
135 
136 // -----------------------------------------------------------------------------
137 
138 template <typename MODEL, typename OBS>
139 CostTermBase<MODEL, OBS> * CostFct4DVar<MODEL, OBS>::newJc(const eckit::Configuration & jcConf,
140  const Geometry_ & resol) const {
141  const eckit::LocalConfiguration jcdfi(jcConf, "jcdfi");
142  const util::DateTime vt(windowBegin_ + windowLength_/2);
143  return new CostJcDFI<MODEL, OBS>(jcdfi, resol, vt, windowLength_);
144 }
145 
146 // -----------------------------------------------------------------------------
147 
148 template <typename MODEL, typename OBS>
150  ASSERT(xx.state().validTime() == windowBegin_);
151 
152  State_ xm(xx.state().geometry(), model_.variables(), windowBegin_);
153  an2model_->changeVar(xx.state(), xm);
154  model_.forecast(xm, xx.modVar(), windowLength_, post);
155  an2model_->changeVarInverse(xm, xx.state());
156 
157  ASSERT(xx.state().validTime() == windowEnd_);
158 }
159 
160 // -----------------------------------------------------------------------------
161 
162 template<typename MODEL, typename OBS>
164  const eckit::Configuration & innerConf,
165  const CtrlVar_ & bg, const CtrlVar_ & fg,
167  PostProcessorTLAD<MODEL> & pptraj) {
168  Log::trace() << "CostFct4DVar::doLinearize start" << std::endl;
169  eckit::LocalConfiguration conf(innerConf, "linear model");
170 // Setup linear model (and trajectory)
171  tlm_.reset(new LinearModel_(resol, conf));
172  pp.enrollProcessor(new TrajectorySaver<MODEL>(conf, resol, fg.modVar(), tlm_, pptraj));
173 
174 // Setup change of variables
175  inc2model_.reset(LinearVariableChangeFactory<MODEL>::create(bg.state(), fg.state(),
176  resol, conf));
177  inc2model_->setInputVariables(ctlvars_);
178  Log::trace() << "CostFct4DVar::doLinearize done" << std::endl;
179 }
180 
181 // -----------------------------------------------------------------------------
182 
183 template <typename MODEL, typename OBS>
187  const bool idModel) const {
188  inc2model_->setOutputVariables(tlm_->variables());
189 
190  ASSERT(dx.state().validTime() == windowBegin_);
191 
192  Increment_ dxmodel(dx.state().geometry(), tlm_->variables(), windowBegin_);
193  inc2model_->multiply(dx.state(), dxmodel);
194  tlm_->forecastTL(dxmodel, dx.modVar(), windowLength_, post, cost, idModel);
195  inc2model_->multiplyInverse(dxmodel, dx.state());
196 
197  ASSERT(dx.state().validTime() == windowEnd_);
198 }
199 
200 // -----------------------------------------------------------------------------
201 
202 template <typename MODEL, typename OBS>
204  dx.state().zero(windowEnd_);
205  dx.modVar().zero();
206  dx.obsVar().zero();
207 }
208 
209 // -----------------------------------------------------------------------------
210 
211 template <typename MODEL, typename OBS>
215  const bool idModel) const {
216  ASSERT(dx.state().validTime() == windowEnd_);
217 
218  Increment_ dxmodel(dx.state().geometry(), tlm_->variables(), windowEnd_);
219  inc2model_->setOutputVariables(tlm_->variables());
220  inc2model_->multiplyInverseAD(dx.state(), dxmodel);
221  tlm_->forecastAD(dxmodel, dx.modVar(), windowLength_, post, cost, idModel);
222  inc2model_->multiplyAD(dxmodel, dx.state());
223 
224  ASSERT(dx.state().validTime() == windowBegin_);
225 }
226 
227 // -----------------------------------------------------------------------------
228 
229 template<typename MODEL, typename OBS>
231  PostProcessor<Increment_> &) const {
232  xx.state() += dx.state();
233 }
234 
235 // -----------------------------------------------------------------------------
236 
237 } // namespace oops
238 
239 #endif // OOPS_ASSIMILATION_COSTFCT4DVAR_H_
oops::CostFct4DVar::addIncr
void addIncr(CtrlVar_ &, const CtrlInc_ &, PostProcessor< Increment_ > &) const override
Definition: CostFct4DVar.h:230
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
CostJcDFI.h
oops::CostFct4DVar::model_
Model_ model_
Definition: CostFct4DVar.h:93
oops::VariableChangeBase
Definition: VariableChangeBase.h:49
oops::CostFct4DVar::newJb
CostJb3D< MODEL > * newJb(const eckit::Configuration &, const Geometry_ &, const CtrlVar_ &) const override
Definition: CostFct4DVar.h:123
oops::ControlIncrement::obsVar
ObsAuxIncrs_ & obsVar()
Get augmented observation control variable.
Definition: ControlIncrement.h:94
oops::CostTermBase
Base Class for Cost Function Terms.
Definition: CostTermBase.h:37
TrajectorySaver.h
oops::Increment::geometry
Geometry_ geometry() const
Get geometry.
Definition: oops/interface/Increment.h:397
oops::LinearVariableChangeFactory
LinearVariableChange factory.
Definition: LinearVariableChangeBase.h:85
oops::CostFct4DVar::runADJ
void runADJ(CtrlInc_ &, PostProcessorTLAD< MODEL > &, PostProcessor< Increment_ >, const bool idModel=false) const override
Definition: CostFct4DVar.h:212
oops::CostFct4DVar::runNL
void runNL(CtrlVar_ &, PostProcessor< State_ > &) const override
Definition: CostFct4DVar.h:149
oops::CostFct4DVar::doLinearize
void doLinearize(const Geometry_ &, const eckit::Configuration &, const CtrlVar_ &, const CtrlVar_ &, PostProcessor< State_ > &, PostProcessorTLAD< MODEL > &) override
Definition: CostFct4DVar.h:163
oops::CostFct4DVar::~CostFct4DVar
~CostFct4DVar()
Definition: CostFct4DVar.h:64
oops::ControlVariable
Control variable.
Definition: ControlVariable.h:41
CostFunction.h
oops::Increment::zero
void zero()
Linear algebra operators.
Definition: oops/interface/Increment.h:206
oops::CostFct4DVar
Strong Constraint 4D-Var Cost Function.
Definition: CostFct4DVar.h:50
oops::ControlIncrement::modVar
ModelAuxIncr_ & modVar()
Get augmented model control variable.
Definition: ControlIncrement.h:90
oops::CostFct4DVar::inc2model_
std::unique_ptr< LinVarCha_ > inc2model_
Definition: CostFct4DVar.h:97
oops::CostFct4DVar::Model_
Model< MODEL > Model_
Definition: CostFct4DVar.h:57
oops::CostFct4DVar::CtrlVar_
ControlVariable< MODEL, OBS > CtrlVar_
Definition: CostFct4DVar.h:53
oops::CostFct4DVar::CostFct4DVar
CostFct4DVar(const eckit::Configuration &, const eckit::mpi::Comm &)
Definition: CostFct4DVar.h:103
oops::CostFct4DVar::windowEnd_
util::DateTime windowEnd_
Definition: CostFct4DVar.h:90
CostJb3D.h
oops::ControlIncrement
Definition: ControlIncrement.h:46
oops::CostFct4DVar::tlm_
std::shared_ptr< LinearModel_ > tlm_
Definition: CostFct4DVar.h:95
oops::ControlVariable::modVar
ModelAux_ & modVar()
Get augmented model control variable.
Definition: ControlVariable.h:73
oops::CostFct4DVar::resol_
Geometry_ resol_
Definition: CostFct4DVar.h:92
oops::CostFct4DVar::zeroAD
void zeroAD(CtrlInc_ &) const override
Definition: CostFct4DVar.h:203
CostTermBase.h
oops::LinearVariableChangeBase
Definition: LinearVariableChangeBase.h:53
oops::VariableChangeFactory
VariableChange factory.
Definition: VariableChangeBase.h:75
oops::Increment::validTime
const util::DateTime validTime() const
Time.
Definition: oops/interface/Increment.h:72
LinearModel.h
oops::CostJcDFI
Jc DFI Cost Function.
Definition: CostJcDFI.h:44
oops::CostFct4DVar::CtrlInc_
ControlIncrement< MODEL, OBS > CtrlInc_
Definition: CostFct4DVar.h:52
eckit
Definition: FieldL95.h:22
oops::CostFct4DVar::LinearModel_
LinearModel< MODEL > LinearModel_
Definition: CostFct4DVar.h:58
oops::PostProcessor::enrollProcessor
void enrollProcessor(PostBase_ *pp)
Definition: PostProcessor.h:38
oops::CostFct4DVar::runTLM
void runTLM(CtrlInc_ &, PostProcessorTLAD< MODEL > &, PostProcessor< Increment_ >, const bool idModel=false) const override
Definition: CostFct4DVar.h:184
oops::CostFct4DVar::Geometry_
Geometry< MODEL > Geometry_
Definition: CostFct4DVar.h:55
PostProcessor.h
oops::ModelAuxIncrement::zero
void zero()
Definition: oops/interface/ModelAuxIncrement.h:143
oops::CostFct4DVar::State_
State< MODEL > State_
Definition: CostFct4DVar.h:56
oops::PostProcessorTLAD
Control model post processing.
Definition: PostProcessorTLAD.h:33
oops::CostFct4DVar::ctlvars_
const Variables ctlvars_
Definition: CostFct4DVar.h:94
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
oops::CostFct4DVar::an2model_
std::unique_ptr< VarCha_ > an2model_
Definition: CostFct4DVar.h:96
Model.h
oops::CostFct4DVar::newJc
CostTermBase< MODEL, OBS > * newJc(const eckit::Configuration &, const Geometry_ &) const override
Definition: CostFct4DVar.h:139
oops::CostFct4DVar::geometry
const Geometry_ & geometry() const override
Definition: CostFct4DVar.h:86
oops::ControlIncrement::state
Increment_ & state()
Get state control variable.
Definition: ControlIncrement.h:86
oops::CostFct4DVar::newJo
CostJo< MODEL, OBS > * newJo(const eckit::Configuration &) const override
Definition: CostFct4DVar.h:132
oops::State::geometry
Geometry_ geometry() const
Definition: oops/interface/State.h:215
oops::CostFct4DVar::LinVarCha_
LinearVariableChangeBase< MODEL > LinVarCha_
Definition: CostFct4DVar.h:60
StateInfo.h
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::CostFct4DVar::Increment_
Increment< MODEL > Increment_
Definition: CostFct4DVar.h:51
oops::PostProcessor
Control model post processing.
Definition: PostProcessor.h:30
oops::CostFct4DVar::VarCha_
VariableChangeBase< MODEL > VarCha_
Definition: CostFct4DVar.h:59
State.h
CostJo.h
oops::Variables
Definition: oops/base/Variables.h:23
oops::CostFunction::setupTerms
void setupTerms(const eckit::Configuration &)
Definition: CostFunction.h:195
oops::Increment
Increment Class: Difference between two states.
Definition: CostJbState.h:27
oops::CostFct4DVar::windowLength_
util::Duration windowLength_
Definition: CostFct4DVar.h:88
oops::TrajectorySaver
Save trajectory during forecast run.
Definition: TrajectorySaver.h:32
oops::ObsAuxIncrements::zero
void zero()
Definition: ObsAuxIncrements.h:143
oops::CostFunction
Cost Function.
Definition: CostFunction.h:53
PostProcessorTLAD.h
LinearVariableChangeBase.h
oops::CostFct4DVar::comm_
const eckit::mpi::Comm & comm_
Definition: CostFct4DVar.h:91
oops::LinearModel
Encapsulates the linear forecast model.
Definition: oops/interface/LinearModel.h:65
Variables.h
oops::CostJo
Jo Cost Function.
Definition: CostJo.h:54
oops::CostFct4DVar::windowBegin_
util::DateTime windowBegin_
Definition: CostFct4DVar.h:89
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
VariableChangeBase.h
oops::CostFct4DVar::CostFct_
CostFunction< MODEL, OBS > CostFct_
Definition: CostFct4DVar.h:54
oops::ControlVariable::state
State_ & state()
Get state control variable.
Definition: ControlVariable.h:69
Geometry.h
Increment.h
oops::CostJb3D
Jb Cost Function.
Definition: CostJb3D.h:43