Go to the documentation of this file.
11 #ifndef OOPS_ASSIMILATION_COSTFCT4DVAR_H_
12 #define OOPS_ASSIMILATION_COSTFCT4DVAR_H_
16 #include "eckit/config/LocalConfiguration.h"
17 #include "eckit/mpi/Comm.h"
35 #include "oops/util/DateTime.h"
36 #include "oops/util/Duration.h"
37 #include "oops/util/Logger.h"
63 CostFct4DVar(
const eckit::Configuration &,
const eckit::mpi::Comm &);
68 const bool idModel =
false)
const override;
71 const bool idModel =
false)
const override;
95 std::shared_ptr<LinearModel_>
tlm_;
102 template<
typename MODEL,
typename OBS>
104 const eckit::mpi::Comm & comm)
106 resol_(
eckit::LocalConfiguration(config,
"geometry"), comm),
107 model_(resol_,
eckit::LocalConfiguration(config,
"model")),
108 ctlvars_(config,
"analysis variables"), tlm_(), an2model_(), inc2model_()
110 Log::trace() <<
"CostFct4DVar:CostFct4DVar" << std::endl;
111 windowLength_ = util::Duration(config.getString(
"window length"));
112 windowBegin_ = util::DateTime(config.getString(
"window begin"));
117 Log::trace() <<
"CostFct4DVar constructed" << std::endl;
122 template <
typename MODEL,
typename OBS>
131 template <
typename MODEL,
typename OBS>
138 template <
typename MODEL,
typename OBS>
141 const eckit::LocalConfiguration jcdfi(jcConf,
"jcdfi");
142 const util::DateTime vt(windowBegin_ + windowLength_/2);
148 template <
typename MODEL,
typename OBS>
153 an2model_->changeVar(xx.
state(), xm);
154 model_.forecast(xm, xx.
modVar(), windowLength_, post);
155 an2model_->changeVarInverse(xm, xx.
state());
162 template<
typename MODEL,
typename OBS>
164 const eckit::Configuration & innerConf,
168 Log::trace() <<
"CostFct4DVar::doLinearize start" << std::endl;
169 eckit::LocalConfiguration conf(innerConf,
"linear model");
177 inc2model_->setInputVariables(ctlvars_);
178 Log::trace() <<
"CostFct4DVar::doLinearize done" << std::endl;
183 template <
typename MODEL,
typename OBS>
187 const bool idModel)
const {
188 inc2model_->setOutputVariables(tlm_->variables());
193 inc2model_->multiply(dx.
state(), dxmodel);
194 tlm_->forecastTL(dxmodel, dx.
modVar(), windowLength_, post, cost, idModel);
195 inc2model_->multiplyInverse(dxmodel, dx.
state());
202 template <
typename MODEL,
typename OBS>
211 template <
typename MODEL,
typename OBS>
215 const bool idModel)
const {
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());
229 template<
typename MODEL,
typename OBS>
239 #endif // OOPS_ASSIMILATION_COSTFCT4DVAR_H_
void addIncr(CtrlVar_ &, const CtrlInc_ &, PostProcessor< Increment_ > &) const override
const util::DateTime validTime() const
Time.
The namespace for the main oops code.
CostJb3D< MODEL > * newJb(const eckit::Configuration &, const Geometry_ &, const CtrlVar_ &) const override
ObsAuxIncrs_ & obsVar()
Get augmented observation control variable.
Base Class for Cost Function Terms.
Geometry_ geometry() const
Get geometry.
LinearVariableChange factory.
void runADJ(CtrlInc_ &, PostProcessorTLAD< MODEL > &, PostProcessor< Increment_ >, const bool idModel=false) const override
void runNL(CtrlVar_ &, PostProcessor< State_ > &) const override
void doLinearize(const Geometry_ &, const eckit::Configuration &, const CtrlVar_ &, const CtrlVar_ &, PostProcessor< State_ > &, PostProcessorTLAD< MODEL > &) override
void zero()
Linear algebra operators.
Strong Constraint 4D-Var Cost Function.
ModelAuxIncr_ & modVar()
Get augmented model control variable.
std::unique_ptr< LinVarCha_ > inc2model_
ControlVariable< MODEL, OBS > CtrlVar_
CostFct4DVar(const eckit::Configuration &, const eckit::mpi::Comm &)
util::DateTime windowEnd_
std::shared_ptr< LinearModel_ > tlm_
ModelAux_ & modVar()
Get augmented model control variable.
void zeroAD(CtrlInc_ &) const override
const util::DateTime validTime() const
Time.
ControlIncrement< MODEL, OBS > CtrlInc_
LinearModel< MODEL > LinearModel_
void enrollProcessor(PostBase_ *pp)
void runTLM(CtrlInc_ &, PostProcessorTLAD< MODEL > &, PostProcessor< Increment_ >, const bool idModel=false) const override
Geometry< MODEL > Geometry_
Control model post processing.
Geometry class used in oops; subclass of interface class above.
std::unique_ptr< VarCha_ > an2model_
CostTermBase< MODEL, OBS > * newJc(const eckit::Configuration &, const Geometry_ &) const override
const Geometry_ & geometry() const override
Increment_ & state()
Get state control variable.
CostJo< MODEL, OBS > * newJo(const eckit::Configuration &) const override
Geometry_ geometry() const
LinearVariableChangeBase< MODEL > LinVarCha_
Encapsulates the model state.
Increment< MODEL > Increment_
Control model post processing.
VariableChangeBase< MODEL > VarCha_
void setupTerms(const eckit::Configuration &)
Increment Class: Difference between two states.
util::Duration windowLength_
Save trajectory during forecast run.
const eckit::mpi::Comm & comm_
Encapsulates the linear forecast model.
util::DateTime windowBegin_
Encapsulates the nonlinear forecast model Note: to see methods that need to be implemented in the for...
CostFunction< MODEL, OBS > CostFct_
State_ & state()
Get state control variable.