11 #ifndef TEST_INTERFACE_ERRORCOVARIANCE_H_
12 #define TEST_INTERFACE_ERRORCOVARIANCE_H_
20 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
22 #include <boost/noncopyable.hpp>
24 #include "eckit/config/Configuration.h"
25 #include "eckit/testing/Test.h"
34 #include "oops/util/DateTime.h"
35 #include "oops/util/dot_product.h"
36 #include "oops/util/Expect.h"
37 #include "oops/util/Logger.h"
58 return theErrorCovarianceFixture;
62 oops::instantiateCovarFactory<MODEL>();
74 time_.reset(
new util::DateTime(xx.validTime()));
81 ~ErrorCovarianceFixture<MODEL>() {}
83 std::unique_ptr<const eckit::LocalConfiguration>
test_;
84 std::unique_ptr<const Geometry_>
resol_;
85 std::unique_ptr<const oops::Variables>
ctlvars_;
86 std::unique_ptr<const util::DateTime>
time_;
87 std::unique_ptr<Covariance_>
B_;
96 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
97 Increment_ dx2(Test_::resol(), Test_::ctlvars(), Test_::time());
99 Test_::covariance().randomize(dx2);
100 oops::Log::info() <<
"dx2.norm()=" << dx2.norm() << std::endl;
102 EXPECT(dx1.norm() == 0.0);
103 EXPECT(dx2.norm() > 0.0);
105 Test_::covariance().multiply(dx1, dx2);
106 EXPECT(dx2.norm() == 0.0);
108 const bool testinverse = Test_::test().getBool(
"testinverse",
true);
111 oops::Log::info() <<
"Doing zero test for inverse" << std::endl;
113 Test_::covariance().randomize(dx2);
114 EXPECT(dx1.norm() == 0.0);
115 EXPECT(dx2.norm() > 0.0);
116 Test_::covariance().inverseMultiply(dx1, dx2);
117 EXPECT(dx2.norm() == 0.0);
119 oops::Log::info() <<
"Not doing zero test for inverse" << std::endl;
129 const bool testinverse = Test_::test().getBool(
"testinverse",
true);
132 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
133 Increment_ dx2(Test_::resol(), Test_::ctlvars(), Test_::time());
134 Increment_ dx3(Test_::resol(), Test_::ctlvars(), Test_::time());
135 Test_::covariance().randomize(dx1);
136 EXPECT(dx1.norm() > 0.0);
138 Test_::covariance().multiply(dx1, dx2);
139 Test_::covariance().inverseMultiply(dx2, dx3);
141 EXPECT(dx2.norm() > 0.0);
142 EXPECT(dx3.norm() > 0.0);
144 const double tol = Test_::test().getDouble(
"tolerance");
145 EXPECT(dx3.norm()/dx1.norm() < tol);
157 Increment_ dx(Test_::resol(), Test_::ctlvars(), Test_::time());
158 Increment_ Bdx(Test_::resol(), Test_::ctlvars(), Test_::time());
159 Increment_ dy(Test_::resol(), Test_::ctlvars(), Test_::time());
160 Increment_ Bdy(Test_::resol(), Test_::ctlvars(), Test_::time());
165 Test_::covariance().multiply(dx, Bdx);
166 Test_::covariance().multiply(dy, Bdy);
167 const double zz1 = dot_product(dx, Bdy);
168 const double zz2 = dot_product(Bdx, dy);
169 oops::Log::info() <<
"<dx,Bdy>-<Bdx,dy>/<dx,Bdy>="
170 << (zz1-zz2)/zz1 << std::endl;
171 oops::Log::info() <<
"<dx,Bdy>-<Bdx,dy>/<Bdx,dy>="
172 << (zz1-zz2)/zz2 << std::endl;
173 const double tol = Test_::test().getDouble(
"tolerance");
174 EXPECT(oops::is_close(zz1, zz2, tol));
182 EXPECT_NO_THROW(parameters.validateAndDeserialize(config));
188 eckit::LocalConfiguration config;
189 config.set(
"covariance model",
"###INVALID###");
191 if (oops::Parameters::isValidationSupported())
192 EXPECT_THROWS_MSG(parameters.validate(config),
"unrecognized enum value");
193 EXPECT_THROWS_MSG(parameters.deserialize(config),
194 "does not exist in CovarianceFactory");
201 const std::string validName = config.getString(
"covariance model");
202 const std::vector<std::string> registeredNames =
204 const bool found = std::find(registeredNames.begin(), registeredNames.end(), validName) !=
205 registeredNames.end();
211 template <
typename MODEL>
218 std::string
testid()
const override {
return "test::ErrorCovariance<" + MODEL::name() +
">";}
221 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
223 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testErrorCovarianceZero")
224 { testErrorCovarianceZero<MODEL>(); });
225 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testErrorCovarianceInverse")
226 { testErrorCovarianceInverse<MODEL>(); });
227 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testErrorCovarianceSym")
228 { testErrorCovarianceSym<MODEL>(); });
229 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testCovarianceParametersWrapperValidName")
230 { testCovarianceParametersWrapperValidName<MODEL>(); });
231 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testCovarianceParametersWrapperInvalidName")
232 { testCovarianceParametersWrapperInvalidName<MODEL>(); });
233 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testCovarianceFactoryGetMakerNames")
234 { testCovarianceFactoryGetMakerNames<MODEL>(); });
244 #endif // TEST_INTERFACE_ERRORCOVARIANCE_H_