OOPS
ObserversTLAD.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_OBSERVERSTLAD_H_
12 #define OOPS_BASE_OBSERVERSTLAD_H_
13 
14 #include <algorithm>
15 #include <memory>
16 #include <utility>
17 #include <vector>
18 
19 #include "eckit/config/Configuration.h"
20 #include "oops/base/Departures.h"
24 #include "oops/base/Observations.h"
25 #include "oops/base/ObserverTLAD.h"
26 #include "oops/base/ObsSpaces.h"
27 #include "oops/base/PostBaseTLAD.h"
29 #include "oops/interface/State.h"
30 #include "oops/util/DateTime.h"
31 #include "oops/util/Duration.h"
32 
33 namespace oops {
34 
35 /// Computes observation equivalent TL and AD to/from increments.
36 
37 template <typename MODEL, typename OBS>
38 class ObserversTLAD : public PostBaseTLAD<MODEL> {
48 
49  public:
50  ObserversTLAD(const eckit::Configuration &,
51  const ObsSpaces_ &, const ObsAuxCtrls_ &);
53 
54  std::unique_ptr<GeneralizedDepartures> releaseOutputFromTL() override {return std::move(ydeptl_);}
55  void setupTL(const ObsAuxIncrs_ &);
56  void setupAD(std::shared_ptr<const Departures_>, ObsAuxIncrs_ &);
57 
58  private:
59 // Methods
60  void doInitializeTraj(const State_ &,
61  const util::DateTime &, const util::Duration &) override;
62  void doProcessingTraj(const State_ &) override;
63  void doFinalizeTraj(const State_ &) override;
64 
65  void doInitializeTL(const Increment_ &,
66  const util::DateTime &, const util::Duration &) override;
67  void doProcessingTL(const Increment_ &) override;
68  void doFinalizeTL(const Increment_ &) override;
69 
70  void doFirstAD(Increment_ &, const util::DateTime &, const util::Duration &) override;
71  void doProcessingAD(Increment_ &) override;
72  void doLastAD(Increment_ &) override;
73 
74 // Obs operator
75  std::vector<std::shared_ptr<ObserverTLAD_>> observerstlad_;
76 
77 // Data
79  std::unique_ptr<Departures_> ydeptl_;
81  std::shared_ptr<const Departures_> ydepad_;
83 
84  util::DateTime winbgn_; //!< Begining of assimilation window
85  util::DateTime winend_; //!< End of assimilation window
86  util::Duration hslot_, hslottraj_; //!< Half time slot
87 };
88 
89 // -----------------------------------------------------------------------------
90 template <typename MODEL, typename OBS>
91 ObserversTLAD<MODEL, OBS>::ObserversTLAD(const eckit::Configuration & config,
92  const ObsSpaces_ & obsdb,
93  const ObsAuxCtrls_ & ybias)
94  : PostBaseTLAD<MODEL>(obsdb.windowStart(), obsdb.windowEnd()),
95  observerstlad_(), obspace_(obsdb),
96  ydeptl_(), ybiastl_(), ydepad_(), ybiasad_(),
97  winbgn_(obsdb.windowStart()), winend_(obsdb.windowEnd()),
98  hslot_(0), hslottraj_(0)
99 {
100  // setup observers
101  std::vector<eckit::LocalConfiguration> typeconf;
102  config.get("observations", typeconf);
103  for (std::size_t jobs = 0; jobs < obsdb.size(); ++jobs) {
104  // Set LinearObsOperator section to ObsOperator section if not available
105  if (!typeconf[jobs].has("linear obs operator")) {
106  typeconf[jobs].set("linear obs operator", typeconf[jobs].getSubConfiguration("obs operator"));
107  }
108  std::shared_ptr<ObserverTLAD_> tmp(new ObserverTLAD_(typeconf[jobs], obsdb[jobs], ybias[jobs]));
109  observerstlad_.push_back(tmp);
110  }
111  Log::trace() << "ObserversTLAD::ObserversTLAD" << std::endl;
112 }
113 // -----------------------------------------------------------------------------
114 template <typename MODEL, typename OBS>
116  const util::DateTime & end,
117  const util::Duration & tstep) {
118  Log::trace() << "ObserversTLAD::doInitializeTraj start" << std::endl;
119 // Create full trajectory object
120 
121  hslottraj_ = tstep/2;
122 
123  for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
124  observerstlad_[jj]->doInitializeTraj(xx, winbgn_, winend_);
125  }
126  Log::trace() << "ObserversTLAD::doInitializeTraj done" << std::endl;
127 }
128 // -----------------------------------------------------------------------------
129 template <typename MODEL, typename OBS>
131  Log::trace() << "ObserversTLAD::doProcessingTraj start" << std::endl;
132  util::DateTime t1 = std::max(xx.validTime()-hslottraj_, winbgn_);
133  util::DateTime t2 = std::min(xx.validTime()+hslottraj_, winend_);
134 
135  for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
136  observerstlad_[jj]->doProcessingTraj(xx, t1, t2);
137  }
138  Log::trace() << "ObserversTLAD::doProcessingTraj done" << std::endl;
139 }
140 // -----------------------------------------------------------------------------
141 template <typename MODEL, typename OBS>
143  Log::trace() << "ObserversTLAD::doFinalizeTraj start" << std::endl;
144  for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
145  observerstlad_[jj]->doFinalizeTraj(xx);
146  }
147  Log::trace() << "ObserversTLAD::doFinalizeTraj done" << std::endl;
148 }
149 // -----------------------------------------------------------------------------
150 template <typename MODEL, typename OBS>
152  Log::trace() << "ObserversTLAD::setupTL start" << std::endl;
153  ydeptl_.reset(new Departures_(obspace_));
154  ybiastl_ = &ybiastl;
155  Log::trace() << "ObserversTLAD::setupTL done" << std::endl;
156 }
157 // -----------------------------------------------------------------------------
158 template <typename MODEL, typename OBS>
160  const util::DateTime & end,
161  const util::Duration & tstep) {
162  Log::trace() << "ObserversTLAD::doInitializeTL start" << std::endl;
163  hslot_ = tstep/2;
164  for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
165  observerstlad_[jj]->doInitializeTL(dx, winbgn_, winend_);
166  }
167  Log::trace() << "ObserversTLAD::doInitializeTL done" << std::endl;
168 }
169 // -----------------------------------------------------------------------------
170 template <typename MODEL, typename OBS>
172  Log::trace() << "ObserversTLAD::doProcessingTL start" << std::endl;
173  util::DateTime t1 = std::max(dx.validTime()-hslot_, winbgn_);
174  util::DateTime t2 = std::min(dx.validTime()+hslot_, winend_);
175 
176  for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
177  observerstlad_[jj]->doProcessingTL(dx, t1, t2);
178  }
179  Log::trace() << "ObserversTLAD::doProcessingTL done" << std::endl;
180 }
181 // -----------------------------------------------------------------------------
182 template <typename MODEL, typename OBS>
184  Log::trace() << "ObserversTLAD::doFinalizeTL start" << std::endl;
185  for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
186  observerstlad_[jj]->doFinalizeTL(dx, (*ydeptl_)[jj], (*ybiastl_)[jj]);
187  }
188  Log::trace() << "ObserversTLAD::doFinalizeTL done" << std::endl;
189 }
190 // -----------------------------------------------------------------------------
191 template <typename MODEL, typename OBS>
192 void ObserversTLAD<MODEL, OBS>::setupAD(std::shared_ptr<const Departures_> ydepad,
193  ObsAuxIncrs_ & ybiasad) {
194  Log::trace() << "ObserversTLAD::setupAD start" << std::endl;
195  ydepad_ = ydepad;
196  ybiasad_ = &ybiasad;
197  Log::trace() << "ObserversTLAD::setupAD done" << std::endl;
198 }
199 // -----------------------------------------------------------------------------
200 template <typename MODEL, typename OBS>
201 void ObserversTLAD<MODEL, OBS>::doFirstAD(Increment_ & dx, const util::DateTime & bgn,
202  const util::Duration & tstep) {
203  Log::trace() << "ObserversTLAD::doFirstAD start" << std::endl;
204  hslot_ = tstep/2;
205 
206  for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
207  observerstlad_[jj]->doFirstAD(dx, (*ydepad_)[jj], (*ybiasad_)[jj], winbgn_, winend_);
208  }
209  Log::trace() << "ObserversTLAD::doFirstAD done" << std::endl;
210 }
211 // -----------------------------------------------------------------------------
212 template <typename MODEL, typename OBS>
214  Log::trace() << "ObserversTLAD::doProcessingAD start" << std::endl;
215  util::DateTime t1 = std::max(dx.validTime()-hslot_, winbgn_);
216  util::DateTime t2 = std::min(dx.validTime()+hslot_, winend_);
217 
218  for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
219  observerstlad_[jj]->doProcessingAD(dx, t1, t2);
220  }
221  Log::trace() << "ObserversTLAD::doProcessingAD done" << std::endl;
222 }
223 // -----------------------------------------------------------------------------
224 template <typename MODEL, typename OBS>
226  Log::trace() << "ObserversTLAD::doLastAD start" << std::endl;
227  for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
228  observerstlad_[jj]->doLastAD(dx);
229  }
230  Log::trace() << "ObserversTLAD::doLastAD done" << std::endl;
231 }
232 // -----------------------------------------------------------------------------
233 
234 } // namespace oops
235 
236 #endif // OOPS_BASE_OBSERVERSTLAD_H_
oops::State::validTime
const util::DateTime validTime() const
Time.
Definition: oops/interface/State.h:60
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ObserversTLAD::winbgn_
util::DateTime winbgn_
Begining of assimilation window.
Definition: ObserversTLAD.h:84
oops::ObserversTLAD::doProcessingTraj
void doProcessingTraj(const State_ &) override
Definition: ObserversTLAD.h:130
PostBaseTLAD.h
ObserverTLAD.h
oops::ObserversTLAD::doProcessingTL
void doProcessingTL(const Increment_ &) override
Definition: ObserversTLAD.h:171
oops::PostBaseTLAD
Handles post-processing of model fields related to cost function.
Definition: PostBaseTLAD.h:41
oops::ObsAuxControls
Definition: ObsAuxControls.h:26
oops::ObserversTLAD::doFirstAD
void doFirstAD(Increment_ &, const util::DateTime &, const util::Duration &) override
Definition: ObserversTLAD.h:201
oops::ObserversTLAD::ObserverTLAD_
ObserverTLAD< MODEL, OBS > ObserverTLAD_
Definition: ObserversTLAD.h:45
ObsSpaces.h
oops::ObserversTLAD
Computes observation equivalent TL and AD to/from increments.
Definition: ObserversTLAD.h:38
oops::ObserversTLAD::Observations_
Observations< OBS > Observations_
Definition: ObserversTLAD.h:42
oops::ObserversTLAD::ObsAuxCtrls_
ObsAuxControls< OBS > ObsAuxCtrls_
Definition: ObserversTLAD.h:43
oops::ObserversTLAD::State_
State< MODEL > State_
Definition: ObserversTLAD.h:47
oops::ObserversTLAD::hslot_
util::Duration hslot_
Definition: ObserversTLAD.h:86
oops::ObserversTLAD::doProcessingAD
void doProcessingAD(Increment_ &) override
Definition: ObserversTLAD.h:213
oops::ObserversTLAD::doInitializeTraj
void doInitializeTraj(const State_ &, const util::DateTime &, const util::Duration &) override
Definition: ObserversTLAD.h:115
oops::ObserversTLAD::setupTL
void setupTL(const ObsAuxIncrs_ &)
Definition: ObserversTLAD.h:151
Departures.h
oops::ObserversTLAD::GeoVaLs_
GeoVaLs< OBS > GeoVaLs_
Definition: ObserversTLAD.h:40
oops::Increment::validTime
const util::DateTime validTime() const
Time.
Definition: oops/interface/Increment.h:72
oops::ObserversTLAD::ybiastl_
const ObsAuxIncrs_ * ybiastl_
Definition: ObserversTLAD.h:80
ObsAuxControls.h
oops::ObserversTLAD::ObsSpaces_
ObsSpaces< OBS > ObsSpaces_
Definition: ObserversTLAD.h:46
oops::ObsSpaces::size
std::size_t size() const
Access.
Definition: ObsSpaces.h:57
oops::ObserversTLAD::ydeptl_
std::unique_ptr< Departures_ > ydeptl_
Definition: ObserversTLAD.h:79
Observations.h
oops::ObserverTLAD
Computes observation equivalent TL and AD to/from increments.
Definition: ObserverTLAD.h:37
oops::Departures
Difference between two observation vectors.
Definition: oops/base/Departures.h:44
oops::ObserversTLAD::ydepad_
std::shared_ptr< const Departures_ > ydepad_
Definition: ObserversTLAD.h:81
oops::ObserversTLAD::obspace_
ObsSpaces_ obspace_
Definition: ObserversTLAD.h:78
oops::ObserversTLAD::doFinalizeTL
void doFinalizeTL(const Increment_ &) override
Definition: ObserversTLAD.h:183
oops::ObserversTLAD::doInitializeTL
void doInitializeTL(const Increment_ &, const util::DateTime &, const util::Duration &) override
Definition: ObserversTLAD.h:159
ObsAuxIncrements.h
oops::ObserversTLAD::~ObserversTLAD
~ObserversTLAD()
Definition: ObserversTLAD.h:52
oops::ObserversTLAD::doFinalizeTraj
void doFinalizeTraj(const State_ &) override
Definition: ObserversTLAD.h:142
oops::ObserversTLAD::Departures_
Departures< OBS > Departures_
Definition: ObserversTLAD.h:39
oops::ObserversTLAD::winend_
util::DateTime winend_
End of assimilation window.
Definition: ObserversTLAD.h:85
oops::ObserversTLAD::ybiasad_
ObsAuxIncrs_ * ybiasad_
Definition: ObserversTLAD.h:82
oops::ObserversTLAD::Increment_
Increment< MODEL > Increment_
Definition: ObserversTLAD.h:41
oops::Observations
Observations Class.
Definition: oops/base/Departures.h:30
oops::ObserversTLAD::hslottraj_
util::Duration hslottraj_
Half time slot.
Definition: ObserversTLAD.h:86
oops::ObsAuxIncrements
Definition: ObsAuxIncrements.h:29
oops_variables_mod::has
logical function has(this, var)
Definition: variables_mod.F90:140
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::ObserversTLAD::doLastAD
void doLastAD(Increment_ &) override
Definition: ObserversTLAD.h:225
oops::ObserversTLAD::ObserversTLAD
ObserversTLAD(const eckit::Configuration &, const ObsSpaces_ &, const ObsAuxCtrls_ &)
Definition: ObserversTLAD.h:91
State.h
GeneralizedDepartures.h
oops::ObsSpaces
Definition: ObsSpaces.h:41
oops::ObserversTLAD::setupAD
void setupAD(std::shared_ptr< const Departures_ >, ObsAuxIncrs_ &)
Definition: ObserversTLAD.h:192
oops::Increment
Increment Class: Difference between two states.
Definition: CostJbState.h:27
oops::ObserversTLAD::releaseOutputFromTL
std::unique_ptr< GeneralizedDepartures > releaseOutputFromTL() override
Return TL dual space output.
Definition: ObserversTLAD.h:54
oops::GeoVaLs
Definition: oops/interface/GeoVaLs.h:32
oops::ObserversTLAD::ObsAuxIncrs_
ObsAuxIncrements< OBS > ObsAuxIncrs_
Definition: ObserversTLAD.h:44
oops::ObserversTLAD::observerstlad_
std::vector< std::shared_ptr< ObserverTLAD_ > > observerstlad_
Definition: ObserversTLAD.h:75
Increment.h