13 #include "eckit/config/LocalConfiguration.h"
14 #include "eckit/mpi/Comm.h"
16 #include "oops/base/Variables.h"
17 #include "oops/util/abor1_cpp.h"
18 #include "oops/util/Logger.h"
19 #include "oops/util/missingValues.h"
20 #include "oops/util/Random.h"
25 const std::string & name,
const bool fail)
26 : obsdb_(obsdb), obsvars_(obsdb.obsvariables()),
27 nvars_(obsvars_.variables().size()), nlocs_(obsdb_.nlocs()),
28 values_(nlocs_ * nvars_),
29 missing_(util::missingValue(missing_)) {
30 oops::Log::trace() <<
"ObsVector::ObsVector " << name << std::endl;
31 if (!name.empty()) this->
read(name, fail);
35 : obsdb_(other.obsdb_), obsvars_(other.obsvars_), nvars_(other.nvars_),
36 nlocs_(other.nlocs_), values_(nlocs_ * nvars_), missing_(other.missing_) {
38 oops::Log::trace() <<
"ObsVector copied " << std::endl;
42 : obsdb_(obsdb), obsvars_(other.obsvars_), nvars_(other.nvars_),
43 nlocs_(obsdb.localobs().size()), values_(nlocs_ * nvars_), missing_(other.missing_) {
44 for (
size_t ii = 0; ii <
nlocs_; ++ii) {
45 for (
size_t vv = 0; vv <
nvars_; ++vv) {
49 oops::Log::trace() <<
"Local ObsVector copied " << std::endl;
61 for (
size_t jj = 0; jj <
values_.size() ; ++jj) {
70 const size_t nn =
values_.size();
71 ASSERT(rhs.
values_.size() == nn);
72 for (
size_t jj = 0; jj < nn ; ++jj) {
83 const size_t nn =
values_.size();
84 ASSERT(rhs.
values_.size() == nn);
85 for (
size_t jj = 0; jj < nn ; ++jj) {
96 const size_t nn =
values_.size();
97 ASSERT(rhs.
values_.size() == nn);
98 for (
size_t jj = 0; jj < nn ; ++jj) {
109 const size_t nn =
values_.size();
110 ASSERT(rhs.
values_.size() == nn);
111 for (
size_t jj = 0; jj < nn ; ++jj) {
122 for (
size_t jj = 0; jj <
values_.size() ; ++jj) {
128 const size_t nn =
values_.size();
129 ASSERT(rhs.
values_.size() == nn);
130 for (
size_t jj = 0; jj < nn ; ++jj) {
140 for (
size_t jj = 0; jj <
values_.size() ; ++jj) {
148 util::NormalDistribution<double> x(
values_.size(), 0.0, 1.0, this->getSeed());
149 for (
size_t jj = 0; jj <
values_.size() ; ++jj) {
155 const size_t nn =
values_.size();
156 ASSERT(other.
values_.size() == nn);
158 for (
size_t jj = 0; jj < nn ; ++jj) {
164 obsdb_.
comm().allReduceInPlace(zz, eckit::mpi::sum());
172 for (
size_t jj = 0; jj <
values_.size() ; ++jj) {
179 obsdb_.
comm().allReduceInPlace(zrms, eckit::mpi::sum());
182 if (
nobs > 0) zrms = sqrt(zrms /
static_cast<double>(
nobs));
187 oops::Log::trace() <<
"ObsVector::read, name = " << name << std::endl;
198 std::vector<double> tmp(
nlocs);
199 for (std::size_t jv = 0; jv <
nvars_; ++jv) {
203 for (std::size_t jj = 0; jj <
nlocs; ++jj) {
204 std::size_t ivec = jv + (jj *
nvars_);
212 oops::Log::trace() <<
"ObsVector::save, name = " << name << std::endl;
218 for (std::size_t jv = 0; jv <
nvars_; ++jv) {
219 std::vector<double> tmp(
nlocs);
220 for (std::size_t jj = 0; jj < tmp.size(); ++jj) {
221 ivec = jv + (jj *
nvars_);
230 Eigen::VectorXd vec(
nobs());
232 for (
const double & val :
values_) {
241 oops::Log::trace() <<
"ObsVector::mask" << std::endl;
244 for (
size_t jv = 0; jv < flags.
nvars(); ++jv) {
245 for (
size_t jj = 0; jj < flags.
nlocs(); ++jj) {
254 for (
size_t jj = 0; jj <
values_.size() ; ++jj) {
272 double zmin = std::numeric_limits<double>::max();
273 double zmax = std::numeric_limits<double>::lowest();
276 for (
size_t jj = 0; jj <
values_.size() ; ++jj) {
285 obsdb_.
comm().allReduceInPlace(zmin, eckit::mpi::min());
286 obsdb_.
comm().allReduceInPlace(zmax, eckit::mpi::max());
287 obsdb_.
comm().allReduceInPlace(zrms, eckit::mpi::sum());
291 zrms = sqrt(zrms /
static_cast<double>(
nobs));
293 << zmin <<
", Max=" << zmax <<
", RMS=" << zrms << std::endl;