11 #ifndef OOPS_BASE_OBSERVERSTLAD_H_
12 #define OOPS_BASE_OBSERVERSTLAD_H_
19 #include "eckit/config/Configuration.h"
30 #include "oops/util/DateTime.h"
31 #include "oops/util/Duration.h"
37 template <
typename MODEL,
typename OBS>
61 const util::DateTime &,
const util::Duration &)
override;
66 const util::DateTime &,
const util::Duration &)
override;
81 std::shared_ptr<const Departures_>
ydepad_;
90 template <
typename MODEL,
typename OBS>
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)
101 std::vector<eckit::LocalConfiguration> typeconf;
102 config.get(
"observations", typeconf);
103 for (std::size_t jobs = 0; jobs < obsdb.
size(); ++jobs) {
105 if (!typeconf[jobs].
has(
"linear obs operator")) {
106 typeconf[jobs].set(
"linear obs operator", typeconf[jobs].getSubConfiguration(
"obs operator"));
108 std::shared_ptr<ObserverTLAD_> tmp(
new ObserverTLAD_(typeconf[jobs], obsdb[jobs], ybias[jobs]));
111 Log::trace() <<
"ObserversTLAD::ObserversTLAD" << std::endl;
114 template <
typename MODEL,
typename OBS>
116 const util::DateTime & end,
117 const util::Duration & tstep) {
118 Log::trace() <<
"ObserversTLAD::doInitializeTraj start" << std::endl;
121 hslottraj_ = tstep/2;
123 for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
124 observerstlad_[jj]->doInitializeTraj(xx, winbgn_, winend_);
126 Log::trace() <<
"ObserversTLAD::doInitializeTraj done" << std::endl;
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_);
135 for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
136 observerstlad_[jj]->doProcessingTraj(xx, t1, t2);
138 Log::trace() <<
"ObserversTLAD::doProcessingTraj done" << std::endl;
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);
147 Log::trace() <<
"ObserversTLAD::doFinalizeTraj done" << std::endl;
150 template <
typename MODEL,
typename OBS>
152 Log::trace() <<
"ObserversTLAD::setupTL start" << std::endl;
155 Log::trace() <<
"ObserversTLAD::setupTL done" << std::endl;
158 template <
typename MODEL,
typename OBS>
160 const util::DateTime & end,
161 const util::Duration & tstep) {
162 Log::trace() <<
"ObserversTLAD::doInitializeTL start" << std::endl;
164 for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
165 observerstlad_[jj]->doInitializeTL(dx, winbgn_, winend_);
167 Log::trace() <<
"ObserversTLAD::doInitializeTL done" << std::endl;
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_);
176 for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
177 observerstlad_[jj]->doProcessingTL(dx, t1, t2);
179 Log::trace() <<
"ObserversTLAD::doProcessingTL done" << std::endl;
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]);
188 Log::trace() <<
"ObserversTLAD::doFinalizeTL done" << std::endl;
191 template <
typename MODEL,
typename OBS>
194 Log::trace() <<
"ObserversTLAD::setupAD start" << std::endl;
197 Log::trace() <<
"ObserversTLAD::setupAD done" << std::endl;
200 template <
typename MODEL,
typename OBS>
202 const util::Duration & tstep) {
203 Log::trace() <<
"ObserversTLAD::doFirstAD start" << std::endl;
206 for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
207 observerstlad_[jj]->doFirstAD(dx, (*ydepad_)[jj], (*ybiasad_)[jj], winbgn_, winend_);
209 Log::trace() <<
"ObserversTLAD::doFirstAD done" << std::endl;
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_);
218 for (std::size_t jj = 0; jj < observerstlad_.size(); ++jj) {
219 observerstlad_[jj]->doProcessingAD(dx, t1, t2);
221 Log::trace() <<
"ObserversTLAD::doProcessingAD done" << std::endl;
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);
230 Log::trace() <<
"ObserversTLAD::doLastAD done" << std::endl;
236 #endif // OOPS_BASE_OBSERVERSTLAD_H_