OOPS
LBHessianMatrix.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_LBHESSIANMATRIX_H_
12 #define OOPS_ASSIMILATION_LBHESSIANMATRIX_H_
13 
14 #include <memory>
15 
16 #include <boost/noncopyable.hpp>
17 
22 
23 namespace oops {
24  template<typename MODEL> class JqTermTLAD;
25 
26 /// The Hessian matrix: \f$ I + B H^T R^{-1} H \f$.
27 /*!
28  * The solvers represent matrices as objects that implement a "multiply"
29  * method. This class defines objects that apply a generalized Hessian
30  * matrix which includes all the terms of the cost function.
31  */
32 
33 template<typename MODEL, typename OBS> class LBHessianMatrix : private boost::noncopyable {
37 
38  public:
39  explicit LBHessianMatrix(const CostFct_ & j): j_(j) {}
40 
41  void multiply(const CtrlInc_ & dx, CtrlInc_ & dz) const {
42 // Setup TL terms of cost function
44  JqTermTLAD_ * jqtl = j_.jb().initializeTL();
45  costtl.enrollProcessor(jqtl);
46  unsigned iq = 0;
47  if (jqtl) iq = 1;
48  for (unsigned jj = 0; jj < j_.nterms(); ++jj) {
49  costtl.enrollProcessor(j_.jterm(jj).setupTL(dx));
50  }
51 
52 // Run TLM
53  CtrlInc_ mdx(dx);
54  j_.runTLM(mdx, costtl);
55 
56 // Finalize Jb+Jq
57 
58 // Get TLM outputs, multiply by covariance inverses and setup ADJ forcing terms
60  dz.zero();
61  CtrlInc_ dw(j_.jb());
62 
63 // Jb
64  CtrlInc_ tmp(j_.jb());
65  j_.jb().finalizeTL(jqtl, dx, dw);
66  tmp = dw;
67  JqTermTLAD_ * jqad = j_.jb().initializeAD(dz, tmp);
68  costad.enrollProcessor(jqad);
69 
70  j_.zeroAD(dw);
71 // Jo + Jc
72  for (unsigned jj = 0; jj < j_.nterms(); ++jj) {
73  std::unique_ptr<GeneralizedDepartures> ww(costtl.releaseOutputFromTL(iq+jj));
74  std::shared_ptr<GeneralizedDepartures> zz(j_.jterm(jj).multiplyCoInv(*ww));
75  costad.enrollProcessor(j_.jterm(jj).setupAD(zz, dw));
76  }
77 
78 // Run ADJ
79  j_.runADJ(dw, costad);
80 
81 // Multiply by B
82  CtrlInc_ zz(j_.jb());
83  j_.jb().multiplyB(dw, zz);
84 
85  dz += zz;
86  j_.jb().finalizeAD(jqad);
87  }
88 
89  private:
90  CostFct_ const & j_;
91 };
92 
93 } // namespace oops
94 
95 #endif // OOPS_ASSIMILATION_LBHESSIANMATRIX_H_
oops::CostJbTotal::multiplyB
void multiplyB(const CtrlInc_ &, CtrlInc_ &) const
Multiply by covariance matrix and its inverse.
Definition: CostJbTotal.h:303
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::CostTermBase::multiplyCoInv
virtual std::unique_ptr< GeneralizedDepartures > multiplyCoInv(const GeneralizedDepartures &) const =0
oops::CostFunction::zeroAD
virtual void zeroAD(CtrlInc_ &) const =0
oops::CostJbTotal::finalizeTL
void finalizeTL(JqTermTLAD_ *, const CtrlInc_ &, CtrlInc_ &) const
Definition: CostJbTotal.h:271
oops::LBHessianMatrix
The Hessian matrix: .
Definition: LBHessianMatrix.h:33
oops::CostFunction::nterms
unsigned nterms() const
Definition: CostFunction.h:94
CostFunction.h
oops::CostFunction::runTLM
virtual void runTLM(CtrlInc_ &, PostProcessorTLAD< MODEL > &, PostProcessor< Increment_ > post=PostProcessor< Increment_ >(), const bool idModel=false) const =0
oops::LBHessianMatrix::j_
CostFct_ const & j_
Definition: LBHessianMatrix.h:90
oops::LBHessianMatrix::JqTermTLAD_
JqTermTLAD< MODEL > JqTermTLAD_
Definition: LBHessianMatrix.h:36
oops::CostFunction::jterm
const CostBase_ & jterm(const unsigned ii) const
Access terms of the cost function other than .
Definition: CostFunction.h:93
oops::ControlIncrement
Definition: ControlIncrement.h:46
oops::ControlIncrement::zero
void zero()
Linear algebra operators.
Definition: ControlIncrement.h:189
oops::JqTermTLAD
Definition: CostJb3D.h:29
oops::CostFunction::jb
const JbTotal_ & jb() const
Access .
Definition: CostFunction.h:91
oops::LBHessianMatrix::CtrlInc_
ControlIncrement< MODEL, OBS > CtrlInc_
Definition: LBHessianMatrix.h:34
oops::CostTermBase::setupAD
virtual PostPtrTLAD_ setupAD(std::shared_ptr< const GeneralizedDepartures >, ControlIncrement< MODEL, OBS > &) const =0
Initialize before starting the AD run.
oops::PostProcessorTLAD::releaseOutputFromTL
std::unique_ptr< GeneralizedDepartures > releaseOutputFromTL(unsigned int ii)
Get TL dual space output.
Definition: PostProcessorTLAD.h:95
oops::LBHessianMatrix::CostFct_
CostFunction< MODEL, OBS > CostFct_
Definition: LBHessianMatrix.h:35
oops::PostProcessorTLAD::enrollProcessor
void enrollProcessor(PostBaseTLAD_ *pp)
Definition: PostProcessorTLAD.h:43
oops::CostFunction::runADJ
virtual void runADJ(CtrlInc_ &, PostProcessorTLAD< MODEL > &, PostProcessor< Increment_ > post=PostProcessor< Increment_ >(), const bool idModel=false) const =0
oops::CostTermBase::setupTL
virtual PostPtrTLAD_ setupTL(const ControlIncrement< MODEL, OBS > &) const =0
Initialize before starting the TL run.
oops::PostProcessorTLAD
Control model post processing.
Definition: PostProcessorTLAD.h:33
oops::CostJbTotal::initializeAD
JqTermTLAD_ * initializeAD(CtrlInc_ &, const CtrlInc_ &) const
Initialize before starting the AD run.
Definition: CostJbTotal.h:282
oops::LBHessianMatrix::multiply
void multiply(const CtrlInc_ &dx, CtrlInc_ &dz) const
Definition: LBHessianMatrix.h:41
GeneralizedDepartures.h
ControlIncrement.h
oops::CostJbTotal::finalizeAD
void finalizeAD(JqTermTLAD_ *) const
Definition: CostJbTotal.h:294
oops::CostFunction
Cost Function.
Definition: CostFunction.h:53
PostProcessorTLAD.h
oops::LBHessianMatrix::LBHessianMatrix
LBHessianMatrix(const CostFct_ &j)
Definition: LBHessianMatrix.h:39
oops::CostJbTotal::initializeTL
JqTermTLAD_ * initializeTL() const
Initialize before starting the TL run.
Definition: CostJbTotal.h:261