11 #ifndef OOPS_BASE_WEIGHTEDDIFFTLAD_H_
12 #define OOPS_BASE_WEIGHTEDDIFFTLAD_H_
28 #include "oops/util/DateTime.h"
29 #include "oops/util/Duration.h"
45 template <
typename MODEL>
59 void setupAD(std::shared_ptr<const Increment_>);
63 const util::DateTime &,
const util::Duration &)
override;
68 const util::DateTime &,
const util::Duration &)
override;
81 std::unique_ptr<Accumulator<MODEL, Increment_, Increment_>>
avg_;
94 template <
typename MODEL>
96 const util::DateTime & vt,
97 const util::Duration & span,
98 const util::Duration & tstep,
102 vars_(vars), wfct_(wfct), wdiff_(vars, vt, span, tstep, resol, wfct_),
103 weights_(), forcing_(), avg_(), sum_(0.0), linit_(false),
104 vtime_(vt), bgn_(vt-span/2), end_(vt+span/2), tstep_(tstep),
107 Log::trace() <<
"WeightedDiffTLAD::WeightedDiffTLAD" << std::endl;
112 template <
typename MODEL>
114 const util::DateTime & end,
const util::Duration & tstep) {
115 Log::trace() <<
"WeightedDiffTLAD::doInitializeTraj start" << std::endl;
116 wdiff_.initialize(xx, end, tstep);
117 Log::trace() <<
"WeightedDiffTLAD::doInitializeTraj done" << std::endl;
122 template <
typename MODEL>
124 Log::trace() <<
"WeightedDiffTLAD::doProcessingTraj start" << std::endl;
126 Log::trace() <<
"WeightedDiffTLAD::doProcessingTraj done" << std::endl;
131 template <
typename MODEL>
133 Log::trace() <<
"WeightedDiffTLAD::doFinalizeTraj start" << std::endl;
135 Log::trace() <<
"WeightedDiffTLAD::doFinalizeTraj done" << std::endl;
140 template <
typename MODEL>
142 Log::trace() <<
"WeightedDiffTLAD::setupTL start" << std::endl;
144 Log::trace() <<
"WeightedDiffTLAD::setupTL done" << std::endl;
149 template <
typename MODEL>
151 const util::DateTime & end,
152 const util::Duration & tstep) {
153 Log::trace() <<
"WeightedDiffTLAD::doInitializeTL start" << std::endl;
154 const util::DateTime bgn(dx.
validTime());
156 if (!linit_ && bgn <= end_ && end >= bgn_) {
157 if (tstep_ == util::Duration(0)) tstep_ = tstep;
158 ASSERT(tstep_ > util::Duration(0));
159 weights_ = wfct_.setWeights(bgn_, end_, tstep_);
161 ASSERT(weights_.find(vtime_) != weights_.end());
162 weights_[vtime_] -= 1.0;
166 Log::trace() <<
"WeightedDiffTLAD::doInitializeTL done" << std::endl;
171 template <
typename MODEL>
173 Log::trace() <<
"WeightedDiffTLAD::doProcessingTL start" << std::endl;
174 const util::DateTime now(xx.
validTime());
175 if (((bgnleg_ < end_ && endleg_ > bgn_) || bgnleg_ == endleg_) &&
176 (now != endleg_ || now == end_ || now == bgnleg_)) {
177 ASSERT(weights_.find(now) != weights_.end());
178 const double zz = weights_[now];
179 avg_->axpy(zz, xx,
false);
182 Log::trace() <<
"WeightedDiffTLAD::doProcessingTL done" << std::endl;
187 template <
typename MODEL>
189 Log::trace() <<
"WeightedDiffTLAD::releaseOutputFromTL" << std::endl;
191 ASSERT(std::abs(sum_) < 1.0e-8);
192 return std::move(avg_);
197 template <
typename MODEL>
199 Log::trace() <<
"WeightedDiffTLAD::setupAD start" << std::endl;
201 Log::trace() <<
"WeightedDiffTLAD::setupAD done" << std::endl;
207 template <
typename MODEL>
209 const util::DateTime & bgn,
210 const util::Duration & tstep) {
211 Log::trace() <<
"WeightedDiffTLAD::doFirstAD start" << std::endl;
212 const util::DateTime end(dx.
validTime());
214 if (!linit_ && bgn <= end_ && end >= bgn_) {
215 if (tstep_ == util::Duration(0)) tstep_ = tstep;
216 ASSERT(tstep_ > util::Duration(0));
217 weights_ = wfct_.setWeights(bgn_, end_, tstep_);
219 ASSERT(weights_.find(vtime_) != weights_.end());
220 weights_[vtime_] -= 1.0;
224 Log::trace() <<
"WeightedDiffTLAD::doFirstAD done" << std::endl;
229 template <
typename MODEL>
231 Log::trace() <<
"WeightedDiffTLAD::doProcessingAD start" << std::endl;
233 const util::DateTime now(dx.
validTime());
234 if (((bgnleg_ < end_ && endleg_ > bgn_) || bgnleg_ == endleg_) &&
235 (now != endleg_ || now == end_ || now == bgnleg_)) {
236 ASSERT(weights_.find(now) != weights_.end());
237 const double zz = weights_[now];
238 dx.
axpy(zz, *forcing_,
false);
241 Log::trace() <<
"WeightedDiffTLAD::doProcessingAD done" << std::endl;
248 #endif // OOPS_BASE_WEIGHTEDDIFFTLAD_H_