11 #ifndef OOPS_RUNS_DIRAC_H_
12 #define OOPS_RUNS_DIRAC_H_
19 #include "eckit/config/Configuration.h"
30 #include "oops/util/DateTime.h"
31 #include "oops/util/Duration.h"
32 #include "oops/util/Logger.h"
47 instantiateCovarFactory<MODEL>();
52 int execute(
const eckit::Configuration & fullConfig)
const {
53 const eckit::LocalConfiguration backgroundConfig(fullConfig,
"initial condition");
54 std::vector<eckit::LocalConfiguration> confs;
55 backgroundConfig.get(
"states", confs);
56 size_t nslots = confs.size();
58 const eckit::mpi::Comm * commSpace = &this->
getComm();
61 size_t ntasks = this->
getComm().size();
62 ASSERT(ntasks % nslots == 0);
63 size_t myrank = this->
getComm().rank();
64 size_t ntaskpslot = ntasks / nslots;
65 size_t myslot = myrank / ntaskpslot;
68 std::string sgeom =
"comm_geom_" + std::to_string(myslot);
69 char const *geomName = sgeom.c_str();
70 commSpace = &this->
getComm().split(myslot, geomName);
71 ASSERT(commSpace->size() == ntaskpslot);
74 size_t myarea = commSpace->rank();
75 std::string stime =
"comm_time_" + std::to_string(myarea);
76 char const *timeName = stime.c_str();
77 commTime = &this->
getComm().split(myarea, timeName);
78 ASSERT(commTime->size() == nslots);
82 const eckit::LocalConfiguration resolConfig(fullConfig,
"geometry");
83 const Geometry_ resol(resolConfig, *commSpace, *commTime);
86 State_ xx(resol, backgroundConfig);
95 const eckit::LocalConfiguration covarConfig(fullConfig,
"background error");
99 covarConfig, resol, vars, xx, xx));
104 const eckit::LocalConfiguration diracConfig(fullConfig,
"dirac");
105 dxdirin.
dirac(diracConfig);
106 Log::test() <<
"Input Dirac increment: " << dxdirin << std::endl;
109 B->multiply(dxdirin, dxdirout);
112 const eckit::LocalConfiguration output_B(fullConfig,
"output B");
113 dxdirout.
write(output_B);
114 Log::test() <<
"B * Increment: " << dxdirout << std::endl;
117 eckit::LocalConfiguration locConfig;
118 eckit::LocalConfiguration ensConfig;
120 if (covarConfig.has(
"localization")) {
121 locConfig = eckit::LocalConfiguration(covarConfig,
"localization");
122 ensConfig = covarConfig;
125 if (covarConfig.has(
"ensemble")) {
126 ensConfig = eckit::LocalConfiguration(covarConfig,
"ensemble");
127 if (ensConfig.has(
"localization")) {
128 locConfig = eckit::LocalConfiguration(ensConfig,
"localization");
139 const eckit::LocalConfiguration diracConfig(fullConfig,
"dirac");
140 dxdir.
dirac(diracConfig);
143 std::unique_ptr<Localization_> loc_ =
147 loc_->localize(dxdir);
150 const eckit::LocalConfiguration output_localization(fullConfig,
"output localization");
151 dxdir.
write(output_localization);
152 Log::test() <<
"Localized Increment: " << dxdir << std::endl;
160 return "oops::Dirac<" + MODEL::name() +
">";
166 #endif // OOPS_RUNS_DIRAC_H_