Go to the documentation of this file.
12 #ifndef OOPS_BASE_LOCALIZATIONBASE_H_
13 #define OOPS_BASE_LOCALIZATIONBASE_H_
19 #include <boost/noncopyable.hpp>
24 #include "oops/util/abor1_cpp.h"
25 #include "oops/util/Logger.h"
26 #include "oops/util/Printable.h"
36 template <
typename MODEL>
38 private boost::noncopyable {
52 virtual void print(std::ostream &)
const = 0;
57 template <
typename MODEL>
59 Log::trace() <<
"LocalizationBase<MODEL>::multiply starting" << std::endl;
60 const eckit::mpi::Comm & comm = dx.
timeComm();
61 static int tag = 23456;
62 size_t nslots = comm.size();
63 int mytime = comm.rank();
73 for (
size_t jj = 1; jj < nslots; ++jj) {
76 dx.
axpy(1.0, dxtmp,
false);
81 for (
size_t jj = 1; jj < nslots; ++jj) {
87 Log::trace() <<
"LocalizationBase<MODEL>::multiply done" << std::endl;
94 template <
typename MODEL>
98 static std::unique_ptr<LocalizationBase<MODEL>>
create(
const Geometry_ &,
99 const util::DateTime &,
100 const eckit::Configuration &);
106 const util::DateTime &,
107 const eckit::Configuration &) = 0;
108 static std::map < std::string, LocalizationFactory<MODEL> * > &
getMakers() {
109 static std::map < std::string, LocalizationFactory<MODEL> * > makers_;
116 template<
class MODEL,
class T>
120 const util::DateTime & time,
121 const eckit::Configuration & conf)
122 {
return new T(geometry, time, conf); }
129 template <
typename MODEL>
131 if (getMakers().find(name) != getMakers().end()) {
132 throw std::runtime_error(name +
" already registered in localization factory.");
134 getMakers()[name] =
this;
139 template <
typename MODEL>
140 std::unique_ptr<LocalizationBase<MODEL>>
142 const util::DateTime & time,
143 const eckit::Configuration & conf) {
144 Log::trace() <<
"LocalizationBase<MODEL>::create starting" << std::endl;
145 const std::string
id = conf.getString(
"localization method");
146 typename std::map<std::string, LocalizationFactory<MODEL>*>::iterator
147 jloc = getMakers().find(
id);
148 if (jloc == getMakers().end()) {
149 Log::error() <<
id <<
" does not exist in localization factory." << std::endl;
150 Log::error() <<
"Obs Localization Factory has " << getMakers().size()
151 <<
" elements:" << std::endl;
153 jj = getMakers().begin(); jj != getMakers().end(); ++jj) {
154 Log::error() <<
"A " << jj->first <<
" Localization" << std::endl;
156 throw std::runtime_error(
id +
" does not exist in localization factory.");
158 std::unique_ptr<LocalizationBase<MODEL>> ptr(jloc->second->make(geometry, time, conf));
159 Log::trace() <<
"LocalizationBase<MODEL>::create done" << std::endl;
167 #endif // OOPS_BASE_LOCALIZATIONBASE_H_
Geometry< MODEL > Geometry_
The namespace for the main oops code.
Model-space localization base class.
const eckit::mpi::Comm & timeComm() const
void zero()
Linear algebra operators.
Increment< MODEL > Increment_
virtual LocalizationBase< MODEL > * make(const Geometry_ &geometry, const util::DateTime &time, const eckit::Configuration &conf)
static std::map< std::string, LocalizationFactory< MODEL > * > & getMakers()
virtual LocalizationBase< MODEL > * make(const Geometry_ &, const util::DateTime &, const eckit::Configuration &)=0
static std::unique_ptr< LocalizationBase< MODEL > > create(const Geometry_ &, const util::DateTime &, const eckit::Configuration &)
void axpy(const double &, const Increment &, const bool check=true)
const util::DateTime validTime() const
Time.
virtual void print(std::ostream &) const =0
void send(const eckit::mpi::Comm &comm, const SERIALIZABLE &sendobj, const int dest, const int tag)
Extend eckit Comm for Serializable oops objects.
virtual void multiply(Increment_ &) const =0
virtual ~LocalizationBase()=default
virtual void localize(Increment_ &) const
default implementation of 4D localization (used in model-specific implementations)
LocalizationFactory(const std::string &)
Geometry< MODEL > Geometry_
LocalizationMaker(const std::string &name)
Geometry class used in oops; subclass of interface class above.
LocalizationBase()=default
void updateTime(const util::Duration &dt)
virtual ~LocalizationFactory()=default
Increment Class: Difference between two states.
void receive(const eckit::mpi::Comm &comm, SERIALIZABLE &recvobj, const int source, const int tag)