OOPS
oops/interface/VariableChange.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2018 UCAR
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  */
7 
8 #ifndef OOPS_INTERFACE_VARIABLECHANGE_H_
9 #define OOPS_INTERFACE_VARIABLECHANGE_H_
10 
11 #include <memory>
12 #include <string>
13 
14 #include <boost/noncopyable.hpp>
15 
17 #include "oops/base/Variables.h"
19 #include "oops/interface/State.h"
20 #include "oops/util/Logger.h"
21 #include "oops/util/ObjectCounter.h"
22 #include "oops/util/Printable.h"
23 #include "oops/util/Timer.h"
24 
25 namespace eckit {
26  class Configuration;
27 }
28 
29 namespace oops {
30 
31 // -----------------------------------------------------------------------------
32 /// Wrapper for change of variable
33 
34 template <typename MODEL, typename CHVAR>
38 
39  public:
40  /// Defined as CHVAR::Parameters_ if CHVAR defines a Parameters_ type; otherwise as
41  /// GenericVariableChangeParameters
42  typedef TParameters_IfAvailableElseFallbackType_t<
44 
45  static const std::string classname() {return "oops::VariableChange";}
46 
47  VariableChange(const Geometry_ &, const Parameters_ &);
48  virtual ~VariableChange();
49 
50  void changeVar(const State_ &, State_ &) const override;
51  void changeVarInverse(const State_ &, State_ &) const override;
52 
53  private:
54  void print(std::ostream &) const override;
55 
56  std::unique_ptr<CHVAR> chvar_;
57 };
58 
59 // =============================================================================
60 
61 template<typename MODEL, typename CHVAR>
63  const Parameters_ & params)
64  : VariableChangeBase<MODEL>(params), chvar_()
65 {
66  Log::trace() << "VariableChange<MODEL, CHVAR>::VariableChange starting" << std::endl;
67  util::Timer timer(classname(), "VariableChange");
68  chvar_.reset(new CHVAR(geom.geometry(),
69  parametersOrConfiguration<HasParameters_<CHVAR>::value>(params)));
70  Log::trace() << "VariableChange<MODEL, CHVAR>::VariableChange done" << std::endl;
71 }
72 
73 // -----------------------------------------------------------------------------
74 
75 template<typename MODEL, typename CHVAR>
77  Log::trace() << "VariableChange<MODEL, CHVAR>::~VariableChange starting" << std::endl;
78  util::Timer timer(classname(), "~VariableChange");
79  chvar_.reset();
80  Log::trace() << "VariableChange<MODEL, CHVAR>::~VariableChange done" << std::endl;
81 }
82 
83 // -----------------------------------------------------------------------------
84 
85 template<typename MODEL, typename CHVAR>
87  Log::trace() << "VariableChange<MODEL, CHVAR>::changeVar starting" << std::endl;
88  util::Timer timer(classname(), "changeVar");
89  chvar_->changeVar(x1.state(), x2.state());
90  Log::trace() << "VariableChange<MODEL, CHVAR>::changeVar done" << std::endl;
91 }
92 
93 // -----------------------------------------------------------------------------
94 
95 template<typename MODEL, typename CHVAR>
97  Log::trace() << "VariableChange<MODEL, CHVAR>::changeVarInverse starting" << std::endl;
98  util::Timer timer(classname(), "changeVarInverse");
99  chvar_->changeVarInverse(x1.state(), x2.state());
100  Log::trace() << "VariableChange<MODEL, CHVAR>::changeVarInverse done" << std::endl;
101 }
102 
103 // -----------------------------------------------------------------------------
104 
105 template<typename MODEL, typename CHVAR>
106 void VariableChange<MODEL, CHVAR>::print(std::ostream & os) const {
107  Log::trace() << "VariableChange<MODEL, CHVAR>::print starting" << std::endl;
108  util::Timer timer(classname(), "print");
109  os << *chvar_;
110  Log::trace() << "VariableChange<MODEL, CHVAR>::print done" << std::endl;
111 }
112 
113 // -----------------------------------------------------------------------------
114 
115 } // namespace oops
116 
117 #endif // OOPS_INTERFACE_VARIABLECHANGE_H_
oops::GenericVariableChangeParameters
A subclass of VariableChangeParametersBase storing the values of all options in a single Configuratio...
Definition: VariableChangeBase.h:88
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::VariableChangeBase
Definition: VariableChangeBase.h:49
oops::VariableChange::changeVarInverse
void changeVarInverse(const State_ &, State_ &) const override
Definition: oops/interface/VariableChange.h:96
oops::VariableChange::~VariableChange
virtual ~VariableChange()
Definition: oops/interface/VariableChange.h:76
oops::VariableChange::VariableChange
VariableChange(const Geometry_ &, const Parameters_ &)
Definition: oops/interface/VariableChange.h:62
oops::State::state
State_ & state()
Interfacing.
Definition: oops/interface/State.h:56
oops::VariableChange::State_
State< MODEL > State_
Definition: oops/interface/VariableChange.h:37
oops::VariableChange::chvar_
std::unique_ptr< CHVAR > chvar_
Definition: oops/interface/VariableChange.h:56
eckit
Definition: FieldL95.h:22
oops::VariableChange::classname
static const std::string classname()
Definition: oops/interface/VariableChange.h:45
oops::VariableChange::changeVar
void changeVar(const State_ &, State_ &) const override
Definition: oops/interface/VariableChange.h:86
oops::Geometry
Geometry class used in oops; subclass of interface class above.
Definition: oops/interface/Geometry.h:189
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::VariableChange::Parameters_
TParameters_IfAvailableElseFallbackType_t< CHVAR, GenericVariableChangeParameters > Parameters_
Definition: oops/interface/VariableChange.h:43
State.h
oops::VariableChange::Geometry_
Geometry< MODEL > Geometry_
Definition: oops/interface/VariableChange.h:36
oops::VariableChange
Wrapper for change of variable.
Definition: oops/interface/VariableChange.h:35
Variables.h
VariableChangeBase.h
oops::VariableChange::print
void print(std::ostream &) const override
Definition: oops/interface/VariableChange.h:106
Geometry.h
oops::Geometry::geometry
const Geometry_ & geometry() const
Interfacing with other oops classes.
Definition: oops/interface/Geometry.h:206