11 #ifndef OOPS_BASE_INCREMENTENSEMBLE4D_H_
12 #define OOPS_BASE_INCREMENTENSEMBLE4D_H_
19 #include <boost/ptr_container/ptr_vector.hpp>
21 #include "eckit/config/LocalConfiguration.h"
29 #include "oops/util/DateTime.h"
30 #include "oops/util/Logger.h"
44 typedef typename boost::ptr_vector<LinearVariableChangeBase_>
ChvarVec_;
45 typedef typename ChvarVec_::const_reverse_iterator
ircst_;
51 const std::vector<util::DateTime> &,
61 unsigned int size()
const {
85 template<
typename MODEL>
87 const std::vector<util::DateTime> & timeslots,
89 : vars_(vars), ensemblePerturbs_()
92 for (
int m = 0; m < rank; ++m) {
95 Log::trace() <<
"IncrementEnsemble4D:contructor done" << std::endl;
100 template<
typename MODEL>
103 : vars_(vars), ensemblePerturbs_()
106 for (
size_t ii = 0; ii < ensemble.
size(); ++ii) {
108 ensemble[ii].validTimes());
111 Log::trace() <<
"IncrementEnsemble4D:contructor(StateEnsemble4D) done" << std::endl;
116 template<
typename MODEL>
120 : vars_(vars), ensemblePerturbs_()
123 std::vector<eckit::LocalConfiguration> memberConfig;
124 conf.get(
"members", memberConfig);
128 std::vector<util::DateTime> timeslots(xb.
size());
129 for (
unsigned jsub = 0; jsub < xb.
size(); ++jsub) {
130 ASSERT(xb[jsub].validTime() == fg[jsub].validTime());
131 timeslots[jsub] = xb[jsub].validTime();
135 std::unique_ptr<Increment4D_> inflationField;
136 if (conf.has(
"inflation field")) {
137 const eckit::LocalConfiguration inflationConfig(conf,
"inflation field");
138 inflationField.reset(
new Increment4D_(resol, vars, timeslots));
139 inflationField->read(inflationConfig);
143 double inflationValue = 1;
144 if (conf.has(
"inflation value")) {
145 conf.get(
"inflation value", inflationValue);
150 if (conf.has(
"variable changes")) {
151 std::vector<eckit::LocalConfiguration> chvarconfs;
152 conf.get(
"variable changes", chvarconfs);
153 for (
const auto & conf : chvarconfs) {
164 for (
unsigned int ie = 0; ie < ensemble.
size(); ++ie) {
167 dx.
diff(ensemble[ie], bgmean);
170 if (conf.has(
"inflation field")) {
173 dx *= inflationValue;
176 for (
unsigned jsub = 0; jsub < timeslots.size(); ++jsub) {
178 for (
ircst_ it = chvars.rbegin(); it != chvars.rend(); ++it) {
179 dx[jsub] = it->multiplyInverse(dx[jsub]);
185 Log::trace() <<
"IncrementEnsemble4D:contructor done" << std::endl;
190 template<
typename MODEL>
192 ensemblePerturbs_.erase(ensemblePerturbs_.begin());
197 template<
typename MODEL>
199 ensemblePerturbs_.emplace_back(dx);
206 #endif // OOPS_BASE_INCREMENTENSEMBLE4D_H_