11 #ifndef OOPS_ASSIMILATION_DUALMINIMIZER_H_
12 #define OOPS_ASSIMILATION_DUALMINIMIZER_H_
18 #include "eckit/config/Configuration.h"
28 #include "oops/util/dot_product.h"
29 #include "oops/util/Logger.h"
57 const int &,
const double &,
Dual_ &,
const double &) = 0;
65 template<
typename MODEL,
typename OBS>
68 int ninner = config.getInt(
"ninner");
69 double gnreduc = config.getDouble(
"gradient norm reduction");
71 bool runOnlineAdjTest = config.getBool(
"online diagnostics.online adj test",
false);
74 gradJb_.reset(
new CtrlInc_(J_.jb().resolution(), *gradJb_));
76 gradJb_.reset(
new CtrlInc_(J_.jb()));
79 Log::info() << std::endl;
80 Log::info() << classname() <<
": max iter = " << ninner
81 <<
", requested norm reduction = " << gnreduc << std::endl;
85 const HBHt_ HBHt(J_, runOnlineAdjTest);
92 for (
unsigned jj = 0; jj < J_.nterms(); ++jj) {
93 vv.
append(J_.jterm(jj).newDualVector());
99 for (
unsigned jj = 0; jj < J_.nterms(); ++jj) {
100 rr.
append(J_.jterm(jj).newGradientFG());
109 CtrlInc_ hdxfg(J_.jb().getFirstGuess());
115 J_.jb().addGradientFG(g0, *gradJb_);
117 double sigma = dot_product(J_.jb().getFirstGuess(), g0);
120 double reduc = this->solve(vv, vvp, rr, HBHt, Rinv, ninner, gnreduc, dy, sigma);
122 Log::test() << classname() <<
": reduction in residual norm = " << reduc << std::endl;
133 Log::info() << classname() <<
": Estimated Final Jb = "
134 << 0.5 * dot_product(*dx, dh) << std::endl;
135 Log::info() << classname() <<
" output" << *dx << std::endl;
147 #endif // OOPS_ASSIMILATION_DUALMINIMIZER_H_