OOPS
ObserverTLAD.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_OBSERVERTLAD_H_
12 #define OOPS_BASE_OBSERVERTLAD_H_
13 
14 #include <memory>
15 #include <vector>
16 
17 #include "eckit/config/Configuration.h"
18 #include "oops/interface/GeoVaLs.h"
28 #include "oops/interface/State.h"
29 #include "oops/util/DateTime.h"
30 #include "oops/util/Duration.h"
31 
32 namespace oops {
33 
34 /// Computes observation equivalent TL and AD to/from increments.
35 
36 template <typename MODEL, typename OBS>
37 class ObserverTLAD {
49 
50  public:
51  ObserverTLAD(const eckit::Configuration &,
52  const ObsSpace_ &, const ObsAuxCtrl_ &);
54 
55  void doInitializeTraj(const State_ &, const util::DateTime &, const util::DateTime &);
56  void doProcessingTraj(const State_ &, const util::DateTime &, const util::DateTime &);
57  void doFinalizeTraj(const State_ &);
58 
59  void doInitializeTL(const Increment_ &, const util::DateTime &, const util::DateTime &);
60  void doProcessingTL(const Increment_ &, const util::DateTime &, const util::DateTime &);
61  void doFinalizeTL(const Increment_ &, ObsVector_ &, const ObsAuxIncr_ &);
62 
63  void doFirstAD(Increment_ &, const ObsVector_ &, ObsAuxIncr_ &,
64  const util::DateTime &, const util::DateTime &);
65  void doProcessingAD(Increment_ &, const util::DateTime &, const util::DateTime &);
66  void doLastAD(Increment_ &);
67 
68  private:
69  const ObsSpace_ & obsdb_;
70 // Obs operator
73 
76 
77  std::unique_ptr<LinearGetValues_> lingetvals_;
78  std::shared_ptr<GeoVaLs_> gvals_;
79 };
80 
81 // -----------------------------------------------------------------------------
82 template <typename MODEL, typename OBS>
83 ObserverTLAD<MODEL, OBS>::ObserverTLAD(const eckit::Configuration & config,
84  const ObsSpace_ & obsdb,
85  const ObsAuxCtrl_ & ybias)
86  : obsdb_(obsdb), hop_(obsdb, eckit::LocalConfiguration(config, "obs operator")),
87  hoptlad_(obsdb, eckit::LocalConfiguration(config, "linear obs operator")),
88  ybias_(ybias), geovars_(), lingetvals_(), gvals_()
89 {
92  Log::trace() << "ObserverTLAD::ObserverTLAD" << std::endl;
93 }
94 // -----------------------------------------------------------------------------
95 template <typename MODEL, typename OBS>
97  const util::DateTime & winbgn,
98  const util::DateTime & winend) {
99  Log::trace() << "ObserverTLAD::doInitializeTraj start" << std::endl;
100  lingetvals_.reset(new LinearGetValues_(xx.geometry(), hop_.locations(winbgn, winend)));
101  gvals_.reset(new GeoVaLs_(hop_.locations(winbgn, winend), geovars_));
102  Log::trace() << "ObserverTLAD::doInitializeTraj done" << std::endl;
103 }
104 // -----------------------------------------------------------------------------
105 template <typename MODEL, typename OBS>
106 void ObserverTLAD<MODEL, OBS>::doProcessingTraj(const State_ & xx, const util::DateTime & t1,
107  const util::DateTime & t2) {
108  Log::trace() << "ObserverTLAD::doProcessingTraj start" << std::endl;
109 // Call nonlinear getValues
110  lingetvals_->setTrajectory(xx, t1, t2, *gvals_);
111  Log::trace() << "ObserverTLAD::doProcessingTraj done" << std::endl;
112 }
113 // -----------------------------------------------------------------------------
114 template <typename MODEL, typename OBS>
116  Log::trace() << "ObserverTLAD::doFinalizeTraj start" << std::endl;
117  hoptlad_.setTrajectory(*gvals_, ybias_);
118  gvals_.reset();
119  Log::trace() << "ObserverTLAD::doFinalizeTraj done" << std::endl;
120 }
121 // -----------------------------------------------------------------------------
122 template <typename MODEL, typename OBS>
124  const util::DateTime & winbgn,
125  const util::DateTime & winend) {
126  Log::trace() << "ObserverTLAD::doInitializeTL start" << std::endl;
127  gvals_.reset(new GeoVaLs_(hop_.locations(winbgn, winend), hoptlad_.requiredVars()));
128  Log::trace() << "ObserverTLAD::doInitializeTL done" << std::endl;
129 }
130 // -----------------------------------------------------------------------------
131 template <typename MODEL, typename OBS>
132 void ObserverTLAD<MODEL, OBS>::doProcessingTL(const Increment_ & dx, const util::DateTime & t1,
133  const util::DateTime & t2) {
134  Log::trace() << "ObserverTLAD::doProcessingTL start" << std::endl;
135 // Get increment variables at obs locations
136  lingetvals_->fillGeoVaLsTL(dx, t1, t2, *gvals_);
137  Log::trace() << "ObserverTLAD::doProcessingTL done" << std::endl;
138 }
139 // -----------------------------------------------------------------------------
140 template <typename MODEL, typename OBS>
142  const ObsAuxIncr_ & ybiastl) {
143  Log::trace() << "ObserverTLAD::doFinalizeTL start" << std::endl;
144  hoptlad_.simulateObsTL(*gvals_, ydeptl, ybiastl);
145  gvals_.reset();
146  Log::trace() << "ObserverTLAD::doFinalizeTL done" << std::endl;
147 }
148 // -----------------------------------------------------------------------------
149 template <typename MODEL, typename OBS>
151  ObsAuxIncr_ & ybiasad,
152  const util::DateTime & winbgn,
153  const util::DateTime & winend) {
154  Log::trace() << "ObserverTLAD::doFirstAD start" << std::endl;
155  gvals_.reset(new GeoVaLs_(hop_.locations(winbgn, winend), hoptlad_.requiredVars()));
156  hoptlad_.simulateObsAD(*gvals_, ydepad, ybiasad);
157  Log::trace() << "ObserverTLAD::doFirstAD done" << std::endl;
158 }
159 // -----------------------------------------------------------------------------
160 template <typename MODEL, typename OBS>
161 void ObserverTLAD<MODEL, OBS>::doProcessingAD(Increment_ & dx, const util::DateTime & t1,
162  const util::DateTime & t2) {
163  Log::trace() << "ObserverTLAD::doProcessingAD start" << std::endl;
164 // Adjoint of get increment variables at obs locations
165  lingetvals_->fillGeoVaLsAD(dx, t1, t2, *gvals_);
166  Log::trace() << "ObserverTLAD::doProcessingAD done" << std::endl;
167 }
168 // -----------------------------------------------------------------------------
169 template <typename MODEL, typename OBS>
171  Log::trace() << "ObserverTLAD::doLastAD start" << std::endl;
172  gvals_.reset();
173  Log::trace() << "ObserverTLAD::doLastAD done" << std::endl;
174 }
175 // -----------------------------------------------------------------------------
176 
177 } // namespace oops
178 
179 #endif // OOPS_BASE_OBSERVERTLAD_H_
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
ObsAuxIncrement.h
oops::ObserverTLAD::doFinalizeTraj
void doFinalizeTraj(const State_ &)
Definition: ObserverTLAD.h:115
oops::ObserverTLAD::~ObserverTLAD
~ObserverTLAD()
Definition: ObserverTLAD.h:53
ObsAuxControl.h
oops::ObserverTLAD::ObsSpace_
ObsSpace< OBS > ObsSpace_
Definition: ObserverTLAD.h:46
oops::ObserverTLAD::ObsVector_
ObsVector< OBS > ObsVector_
Definition: ObserverTLAD.h:47
oops::ObserverTLAD::ObsDiags_
ObsDiagnostics< OBS > ObsDiags_
Definition: ObserverTLAD.h:44
oops::ObserverTLAD::hoptlad_
LinearObsOperator_ hoptlad_
Definition: ObserverTLAD.h:72
oops::ObsSpace
Definition: oops/interface/ObsSpace.h:42
oops::ObserverTLAD::doLastAD
void doLastAD(Increment_ &)
Definition: ObserverTLAD.h:170
oops::ObsAuxIncrement
Definition: oops/interface/ObsAuxIncrement.h:38
oops::ObsAuxControl::requiredVars
const Variables & requiredVars() const
Other.
Definition: oops/interface/ObsAuxControl.h:133
oops::ObserverTLAD::LinearObsOperator_
LinearObsOperator< OBS > LinearObsOperator_
Definition: ObserverTLAD.h:41
oops::ObserverTLAD::obsdb_
const ObsSpace_ & obsdb_
Definition: ObserverTLAD.h:69
oops::ObserverTLAD::lingetvals_
std::unique_ptr< LinearGetValues_ > lingetvals_
Definition: ObserverTLAD.h:77
ObsOperator.h
oops::ObsAuxControl
Definition: oops/interface/ObsAuxControl.h:35
oops::ObserverTLAD::doProcessingTL
void doProcessingTL(const Increment_ &, const util::DateTime &, const util::DateTime &)
Definition: ObserverTLAD.h:132
oops::ObsVector
Definition: oops/interface/ObsSpace.h:36
oops::ObserverTLAD::GeoVaLs_
GeoVaLs< OBS > GeoVaLs_
Definition: ObserverTLAD.h:38
oops::ObserverTLAD::gvals_
std::shared_ptr< GeoVaLs_ > gvals_
Definition: ObserverTLAD.h:78
ObsDiagnostics.h
oops::ObserverTLAD::hop_
ObsOperator_ hop_
Definition: ObserverTLAD.h:71
eckit
Definition: FieldL95.h:22
oops::LinearGetValues
sets trajectory and computes TL and AD for GetValues
Definition: oops/interface/LinearGetValues.h:33
oops::ObserverTLAD::doFinalizeTL
void doFinalizeTL(const Increment_ &, ObsVector_ &, const ObsAuxIncr_ &)
Definition: ObserverTLAD.h:141
LinearGetValues.h
oops::ObserverTLAD::geovars_
Variables geovars_
Definition: ObserverTLAD.h:75
oops::ObserverTLAD
Computes observation equivalent TL and AD to/from increments.
Definition: ObserverTLAD.h:37
LinearObsOperator.h
oops::ObserverTLAD::ObserverTLAD
ObserverTLAD(const eckit::Configuration &, const ObsSpace_ &, const ObsAuxCtrl_ &)
Definition: ObserverTLAD.h:83
oops::ObsOperator
Definition: oops/interface/ObsOperator.h:38
oops::ObserverTLAD::doProcessingTraj
void doProcessingTraj(const State_ &, const util::DateTime &, const util::DateTime &)
Definition: ObserverTLAD.h:106
oops::ObserverTLAD::ybias_
const ObsAuxCtrl_ & ybias_
Definition: ObserverTLAD.h:74
oops::ObserverTLAD::doProcessingAD
void doProcessingAD(Increment_ &, const util::DateTime &, const util::DateTime &)
Definition: ObserverTLAD.h:161
ObsSpace.h
oops::ObserverTLAD::ObsAuxCtrl_
ObsAuxControl< OBS > ObsAuxCtrl_
Definition: ObserverTLAD.h:42
oops::ObsDiagnostics
Definition: ObsDiagnostics.h:33
oops::ObserverTLAD::doInitializeTraj
void doInitializeTraj(const State_ &, const util::DateTime &, const util::DateTime &)
Definition: ObserverTLAD.h:96
oops::ObserverTLAD::LinearGetValues_
LinearGetValues< MODEL, OBS > LinearGetValues_
Definition: ObserverTLAD.h:40
oops::LinearObsOperator
Definition: oops/interface/LinearObsOperator.h:38
oops::State::geometry
Geometry_ geometry() const
Definition: oops/interface/State.h:215
oops::ObserverTLAD::Increment_
Increment< MODEL > Increment_
Definition: ObserverTLAD.h:39
oops::ObserverTLAD::State_
State< MODEL > State_
Definition: ObserverTLAD.h:48
oops::ObserverTLAD::doInitializeTL
void doInitializeTL(const Increment_ &, const util::DateTime &, const util::DateTime &)
Definition: ObserverTLAD.h:123
oops::ObsOperator::requiredVars
const Variables & requiredVars() const
Other.
Definition: oops/interface/ObsOperator.h:103
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
State.h
oops::ObserverTLAD::doFirstAD
void doFirstAD(Increment_ &, const ObsVector_ &, ObsAuxIncr_ &, const util::DateTime &, const util::DateTime &)
Definition: ObserverTLAD.h:150
oops::Variables
Definition: oops/base/Variables.h:23
ObsVector.h
oops::Increment
Increment Class: Difference between two states.
Definition: CostJbState.h:27
oops::ObserverTLAD::ObsOperator_
ObsOperator< OBS > ObsOperator_
Definition: ObserverTLAD.h:45
GeoVaLs.h
oops::GeoVaLs
Definition: oops/interface/GeoVaLs.h:32
Increment.h
oops::ObserverTLAD::ObsAuxIncr_
ObsAuxIncrement< OBS > ObsAuxIncr_
Definition: ObserverTLAD.h:43