8 #ifndef TEST_INTERFACE_GEOVALS_H_
9 #define TEST_INTERFACE_GEOVALS_H_
16 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
18 #include <boost/noncopyable.hpp>
20 #include "eckit/config/LocalConfiguration.h"
21 #include "eckit/testing/Test.h"
27 #include "oops/util/dot_product.h"
28 #include "oops/util/Logger.h"
35 template <
typename OBS>
41 static eckit::LocalConfiguration
conf(
const size_t ii) {
return getInstance().confs_[ii];}
47 return theGeoVaLsFixture;
61 std::vector<eckit::LocalConfiguration>
confs_;
70 for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
71 eckit::LocalConfiguration gconf(Test_::conf(jj),
"geovals");
73 std::unique_ptr<GeoVaLs_> ov(
new GeoVaLs_(gconf, Test_::obspace()[jj], geovars));
87 const double tol = 1e-6;
89 for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
90 eckit::LocalConfiguration gconf(Test_::conf(jj),
"geovals");
92 GeoVaLs_ gval(gconf, Test_::obspace()[jj], geovars);
94 const double zz = dot_product(gval, gval);
96 oops::Log::trace() <<
"Testing copy constructor (=) " << std::endl;
98 GeoVaLs_ gval2 = gval;
100 double zz0 = dot_product(gval2, gval2);
104 oops::Log::trace() <<
"Testing *= double" << std::endl;
108 const double zz1 = dot_product(gval2, gval2);
110 EXPECT(zz1/zz - 4.0 < tol);
112 oops::Log::trace() <<
"Testing += GeoVals" << std::endl;
116 const double zz2 = dot_product(gval2, gval2);
118 EXPECT(zz2/zz - 9.0 < tol);
120 oops::Log::trace() <<
"Testing -= GeoVals" << std::endl;
124 const double zz3 = dot_product(gval2, gval2);
126 EXPECT(zz3/zz - 4.0 < tol);
128 oops::Log::trace() <<
"Testing *= GeoVals" << std::endl;
134 GeoVaLs_ gval3 = gval2;
138 const double zz4 = dot_product(gval2, gval2);
140 const double zz5 = dot_product(gval3, gval);
142 EXPECT(zz4/zz5 - 1.0 < tol);
144 oops::Log::trace() <<
"Testing random" << std::endl;
147 const double zz6 = dot_product(gval, gval);
150 oops::Log::trace() <<
"Testing zero" << std::endl;
153 const double zz7 = dot_product(gval, gval);
164 const double tol = 1.0e-9;
165 for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
166 eckit::LocalConfiguration gconf(Test_::conf(jj),
"geovals");
168 GeoVaLs_ gval(gconf, Test_::obspace()[jj], geovars);
170 const double xx = gconf.getDouble(
"norm");
171 const double zz = sqrt(dot_product(gval, gval));
173 oops::Log::debug() <<
"xx: " << std::fixed << std::setprecision(8) << xx << std::endl;
174 oops::Log::debug() <<
"zz: " << std::fixed << std::setprecision(8) << zz << std::endl;
176 EXPECT(oops::is_close(xx, zz, tol));
182 template <
typename OBS>
189 std::string
testid()
const override {
return "test::GeoVaLs<" + OBS::name() +
">";}
192 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
194 ts.emplace_back(
CASE(
"interface/GeoVaLs/testConstructor")
195 { testConstructor<OBS>(); });
196 ts.emplace_back(
CASE(
"interface/GeoVaLs/testUtils")
197 { testUtils<OBS>(); });
198 ts.emplace_back(
CASE(
"interface/GeoVaLs/testRead")
199 { testRead<OBS>(); });
211 #endif // TEST_INTERFACE_GEOVALS_H_