12 #ifndef OOPS_BASE_LOCALIZATIONBASE_H_
13 #define OOPS_BASE_LOCALIZATIONBASE_H_
19 #include <boost/noncopyable.hpp>
24 #include "oops/util/Logger.h"
25 #include "oops/util/Printable.h"
35 template <
typename MODEL>
37 private boost::noncopyable {
53 virtual void print(std::ostream &)
const = 0;
58 template <
typename MODEL>
60 Log::trace() <<
"LocalizationBase<MODEL>::randomize starting" << std::endl;
61 const eckit::mpi::Comm & comm = dx.
timeComm();
62 static int tag = 23456;
63 size_t nslots = comm.size();
64 int mytime = comm.rank();
73 this->doRandomize(dx);
76 for (
size_t jj = 1; jj < nslots; ++jj) {
82 Log::trace() <<
"LocalizationBase<MODEL>::randomize done" << std::endl;
87 template <
typename MODEL>
89 Log::trace() <<
"LocalizationBase<MODEL>::multiply starting" << std::endl;
90 const eckit::mpi::Comm & comm = dx.
timeComm();
91 static int tag = 23456;
92 size_t nslots = comm.size();
93 int mytime = comm.rank();
103 for (
size_t jj = 1; jj < nslots; ++jj) {
106 dx.
axpy(1.0, dxtmp,
false);
110 this->doMultiply(dx);
113 for (
size_t jj = 1; jj < nslots; ++jj) {
119 Log::trace() <<
"LocalizationBase<MODEL>::multiply done" << std::endl;
125 template <
typename MODEL>
129 static std::unique_ptr<LocalizationBase<MODEL>>
create(
const Geometry_ &,
130 const util::DateTime &,
131 const eckit::Configuration &);
137 const util::DateTime &,
138 const eckit::Configuration &) = 0;
139 static std::map < std::string, LocalizationFactory<MODEL> * > &
getMakers() {
140 static std::map < std::string, LocalizationFactory<MODEL> * > makers_;
147 template<
class MODEL,
class T>
151 const util::DateTime &
time,
152 const eckit::Configuration & conf)
153 {
return new T(geometry,
time, conf); }
160 template <
typename MODEL>
162 if (getMakers().find(
name) != getMakers().end()) {
163 throw std::runtime_error(
name +
" already registered in localization factory.");
165 getMakers()[
name] =
this;
170 template <
typename MODEL>
171 std::unique_ptr<LocalizationBase<MODEL>>
173 const util::DateTime &
time,
174 const eckit::Configuration & conf) {
175 Log::trace() <<
"LocalizationBase<MODEL>::create starting" << std::endl;
176 const std::string
id = conf.getString(
"localization method");
177 typename std::map<std::string, LocalizationFactory<MODEL>*>::iterator
178 jloc = getMakers().find(
id);
179 if (jloc == getMakers().end()) {
180 Log::error() <<
id <<
" does not exist in localization factory." << std::endl;
181 Log::error() <<
"Obs Localization Factory has " << getMakers().size()
182 <<
" elements:" << std::endl;
184 jj = getMakers().begin(); jj != getMakers().end(); ++jj) {
185 Log::error() <<
"A " << jj->first <<
" Localization" << std::endl;
187 throw std::runtime_error(
id +
" does not exist in localization factory.");
189 std::unique_ptr<LocalizationBase<MODEL>> ptr(jloc->second->make(geometry,
time, conf));
190 Log::trace() <<
"LocalizationBase<MODEL>::create done" << std::endl;
Geometry class used in oops; subclass of interface class interface::Geometry.
Increment class used in oops.
const eckit::mpi::Comm & timeComm() const
Accessor to the time communicator.
Model-space localization base class.
Increment< MODEL > Increment_
virtual void randomize(Increment_ &) const
4D localization with the same localization for time blocks
virtual void multiply(Increment_ &) const
Multiply.
virtual void doRandomize(Increment_ &) const =0
virtual void doMultiply(Increment_ &) const =0
LocalizationBase()=default
virtual void print(std::ostream &) const =0
virtual ~LocalizationBase()=default
virtual ~LocalizationFactory()=default
LocalizationFactory(const std::string &)
virtual LocalizationBase< MODEL > * make(const Geometry_ &, const util::DateTime &, const eckit::Configuration &)=0
Geometry< MODEL > Geometry_
static std::unique_ptr< LocalizationBase< MODEL > > create(const Geometry_ &, const util::DateTime &, const eckit::Configuration &)
static std::map< std::string, LocalizationFactory< MODEL > * > & getMakers()
Geometry< MODEL > Geometry_
LocalizationMaker(const std::string &name)
virtual LocalizationBase< MODEL > * make(const Geometry_ &geometry, const util::DateTime &time, const eckit::Configuration &conf)
void axpy(const double &w, const Increment &dx, const bool check=true)
void updateTime(const util::Duration &dt)
Updates this Increment's valid time by dt (used in PseudoModel)
void zero()
Zero out this Increment.
const util::DateTime validTime() const
Accessor to the time of this Increment.
void send(const eckit::mpi::Comm &comm, const SERIALIZABLE &sendobj, const int dest, const int tag)
Extend eckit Comm for Serializable oops objects.
void receive(const eckit::mpi::Comm &comm, SERIALIZABLE &recvobj, const int source, const int tag)
The namespace for the main oops code.