Go to the documentation of this file.
11 #ifndef OOPS_ASSIMILATION_COSTJBTOTAL_H_
12 #define OOPS_ASSIMILATION_COSTJBTOTAL_H_
17 #include "eckit/config/LocalConfiguration.h"
26 #include "oops/util/Logger.h"
29 template<
typename MODEL>
class JqTermTLAD;
35 template<
typename MODEL,
typename OBS>
class CostJbTotal {
57 const eckit::Configuration &);
100 std::unique_ptr<JbState_>
jb_;
117 template<
typename MODEL,
typename OBS>
119 const eckit::Configuration & conf,
122 jbModBias_(conf.getSubConfiguration(
"model aux error"), resol),
123 jbObsBias_(odb, conf), dxFG_(), resol_(),
124 windowBegin_(conf.getString(
"window begin")),
125 windowEnd_(windowBegin_ +
util::Duration(conf.getString(
"window length")))
127 Log::trace() <<
"CostJbTotal contructed." << std::endl;
132 template<
typename MODEL,
typename OBS>
134 Log::trace() <<
"CostJbTotal::initialize start" << std::endl;
136 Log::trace() <<
"CostJbTotal::initialize done" << std::endl;
141 template<
typename MODEL,
typename OBS>
143 Log::trace() <<
"CostJbTotal::finalize start" << std::endl;
148 jb_->computeIncrement(xb_.state(), fg_->state(), mx.
state(), dx.
state());
151 dx.
modVar().
diff(fg_->modVar(), xb_.modVar());
152 dx.
obsVar().
diff(fg_->obsVar(), xb_.obsVar());
155 Log::info() <<
"CostJb: FG-BG" << dx << std::endl;
158 double zjb = this->evaluate(dx);
159 Log::trace() <<
"CostJbTotal::finalize done" << std::endl;
165 template<
typename MODEL,
typename OBS>
168 const eckit::Configuration & inner) {
169 Log::trace() <<
"CostJbTotal::initializeTraj start" << std::endl;
173 jb_->linearize(fg.
state(), *resol_);
174 jbModBias_.linearize(fg.
modVar(), *resol_);
175 jbObsBias_.linearize(fg.
obsVar(), inner);
179 Log::trace() <<
"CostJbTotal::initializeTraj done" << std::endl;
185 template<
typename MODEL,
typename OBS>
187 Log::trace() <<
"CostJbTotal::finalizeTraj start" << std::endl;
194 if (jqlin) mx = &jqlin->
getMxi();
195 jb_->computeIncrement(xb_.state(), fg_->state(), *mx, dxFG_->
state());
198 dxFG_->modVar().diff(fg_->modVar(), xb_.modVar());
199 dxFG_->obsVar().diff(fg_->obsVar(), xb_.obsVar());
202 Log::info() <<
"CostJb: FG-BG" << *dxFG_ << std::endl;
203 Log::trace() <<
"CostJbTotal::finalizeTraj done" << std::endl;
208 template<
typename MODEL,
typename OBS>
210 Log::trace() <<
"CostJbTotal::evaluate start" << std::endl;
212 this->multiplyBinv(dx, gg);
215 double zz = 0.5 * dot_product(dx.
state(), gg.
state());
216 Log::info() <<
"CostJb : Nonlinear Jb State = " << zz << std::endl;
219 Log::info() <<
"CostJb : Nonlinear Jb Model Aux = " << zz << std::endl;
222 Log::info() <<
"CostJb : Nonlinear Jb Obs Aux = " << zz << std::endl;
225 Log::info() <<
"CostJb : Nonlinear Jb = " << zjb << std::endl;
229 if (zjb >= 0.0 && zjb <= std::numeric_limits<double>::epsilon()) ztest = 0.0;
230 Log::test() <<
"CostJb : Nonlinear Jb = " << ztest << std::endl;
232 Log::trace() <<
"CostJbTotal::evaluate done" << std::endl;
238 template<
typename MODEL,
typename OBS>
240 Log::trace() <<
"CostJbTotal::addGradientFG 1 start" << std::endl;
242 this->multiplyBinv(*dxFG_, gg);
244 Log::trace() <<
"CostJbTotal::addGradientFG 1 done" << std::endl;
249 template<
typename MODEL,
typename OBS>
251 Log::trace() <<
"CostJbTotal::addGradientFG 2 start" << std::endl;
252 jb_->addGradient(dxFG_->state(), grad.
state(), gradJb.
state());
255 Log::trace() <<
"CostJbTotal::addGradientFG 2 done" << std::endl;
260 template<
typename MODEL,
typename OBS>
262 Log::trace() <<
"CostJbTotal::initializeTL start" << std::endl;
264 Log::trace() <<
"CostJbTotal::initializeTL done" << std::endl;
270 template<
typename MODEL,
typename OBS>
273 Log::trace() <<
"CostJbTotal::finalizeTL start" << std::endl;
276 Log::trace() <<
"CostJbTotal::finalizeTL done" << std::endl;
281 template<
typename MODEL,
typename OBS>
284 Log::trace() <<
"CostJbTotal::initializeAD start" << std::endl;
287 Log::trace() <<
"CostJbTotal::initializeAD done" << std::endl;
293 template<
typename MODEL,
typename OBS>
295 Log::trace() <<
"CostJbTotal::finalizeAD start" << std::endl;
296 if (jqad) jqad->
clear();
297 Log::trace() <<
"CostJbTotal::finalizeAD done" << std::endl;
302 template<
typename MODEL,
typename OBS>
304 Log::trace() <<
"CostJbTotal::multiplyB start" << std::endl;
308 Log::trace() <<
"CostJbTotal::multiplyB done" << std::endl;
313 template<
typename MODEL,
typename OBS>
315 Log::trace() <<
"CostJbTotal::multiplyBinv start" << std::endl;
317 jbModBias_.inverseMultiply(dxin.
modVar(), dxout.
modVar());
318 jbObsBias_.inverseMultiply(dxin.
obsVar(), dxout.
obsVar());
319 Log::trace() <<
"CostJbTotal::multiplyBinv done" << std::endl;
324 template<
typename MODEL,
typename OBS>
326 Log::trace() <<
"CostJbTotal::randomize start" << std::endl;
327 jb_->randomize(dx.
state());
328 jbModBias_.randomize(dx.
modVar());
329 jbObsBias_.randomize(dx.
obsVar());
330 Log::trace() <<
"CostJbTotal::randomize done" << std::endl;
337 #endif // OOPS_ASSIMILATION_COSTJBTOTAL_H_
void multiplyB(const CtrlInc_ &, CtrlInc_ &) const
Multiply by covariance matrix and its inverse.
The namespace for the main oops code.
void multiplyBinv(const CtrlInc_ &, CtrlInc_ &) const
ObsAuxCtrls_ & obsVar()
Get augmented observation control variable.
CostJbState< MODEL > JbState_
ObsAuxIncrs_ & obsVar()
Get augmented observation control variable.
ObsSpaces< OBS > ObsSpaces_
const JbState_ & jbState() const
void finalizeTL(JqTermTLAD_ *, const CtrlInc_ &, CtrlInc_ &) const
ControlIncrement< MODEL, OBS > CtrlInc_
ModelAuxIncr_ & modVar()
Get augmented model control variable.
void initialize(const CtrlVar_ &) const
Initialize before nonlinear model integration.
std::unique_ptr< Geometry_ > resol_
Inner loop resolution.
void computeModelErrorTL(Increment_ &)
Jb Cost Function Base Class.
ModelAux_ & modVar()
Get augmented model control variable.
void finalizeTraj(JqTermTLAD_ *)
std::unique_ptr< JbState_ > jb_
void diff(const ModelAuxControl_ &, const ModelAuxControl_ &)
Linear algebra operators.
const util::DateTime windowBegin_
void diff(const ObsAuxControls_ &, const ObsAuxControls_ &)
Linear algebra operators.
State_ & state()
Interfacing.
const util::DateTime windowEnd_
const Geometry_ & resolution() const
Jb terms for ControlIncrement constructor.
const ModelAuxCovar_ & jbModBias() const
const util::DateTime & windowBegin() const
void randomize(CtrlInc_ &) const
Randomize.
Geometry class used in oops; subclass of interface class above.
ObsAuxCovariances< OBS > ObsAuxCovars_
Increment_ & state()
Get state control variable.
double evaluate(const CtrlInc_ &) const
const ObsAuxCovars_ & jbObsBias() const
ControlVariable< MODEL, OBS > CtrlVar_
JqTermTLAD_ * initializeAD(CtrlInc_ &, const CtrlInc_ &) const
Initialize before starting the AD run.
void addGradientFG(CtrlInc_ &) const
Add Jb gradient at first guess.
JqTermTLAD< MODEL > JqTermTLAD_
ModelAuxCovar_ jbModBias_
Geometry< MODEL > Geometry_
Encapsulates the model state.
JqTermTLAD_ * initializeTraj(const CtrlVar_ &, const Geometry_ &, const eckit::Configuration &)
const CtrlInc_ & getFirstGuess() const
Return first guess .
const util::DateTime & windowEnd() const
double finalize(const CtrlVar_ &) const
Finalize computation after nonlinear model integration.
void finalizeAD(JqTermTLAD_ *) const
std::unique_ptr< CtrlInc_ > dxFG_
First guess increment or more generally .
CostJbTotal(const CtrlVar_ &, JbState_ *, const eckit::Configuration &, const Geometry_ &, const ObsSpaces_ &odb)
Construct .
~CostJbTotal()
Destructor.
ModelAuxCovariance< MODEL > ModelAuxCovar_
const CtrlVar_ & getBackground() const
Return background.
State_ & state()
Get state control variable.
JqTermTLAD_ * initializeTL() const
Initialize before starting the TL run.