OOPS
PostBaseTLAD.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_BASE_POSTBASETLAD_H_
12 #define OOPS_BASE_POSTBASETLAD_H_
13 
14 #include <memory>
15 
16 #include <boost/noncopyable.hpp>
17 
18 #include "eckit/config/Configuration.h"
20 #include "oops/base/PostTimer.h"
22 #include "oops/interface/State.h"
23 #include "oops/util/DateTime.h"
24 #include "oops/util/Duration.h"
25 
26 namespace oops {
27 
28 // -----------------------------------------------------------------------------
29 
30 /// Handles post-processing of model fields related to cost function.
31 /*!
32  * PostBaseTLAD is the base class for all cost function linearized processors,
33  * it is mostly used so that PostProcessorTL can hold a vector of such
34  * processors.
35  * By default processing is performed on every call.
36  * An important difference with PostBase is that the adjoint can modify the
37  * increment.
38  */
39 
40 template <typename MODEL>
41 class PostBaseTLAD : private boost::noncopyable {
44 
45  public:
47  PostBaseTLAD(const util::DateTime & start, const util::DateTime & finish,
48  const util::Duration & freq = util::Duration(0))
49  : timer_(start, finish, freq) {}
50  virtual ~PostBaseTLAD() {}
51 
52 /// Set linearization state
53  void initializeTraj(const State_ & xx, const util::DateTime & end,
54  const util::Duration & step) {
55  timer_.initialize(xx.validTime(), end);
56  this->doInitializeTraj(xx, end, step);
57  }
58 
59  void processTraj(const State_ & xx) {
60  if (timer_.itIsTime(xx.validTime())) this->doProcessingTraj(xx);
61  }
62 
63  void finalizeTraj(const State_ & xx) {
64  this->doFinalizeTraj(xx);
65  }
66 
67 /// Tangent linear methods
68  void initializeTL(const Increment_ & dx, const util::DateTime & end,
69  const util::Duration & step) {
70  timer_.initialize(dx.validTime(), end);
71  this->doInitializeTL(dx, end, step);
72  }
73 
74  void processTL(const Increment_ & dx) {
75  if (timer_.itIsTime(dx.validTime())) this->doProcessingTL(dx);
76  }
77 
78  void finalizeTL(const Increment_ & dx) {
79  this->doFinalizeTL(dx);
80  }
81 
82 /// Return TL dual space output
83  virtual std::unique_ptr<GeneralizedDepartures> releaseOutputFromTL() = 0;
84 
85 /// Adjoint methods
86  void initializeAD(Increment_ & dx, const util::DateTime & bgn,
87  const util::Duration & step) {
88  timer_.initialize(bgn, dx.validTime());
89  this->doFirstAD(dx, bgn, step);
90  }
91 
92  void processAD(Increment_ & dx) {
93  if (timer_.itIsTime(dx.validTime())) this->doProcessingAD(dx);
94  }
95 
96  void finalizeAD(Increment_ & dx) {
97  this->doLastAD(dx);
98  }
99 
100  private:
102  virtual void doInitializeTraj(const State_ &,
103  const util::DateTime &, const util::Duration &) = 0;
104  virtual void doProcessingTraj(const State_ &) = 0;
105  virtual void doFinalizeTraj(const State_ &) = 0;
106 
107  virtual void doInitializeTL(const Increment_ &,
108  const util::DateTime &, const util::Duration &) = 0;
109  virtual void doProcessingTL(const Increment_ &) = 0;
110  virtual void doFinalizeTL(const Increment_ &) = 0;
111 
112  virtual void doFirstAD(Increment_ &, const util::DateTime &, const util::Duration &) = 0;
113  virtual void doProcessingAD(Increment_ &) = 0;
114  virtual void doLastAD(Increment_ &) = 0;
115 };
116 
117 // -----------------------------------------------------------------------------
118 
119 } // namespace oops
120 
121 #endif // OOPS_BASE_POSTBASETLAD_H_
oops::State::validTime
const util::DateTime validTime() const
Time.
Definition: oops/interface/State.h:60
oops::PostBaseTLAD::PostBaseTLAD
PostBaseTLAD()
Definition: PostBaseTLAD.h:46
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::PostBaseTLAD::Increment_
Increment< MODEL > Increment_
Definition: PostBaseTLAD.h:42
oops::PostBaseTLAD
Handles post-processing of model fields related to cost function.
Definition: PostBaseTLAD.h:41
oops::PostBaseTLAD::doProcessingTL
virtual void doProcessingTL(const Increment_ &)=0
oops::PostBaseTLAD::releaseOutputFromTL
virtual std::unique_ptr< GeneralizedDepartures > releaseOutputFromTL()=0
Return TL dual space output.
oops::PostBaseTLAD::finalizeTraj
void finalizeTraj(const State_ &xx)
Definition: PostBaseTLAD.h:63
oops::PostTimer
Handles timing of post-processing and similar actions.
Definition: oops/base/PostTimer.h:33
oops::PostBaseTLAD::doInitializeTraj
virtual void doInitializeTraj(const State_ &, const util::DateTime &, const util::Duration &)=0
oops::PostBaseTLAD::processTL
void processTL(const Increment_ &dx)
Definition: PostBaseTLAD.h:74
oops::Increment::validTime
const util::DateTime validTime() const
Time.
Definition: oops/interface/Increment.h:72
oops::PostBaseTLAD::timer_
PostTimer timer_
Definition: PostBaseTLAD.h:101
oops::PostBaseTLAD::finalizeTL
void finalizeTL(const Increment_ &dx)
Definition: PostBaseTLAD.h:78
oops::PostBaseTLAD::processAD
void processAD(Increment_ &dx)
Definition: PostBaseTLAD.h:92
oops::PostBaseTLAD::doFinalizeTL
virtual void doFinalizeTL(const Increment_ &)=0
oops::PostBaseTLAD::State_
State< MODEL > State_
Definition: PostBaseTLAD.h:43
oops::PostBaseTLAD::processTraj
void processTraj(const State_ &xx)
Definition: PostBaseTLAD.h:59
oops::PostBaseTLAD::doFinalizeTraj
virtual void doFinalizeTraj(const State_ &)=0
oops::PostBaseTLAD::doLastAD
virtual void doLastAD(Increment_ &)=0
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::PostBaseTLAD::initializeTraj
void initializeTraj(const State_ &xx, const util::DateTime &end, const util::Duration &step)
Set linearization state.
Definition: PostBaseTLAD.h:53
oops::PostBaseTLAD::initializeAD
void initializeAD(Increment_ &dx, const util::DateTime &bgn, const util::Duration &step)
Adjoint methods.
Definition: PostBaseTLAD.h:86
oops::PostBaseTLAD::doProcessingTraj
virtual void doProcessingTraj(const State_ &)=0
State.h
GeneralizedDepartures.h
oops::PostTimer::itIsTime
bool itIsTime(const util::DateTime &)
Definition: oops/base/PostTimer.cc:61
oops::PostBaseTLAD::PostBaseTLAD
PostBaseTLAD(const util::DateTime &start, const util::DateTime &finish, const util::Duration &freq=util::Duration(0))
Definition: PostBaseTLAD.h:47
oops::Increment
Increment Class: Difference between two states.
Definition: CostJbState.h:27
PostTimer.h
oops::PostBaseTLAD::initializeTL
void initializeTL(const Increment_ &dx, const util::DateTime &end, const util::Duration &step)
Tangent linear methods.
Definition: PostBaseTLAD.h:68
oops::PostBaseTLAD::doProcessingAD
virtual void doProcessingAD(Increment_ &)=0
oops::PostBaseTLAD::~PostBaseTLAD
virtual ~PostBaseTLAD()
Definition: PostBaseTLAD.h:50
oops::PostBaseTLAD::doInitializeTL
virtual void doInitializeTL(const Increment_ &, const util::DateTime &, const util::Duration &)=0
oops::PostBaseTLAD::finalizeAD
void finalizeAD(Increment_ &dx)
Definition: PostBaseTLAD.h:96
oops::PostTimer::initialize
void initialize(const util::DateTime &, const util::DateTime &)
Definition: oops/base/PostTimer.cc:44
oops::PostBaseTLAD::doFirstAD
virtual void doFirstAD(Increment_ &, const util::DateTime &, const util::Duration &)=0
Increment.h