11 #ifndef OOPS_BASE_INCREMENTENSEMBLE_H_
12 #define OOPS_BASE_INCREMENTENSEMBLE_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_;
50 const util::DateTime &,
const int rank);
76 template<
typename MODEL>
78 const util::DateTime & tslot,
const int rank)
79 : vars_(vars), ensemblePerturbs_()
82 for (
int m = 0; m < rank; ++m) {
85 Log::trace() <<
"IncrementEnsemble:contructor done" << std::endl;
90 template<
typename MODEL>
93 : vars_(vars), ensemblePerturbs_()
96 for (
size_t ii = 0; ii < ensemble.
size(); ++ii) {
97 ensemblePerturbs_.emplace_back(ensemble[ii].geometry(), vars, ensemble[ii].validTime());
100 Log::trace() <<
"IncrementEnsemble:contructor(StateEnsemble) done" << std::endl;
105 template<
typename MODEL>
109 : vars_(vars), ensemblePerturbs_()
112 std::vector<eckit::LocalConfiguration> memberConfig;
113 conf.get(
"members", memberConfig);
119 std::unique_ptr<Increment_> inflationField;
120 if (conf.has(
"inflation field")) {
121 const eckit::LocalConfiguration inflationConfig(conf,
"inflation field");
122 inflationField.reset(
new Increment_(resol, vars, tslot));
123 inflationField->read(inflationConfig);
127 double inflationValue = conf.getDouble(
"inflation value", 1.0);
131 std::vector<eckit::LocalConfiguration> chvarconfs;
132 conf.get(
"variable changes", chvarconfs);
133 for (
const auto & conf : chvarconfs) {
143 for (
unsigned int ie = 0; ie < ensemble.
size(); ++ie) {
146 dx.
diff(ensemble[ie], bgmean);
149 if (conf.has(
"inflation field")) {
152 dx *= inflationValue;
156 for (
ircst_ it = chvars.rbegin(); it != chvars.rend(); ++it) {
157 dx = it->multiplyInverse(dx);
162 Log::trace() <<
"IncrementEnsemble:contructor done" << std::endl;
167 template<
typename MODEL>
169 ensemblePerturbs_.erase(ensemblePerturbs_.begin());
174 template<
typename MODEL>
176 ensemblePerturbs_.emplace_back(dx);
183 #endif // OOPS_BASE_INCREMENTENSEMBLE_H_