OOPS
ObsLocalizationBase.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2020 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_BASE_OBSLOCALIZATIONBASE_H_
9 #define OOPS_BASE_OBSLOCALIZATIONBASE_H_
10 
11 #include <map>
12 #include <memory>
13 #include <string>
14 #include <vector>
15 #include <boost/noncopyable.hpp>
16 
17 #include "eckit/config/Configuration.h"
20 #include "oops/util/Printable.h"
21 
22 namespace oops {
23 
24 // -----------------------------------------------------------------------------
25 /// Base class for generic localizations
26 
27 template<typename OBS>
28 class ObsLocalizationBase : public util::Printable,
29  private boost::noncopyable {
31  public:
33  virtual ~ObsLocalizationBase() {}
34 
35  virtual void multiply(ObsVector_ &) const = 0;
36 };
37 
38 // =============================================================================
39 
40 /// ObsLocalizationFactory Factory
41 template <typename OBS>
44  public:
45  static std::unique_ptr<ObsLocalizationBase<OBS>> create(const eckit::Configuration &,
46  const ObsSpace_ &);
47  protected:
48  explicit ObsLocalizationFactory(const std::string &);
49  private:
50  virtual ObsLocalizationBase<OBS> * make(const eckit::Configuration &,
51  const ObsSpace_ &) = 0;
52  static std::map < std::string, ObsLocalizationFactory<OBS> * > & getMakers() {
53  static std::map < std::string, ObsLocalizationFactory<OBS> * > makers_;
54  return makers_;
55  }
56 };
57 
58 // -----------------------------------------------------------------------------
59 
60 template<class OBS, class T>
63  virtual ObsLocalizationBase<OBS> * make(const eckit::Configuration & conf,
64  const ObsSpace_ & obsspace)
65  { return new T(conf, obsspace); }
66  public:
67  explicit ObsLocalizationMaker(const std::string & name) :
68  ObsLocalizationFactory<OBS>(name) {}
69 };
70 
71 // -----------------------------------------------------------------------------
72 
73 template <typename OBS>
75  if (getMakers().find(name) != getMakers().end()) {
76  throw std::runtime_error(name + " already registered in obs localization factory.");
77  }
78  getMakers()[name] = this;
79 }
80 
81 // -----------------------------------------------------------------------------
82 
83 template <typename OBS>
84 std::unique_ptr<ObsLocalizationBase<OBS>> ObsLocalizationFactory<OBS>::create(
85  const eckit::Configuration & conf, const ObsSpace_ & obsspace) {
86  Log::trace() << "ObsLocalizationBase<OBS>::create starting" << std::endl;
87  const std::string id = conf.getString("localization method");
88  typename std::map<std::string, ObsLocalizationFactory<OBS>*>::iterator
89  jloc = getMakers().find(id);
90  if (jloc == getMakers().end()) {
91  throw std::runtime_error(id + " does not exist in obs localization factory.");
92  }
93  std::unique_ptr<ObsLocalizationBase<OBS>> ptr(jloc->second->make(conf, obsspace));
94  Log::trace() << "ObsLocalizationBase<OBS>::create done" << std::endl;
95  return ptr;
96 }
97 
98 // -----------------------------------------------------------------------------
99 
100 } // namespace oops
101 
102 #endif // OOPS_BASE_OBSLOCALIZATIONBASE_H_
oops::ObsLocalizationBase
Base class for generic localizations.
Definition: ObsLocalizationBase.h:29
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::ObsSpace
Definition: oops/interface/ObsSpace.h:42
oops::ObsLocalizationBase::ObsLocalizationBase
ObsLocalizationBase()
Definition: ObsLocalizationBase.h:32
oops::ObsVector
Definition: oops/interface/ObsSpace.h:36
oops::ObsLocalizationFactory::ObsSpace_
ObsSpace< OBS > ObsSpace_
Definition: ObsLocalizationBase.h:43
oops::ObsLocalizationBase::~ObsLocalizationBase
virtual ~ObsLocalizationBase()
Definition: ObsLocalizationBase.h:33
oops::ObsLocalizationBase::ObsVector_
ObsVector< OBS > ObsVector_
Definition: ObsLocalizationBase.h:30
oops::ObsLocalizationMaker::ObsSpace_
ObsSpace< OBS > ObsSpace_
Definition: ObsLocalizationBase.h:62
oops::ObsLocalizationMaker::make
virtual ObsLocalizationBase< OBS > * make(const eckit::Configuration &conf, const ObsSpace_ &obsspace)
Definition: ObsLocalizationBase.h:63
ObsSpace.h
oops::ObsLocalizationFactory::ObsLocalizationFactory
ObsLocalizationFactory(const std::string &)
Definition: ObsLocalizationBase.h:74
oops::ObsLocalizationFactory::create
static std::unique_ptr< ObsLocalizationBase< OBS > > create(const eckit::Configuration &, const ObsSpace_ &)
Definition: ObsLocalizationBase.h:84
oops::ObsLocalizationBase::multiply
virtual void multiply(ObsVector_ &) const =0
oops::ObsLocalizationFactory
ObsLocalizationFactory Factory.
Definition: ObsLocalizationBase.h:42
ObsVector.h
oops::ObsLocalizationMaker
Definition: ObsLocalizationBase.h:61
oops::ObsLocalizationFactory::getMakers
static std::map< std::string, ObsLocalizationFactory< OBS > * > & getMakers()
Definition: ObsLocalizationBase.h:52
oops::ObsLocalizationMaker::ObsLocalizationMaker
ObsLocalizationMaker(const std::string &name)
Definition: ObsLocalizationBase.h:67
oops::ObsLocalizationFactory::make
virtual ObsLocalizationBase< OBS > * make(const eckit::Configuration &, const ObsSpace_ &)=0