11 #ifndef TEST_IODA_OBSVECTOR_H_
12 #define TEST_IODA_OBSVECTOR_H_
18 #include <boost/shared_ptr.hpp>
20 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
22 #include "eckit/config/LocalConfiguration.h"
23 #include "eckit/testing/Test.h"
25 #include "oops/mpi/mpi.h"
26 #include "oops/runs/Test.h"
27 #include "oops/test/TestEnvironment.h"
28 #include "oops/util/dot_product.h"
29 #include "oops/util/Logger.h"
31 #include "ioda/IodaTrait.h"
49 return theObsVecTestFixture;
53 util::DateTime bgn((::test::TestEnvironment::config().getString(
"window begin")));
54 util::DateTime end((::test::TestEnvironment::config().getString(
"window end")));
56 std::vector<eckit::LocalConfiguration> conf;
57 ::test::TestEnvironment::config().get(
"observations", conf);
59 for (std::size_t jj = 0; jj < conf.size(); ++jj) {
60 eckit::LocalConfiguration obsconf(conf[jj],
"obs space");
61 boost::shared_ptr<ObsSpace_> tmp(
new ObsSpace_(obsconf, oops::mpi::world(),
62 bgn, end, oops::mpi::myself()));
64 eckit::LocalConfiguration ObsDataInConf;
65 obsconf.get(
"obsdatain", ObsDataInConf);
71 std::vector<boost::shared_ptr<ObsSpace_> >
ospaces_;
80 for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
81 std::unique_ptr<ObsVector_> ov(
new ObsVector_(*Test_::obspace()[jj]));
95 for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
96 std::unique_ptr<ObsVector_> ov(
new ObsVector_(*Test_::obspace()[jj]));
98 std::unique_ptr<ObsVector_> other(
new ObsVector_(*ov));
102 EXPECT(!other.get());
113 const double zero = 0.0;
115 for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
116 ObsVector_ ov(*Test_::obspace()[jj]);
120 const double ovov2 = dot_product(ov, ov);
121 EXPECT(ovov2 > zero);
125 const double zz = dot_product(ov, ov);
136 std::vector<eckit::LocalConfiguration> conf;
137 ::test::TestEnvironment::config().get(
"observations", conf);
139 for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
143 double ExpectedRms = conf[jj].getDouble(
"obs space.obsdatain.rms ref");
144 double Tol = conf[jj].getDouble(
"obs space.obsdatain.tolerance");
147 std::unique_ptr<ObsVector_> ov(
new ObsVector_(*Odb,
"ObsValue"));
148 double Rms = ov->rms();
150 EXPECT(oops::is_close(Rms, ExpectedRms, Tol));
164 for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
165 Odb = Test_::obspace()[jj].get();
170 std::unique_ptr<ObsVector_> ov_orig(
new ObsVector_(*Odb,
"ObsValue"));
171 ExpectedRms = ov_orig->rms();
172 ov_orig->save(
"ObsTest");
174 std::unique_ptr<ObsVector_> ov_test(
new ObsVector_(*Odb,
"ObsTest"));
175 Rms = ov_test->rms();
177 EXPECT(oops::is_close(Rms, ExpectedRms, 1.0e-12));
186 typedef std::vector< std::shared_ptr< ObsVector_> > ObsVectors_;
193 std::vector<std::string> dist_names =
194 ::test::TestEnvironment::config().getStringVector(
"distributions");
195 for (std::size_t ii = 0; ii < dist_names.size(); ++ii) {
196 oops::Log::debug() <<
"using distribution: " << dist_names[ii] << std::endl;
200 util::DateTime bgn((::test::TestEnvironment::config().getString(
"window begin")));
201 util::DateTime end((::test::TestEnvironment::config().getString(
"window end")));
202 std::vector<eckit::LocalConfiguration> conf;
203 ::test::TestEnvironment::config().get(
"observations", conf);
206 std::vector< ObsVectors_ > dist_obsvecs;
207 std::vector< std::shared_ptr<ObsSpace_> > dist_obsdbs;
208 for (std::size_t dd = 0; dd < dist_names.size(); ++dd) {
210 for (std::size_t jj = 0; jj < conf.size(); ++jj) {
211 eckit::LocalConfiguration obsconf(conf[jj],
"obs space");
212 obsconf.set(
"distribution", dist_names[dd]);
213 std::shared_ptr<ObsSpace_> obsdb(
new ObsSpace(obsconf, oops::mpi::world(),
214 bgn, end, oops::mpi::myself()));
215 std::shared_ptr<ObsVector_> obsvec(
new ObsVector_(*obsdb,
"ObsValue"));
216 oops::Log::debug() << dist_names[dd] <<
": " << *obsvec << std::endl;
217 dist_obsdbs.push_back(obsdb);
218 obsvecs.push_back(obsvec);
220 dist_obsvecs.push_back(obsvecs);
225 for (std::size_t ii = 0; ii < conf.size(); ++ii) {
227 int nobs = dist_obsvecs[0][ii]->nobs();
228 double rms = dist_obsvecs[0][ii]->rms();
229 double dot = dist_obsvecs[0][ii]->dot_product_with(*dist_obsvecs[0][ii]);
232 for (std::size_t jj = 1; jj < dist_obsvecs.size(); ++jj) {
233 int nobs2 = dist_obsvecs[jj][ii]->nobs();
234 double rms2 = dist_obsvecs[jj][ii]->rms();
235 double dot2 = dist_obsvecs[jj][ii]->dot_product_with(*dist_obsvecs[jj][ii]);
237 EXPECT(nobs == nobs2);
238 EXPECT(oops::is_close(rms, rms2, 1.0e-12));
239 EXPECT(oops::is_close(dot, dot2, 1.0e-12));
252 std::string
testid()
const override {
return "test::ObsVector<ioda::IodaTrait>";}
255 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
257 ts.emplace_back(CASE(
"ioda/ObsVector/testConstructor")
259 ts.emplace_back(CASE(
"ioda/ObsVector/testCopyConstructor")
261 ts.emplace_back(CASE(
"ioda/ObsVector/testNotZero")
263 ts.emplace_back(CASE(
"ioda/ObsVector/testRead")
265 ts.emplace_back(CASE(
"ioda/ObsVector/testSave")
267 ts.emplace_back(CASE(
"ioda/ObsVector/testDistributedMath")
279 #endif // TEST_IODA_OBSVECTOR_H_