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);
58 const eckit::Configuration &);
75 template<
typename MODEL>
77 const util::DateTime & tslot,
const int rank)
78 : vars_(vars), ensemblePerturbs_()
81 for (
int m = 0;
m < rank; ++
m) {
84 Log::trace() <<
"IncrementEnsemble:contructor done" << std::endl;
89 template<
typename MODEL>
93 : vars_(vars), ensemblePerturbs_()
99 std::unique_ptr<Increment_> inflationField;
100 if (conf.has(
"inflation field")) {
101 const eckit::LocalConfiguration inflationConfig(conf,
"inflation field");
102 inflationField.reset(
new Increment_(resol, vars, tslot));
103 inflationField->read(inflationConfig);
107 double inflationValue = conf.getDouble(
"inflation value", 1.0);
111 std::vector<eckit::LocalConfiguration> chvarconfs;
112 conf.get(
"variable changes", chvarconfs);
113 for (
const auto & conf : chvarconfs) {
123 for (
unsigned int ie = 0; ie < ensemble.
size(); ++ie) {
126 dx.
diff(ensemble[ie], bgmean);
129 if (conf.has(
"inflation field")) {
132 dx *= inflationValue;
136 for (
ircst_ it = chvars.rbegin(); it != chvars.rend(); ++it) {
137 dx = it->multiplyInverse(dx);
142 Log::trace() <<
"IncrementEnsemble:contructor done" << std::endl;
147 template<
typename MODEL>
149 const eckit::Configuration & config)
150 : vars_(vars), ensemblePerturbs_()
152 std::vector<eckit::LocalConfiguration> memberConfig;
153 config.get(
"members", memberConfig);
156 util::DateTime tslot = util::DateTime(config.getString(
"date"));
162 for (
size_t jj = 0; jj < memberConfig.size(); ++jj) {
164 dx.
read(memberConfig[jj]);
167 Log::trace() <<
"IncrementEnsemble:contructor (by reading increment ensemble) done" << std::endl;
172 template<
typename MODEL>
174 const eckit::Configuration & configBase,
175 const eckit::Configuration & configPert)
176 : vars_(vars), ensemblePerturbs_()
178 std::vector<eckit::LocalConfiguration> memberConfigBase;
179 configBase.get(
"members", memberConfigBase);
181 std::vector<eckit::LocalConfiguration> memberConfigPert;
182 configPert.get(
"members", memberConfigPert);
185 ASSERT(memberConfigBase.size() == memberConfigPert.size());
191 for (
size_t jj = 0; jj < memberConfigBase.size(); ++jj) {
192 State_ xBase(resol, memberConfigBase[jj]);
193 State_ xPert(resol, memberConfigPert[jj]);
195 dx.
diff(xBase, xPert);
198 Log::trace() <<
"IncrementEnsemble:contructor (by diffing state ensembles) done" << std::endl;
Geometry class used in oops; subclass of interface class interface::Geometry.
Increment< MODEL > Increment_
Increment_ & operator[](const int ii)
ChvarVec_::const_reverse_iterator ircst_
boost::ptr_vector< LinearVariableChangeBase_ > ChvarVec_
std::vector< Increment_ > ensemblePerturbs_
size_t size() const
Accessors.
StateEnsemble< MODEL > StateEnsemble_
IncrementEnsemble(const Geometry_ &resol, const Variables &vars, const util::DateTime &, const int rank)
Constructor.
const Increment_ & operator[](const int ii) const
LinearVariableChangeBase< MODEL > LinearVariableChangeBase_
Geometry< MODEL > Geometry_
const Variables & controlVariables() const
Control variables.
Increment class used in oops.
LinearVariableChange factory.
size_t size() const
Accessors.
State_ mean() const
calculate ensemble mean
State class used in oops; subclass of interface class interface::State.
void schur_product_with(const Increment &other)
Compute Schur product of this Increment with other, assign to this Increment.
void read(const eckit::Configuration &)
Read this Increment from file.
void diff(const State_ &state1, const State_ &state2)
Set this Increment to be difference between state1 and state2.
const util::DateTime validTime() const
Accessor to the time of this State.
The namespace for the main oops code.