UFO
ObsOperatorBase.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2017-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 UFO_OBSOPERATORBASE_H_
9 #define UFO_OBSOPERATORBASE_H_
10 
11 #include <map>
12 #include <memory>
13 #include <string>
14 
15 #include <boost/noncopyable.hpp>
16 
17 #include "eckit/config/Configuration.h"
18 #include "ioda/ObsSpace.h"
19 #include "oops/base/Variables.h"
20 #include "oops/util/abor1_cpp.h"
21 #include "oops/util/DateTime.h"
22 #include "oops/util/Printable.h"
23 
24 namespace ioda {
25  class ObsVector;
26 }
27 
28 namespace ufo {
29  class GeoVaLs;
30  class Locations;
31  class ObsDiagnostics;
32 
33 // -----------------------------------------------------------------------------
34 /// Base class for observation operators
35 
36 class ObsOperatorBase : public util::Printable,
37  private boost::noncopyable {
38  public:
39  ObsOperatorBase(const ioda::ObsSpace & odb, const eckit::Configuration &)
40  : odb_(odb) {}
41  virtual ~ObsOperatorBase() {}
42 
43 /// Obs Operator
44  virtual void simulateObs(const GeoVaLs &, ioda::ObsVector &, ObsDiagnostics &) const = 0;
45 
46 /// Operator input required from Model
47  virtual const oops::Variables & requiredVars() const = 0;
48 
49 /// Locations for GeoVaLs
50  virtual std::unique_ptr<Locations> locations(const util::DateTime &,
51  const util::DateTime &) const;
52 
53  private:
54  virtual void print(std::ostream &) const = 0;
55  const ioda::ObsSpace & odb_;
56 };
57 
58 // -----------------------------------------------------------------------------
59 
60 /// Obs Operator Factory
62  public:
63  static ObsOperatorBase * create(const ioda::ObsSpace &, const eckit::Configuration &);
64  virtual ~ObsOperatorFactory() = default;
65  protected:
66  explicit ObsOperatorFactory(const std::string &);
67  private:
68  virtual ObsOperatorBase * make(const ioda::ObsSpace &, const eckit::Configuration &) = 0;
69  static std::map < std::string, ObsOperatorFactory * > & getMakers() {
70  static std::map < std::string, ObsOperatorFactory * > makers_;
71  return makers_;
72  }
73 };
74 
75 // -----------------------------------------------------------------------------
76 
77 template<class T>
79  virtual ObsOperatorBase * make(const ioda::ObsSpace & odb, const eckit::Configuration & conf)
80  { return new T(odb, conf); }
81  public:
82  explicit ObsOperatorMaker(const std::string & name) : ObsOperatorFactory(name) {}
83 };
84 
85 // -----------------------------------------------------------------------------
86 
87 } // namespace ufo
88 
89 #endif // UFO_OBSOPERATORBASE_H_
ufo::ObsOperatorBase::~ObsOperatorBase
virtual ~ObsOperatorBase()
Definition: ObsOperatorBase.h:41
ufo::ObsOperatorFactory::ObsOperatorFactory
ObsOperatorFactory(const std::string &)
Definition: ObsOperatorBase.cc:27
ufo::ObsOperatorBase::print
virtual void print(std::ostream &) const =0
ufo::ObsOperatorBase::ObsOperatorBase
ObsOperatorBase(const ioda::ObsSpace &odb, const eckit::Configuration &)
Definition: ObsOperatorBase.h:39
ufo::ObsOperatorMaker::ObsOperatorMaker
ObsOperatorMaker(const std::string &name)
Definition: ObsOperatorBase.h:82
ioda
Definition: ObsAtmSfcInterp.h:24
ufo
Definition: RunCRTM.h:27
ufo::ObsOperatorBase
Base class for observation operators.
Definition: ObsOperatorBase.h:37
ufo::ObsOperatorMaker::make
virtual ObsOperatorBase * make(const ioda::ObsSpace &odb, const eckit::Configuration &conf)
Definition: ObsOperatorBase.h:79
ufo::ObsOperatorBase::requiredVars
virtual const oops::Variables & requiredVars() const =0
Operator input required from Model.
ufo::ObsDiagnostics
Definition: src/ufo/ObsDiagnostics.h:35
ufo::ObsOperatorFactory
Obs Operator Factory.
Definition: ObsOperatorBase.h:61
ufo::ObsOperatorFactory::make
virtual ObsOperatorBase * make(const ioda::ObsSpace &, const eckit::Configuration &)=0
ufo::ObsOperatorMaker
Definition: ObsOperatorBase.h:78
ufo::ObsOperatorBase::locations
virtual std::unique_ptr< Locations > locations(const util::DateTime &, const util::DateTime &) const
Locations for GeoVaLs.
Definition: ObsOperatorBase.cc:20
ufo::GeoVaLs
GeoVaLs: geophysical values at locations.
Definition: src/ufo/GeoVaLs.h:39
ufo::ObsOperatorBase::odb_
const ioda::ObsSpace & odb_
Definition: ObsOperatorBase.h:55
ufo::ObsOperatorFactory::getMakers
static std::map< std::string, ObsOperatorFactory * > & getMakers()
Definition: ObsOperatorBase.h:69
ufo::ObsOperatorFactory::~ObsOperatorFactory
virtual ~ObsOperatorFactory()=default
ufo::ObsOperatorFactory::create
static ObsOperatorBase * create(const ioda::ObsSpace &, const eckit::Configuration &)
Definition: ObsOperatorBase.cc:37
conf
Definition: conf.py:1
ufo::ObsOperatorBase::simulateObs
virtual void simulateObs(const GeoVaLs &, ioda::ObsVector &, ObsDiagnostics &) const =0
Obs Operator.