11 #ifndef OOPS_INTERFACE_LINEARMODEL_H_
12 #define OOPS_INTERFACE_LINEARMODEL_H_
17 #include <boost/noncopyable.hpp>
27 #include "oops/util/Duration.h"
28 #include "oops/util/Logger.h"
29 #include "oops/util/ObjectCounter.h"
30 #include "oops/util/Printable.h"
31 #include "oops/util/Timer.h"
62 template <
typename MODEL>
64 private boost::noncopyable,
65 private util::ObjectCounter<LinearModel<MODEL> > {
74 static const std::string
classname() {
return "oops::LinearModel";}
84 const bool idmodel =
false)
const;
90 const bool idmodel =
false)
const;
112 void print(std::ostream &)
const;
114 std::unique_ptr<LinearModelBase_>
tlm_;
119 template<
typename MODEL>
123 Log::trace() <<
"LinearModel<MODEL>::LinearModel starting" << std::endl;
124 util::Timer timer(
classname(),
"LinearModel");
125 Log::info() <<
"LinearModel configuration is:" <<
params << std::endl;
127 Log::trace() <<
"LinearModel<MODEL>::LinearModel done" << std::endl;
132 template<
typename MODEL>
140 template<
typename MODEL>
142 Log::trace() <<
"LinearModel<MODEL>::~LinearModel starting" << std::endl;
143 util::Timer timer(classname(),
"~LinearModel");
145 Log::trace() <<
"LinearModel<MODEL>::~LinearModel done" << std::endl;
154 template<
typename MODEL>
156 const util::Duration & len,
159 const bool idmodel)
const {
160 Log::trace() <<
"LinearModel<MODEL>::forecastTL starting" << std::endl;
162 const util::DateTime end(dx.
validTime() + len);
163 const util::Duration tstep(tlm_->timeResolution());
164 Log::info() <<
"LinearModel<MODEL>::forecastTL: Starting " << dx << std::endl;
165 this->initializeTL(dx);
178 this->stepTL(dx, mctl);
185 this->finalizeTL(dx);
186 Log::info() <<
"LinearModel<MODEL>::forecastTL: Finished " << dx << std::endl;
189 Log::trace() <<
"LinearModel<MODEL>::forecastTL done" << std::endl;
194 template<
typename MODEL>
196 const util::Duration & len,
199 const bool idmodel)
const {
200 Log::trace() <<
"LinearModel<MODEL>::forecastAD starting" << std::endl;
202 const util::DateTime bgn(dx.
validTime() - len);
203 const util::Duration tstep(tlm_->timeResolution());
204 Log::info() <<
"LinearModel<MODEL>::forecastAD: Starting " << dx << std::endl;
205 this->initializeAD(dx);
217 this->stepAD(dx, mctl);
225 this->finalizeAD(dx);
226 Log::info() <<
"LinearModel<MODEL>::forecastAD: Finished " << dx << std::endl;
229 Log::trace() <<
"LinearModel<MODEL>::forecastAD done" << std::endl;
234 template<
typename MODEL>
237 Log::trace() <<
"LinearModel<MODEL>::setTrajectory starting" << std::endl;
238 util::Timer timer(classname(),
"setTrajectory");
239 tlm_->setTrajectory(xx, xlr, maux);
240 Log::trace() <<
"LinearModel<MODEL>::setTrajectory done" << std::endl;
245 template<
typename MODEL>
247 Log::trace() <<
"LinearModel<MODEL>::initializeTL starting" << std::endl;
248 util::Timer timer(classname(),
"initializeTL");
249 tlm_->initializeTL(dx);
250 Log::trace() <<
"LinearModel<MODEL>::initializeTL done" << std::endl;
255 template<
typename MODEL>
257 Log::trace() <<
"LinearModel<MODEL>::stepTL starting" << std::endl;
258 util::Timer timer(classname(),
"stepTL");
259 tlm_->stepTL(dx, merr);
260 Log::trace() <<
"LinearModel<MODEL>::stepTL done" << std::endl;
265 template<
typename MODEL>
267 Log::trace() <<
"LinearModel<MODEL>::finalizeTL starting" << std::endl;
268 util::Timer timer(classname(),
"finalizeTL");
269 tlm_->finalizeTL(dx);
270 Log::trace() <<
"LinearModel<MODEL>::finalizeTL done" << std::endl;
275 template<
typename MODEL>
277 Log::trace() <<
"LinearModel<MODEL>::initializeAD starting" << std::endl;
278 util::Timer timer(classname(),
"initializeAD");
279 tlm_->initializeAD(dx);
280 Log::trace() <<
"LinearModel<MODEL>::initializeAD done" << std::endl;
285 template<
typename MODEL>
287 Log::trace() <<
"LinearModel<MODEL>::stepAD starting" << std::endl;
288 util::Timer timer(classname(),
"stepAD");
289 tlm_->stepAD(dx, merr);
290 Log::trace() <<
"LinearModel<MODEL>::stepAD done" << std::endl;
295 template<
typename MODEL>
297 Log::trace() <<
"LinearModel<MODEL>::finalizeAD starting" << std::endl;
298 util::Timer timer(classname(),
"finalizeAD");
299 tlm_->finalizeAD(dx);
300 Log::trace() <<
"LinearModel<MODEL>::finalizeAD done" << std::endl;
305 template<
typename MODEL>
307 Log::trace() <<
"LinearModel<MODEL>::print starting" << std::endl;
308 util::Timer timer(classname(),
"print");
310 Log::trace() <<
"LinearModel<MODEL>::print done" << std::endl;
Geometry class used in oops; subclass of interface class interface::Geometry.
Increment class used in oops.
Base class for encapsulation of the linear forecast model.
Tangent linear model factory.
Encapsulates the linear forecast model.
Geometry< MODEL > Geometry_
void initializeTL(Increment_ &) const
static const std::string classname()
void forecastAD(Increment_ &, ModelAuxIncr_ &, const util::Duration &, PostProcessor< Increment_ > post=PostProcessor< Increment_ >(), PostProcessorTLAD< MODEL > cost=PostProcessorTLAD< MODEL >(), const bool idmodel=false) const
Run the adjoint forecast.
LinearModelBase< MODEL > LinearModelBase_
void finalizeAD(Increment_ &) const
const util::Duration & timeResolution() const
void stepTL(Increment_ &, const ModelAuxIncr_ &) const
void stepAD(Increment_ &, ModelAuxIncr_ &) const
ModelAuxControl< MODEL > ModelAux_
void finalizeTL(Increment_ &) const
const oops::Variables & variables() const
ModelAuxIncrement< MODEL > ModelAuxIncr_
void forecastTL(Increment_ &, const ModelAuxIncr_ &, const util::Duration &, PostProcessor< Increment_ > post=PostProcessor< Increment_ >(), PostProcessorTLAD< MODEL > cost=PostProcessorTLAD< MODEL >(), const bool idmodel=false) const
Run the tangent linear forecast.
void initializeAD(Increment_ &) const
LinearModel(const Geometry_ &, const LinearModelParametersBase &)
void setTrajectory(const State_ &, State_ &, const ModelAux_ &)
std::unique_ptr< LinearModelBase_ > tlm_
Increment< MODEL > Increment_
void print(std::ostream &) const
Base class for classes storing model-specific parameters.
Contains a polymorphic parameter holding an instance of a subclass of LinearModelParametersBase.
Control model post processing.
void process(const FLDS &xx)
void finalize(const FLDS &xx)
void initialize(const FLDS &xx, const util::DateTime &end, const util::Duration &step)
Control model post processing.
void finalizeAD(Increment_ &dx)
void processTL(const Increment_ &dx)
void processAD(Increment_ &dx)
void finalizeTL(const Increment_ &dx)
void initializeTL(const Increment_ &dx, const util::DateTime &end, const util::Duration &step)
Tangent linear methods.
void initializeAD(Increment_ &dx, const util::DateTime &bgn, const util::Duration &step)
Adjoint methods.
State class used in oops; subclass of interface class interface::State.
void updateTime(const util::Duration &dt)
Updates this Increment's valid time by dt (used in PseudoModel)
const util::DateTime validTime() const
Accessor to the time of this Increment.
The namespace for the main oops code.