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"
65 return theErrorCovarianceFixture;
69 oops::instantiateCovarFactory<MODEL>();
81 time_.reset(
new util::DateTime(xx.validTime()));
88 ~ErrorCovarianceFixture<MODEL>() {}
90 std::unique_ptr<const eckit::LocalConfiguration>
test_;
91 std::unique_ptr<const Geometry_>
resol_;
92 std::unique_ptr<const oops::Variables>
ctlvars_;
93 std::unique_ptr<const util::DateTime>
time_;
94 std::unique_ptr<Covariance_>
B_;
103 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
104 Increment_ dx2(Test_::resol(), Test_::ctlvars(), Test_::time());
106 Test_::covariance().randomize(dx2);
107 oops::Log::test() <<
"dx2.norm()=" << dx2.norm() << std::endl;
109 EXPECT(dx1.norm() == 0.0);
110 EXPECT(dx2.norm() > 0.0);
112 Test_::covariance().multiply(dx1, dx2);
113 EXPECT(dx2.norm() == 0.0);
115 const bool testinverse = Test_::test().getBool(
"testinverse",
true);
118 oops::Log::test() <<
"Doing zero test for inverse" << std::endl;
120 Test_::covariance().randomize(dx2);
121 EXPECT(dx1.norm() == 0.0);
122 EXPECT(dx2.norm() > 0.0);
123 Test_::covariance().inverseMultiply(dx1, dx2);
124 EXPECT(dx2.norm() == 0.0);
126 oops::Log::test() <<
"Not doing zero test for inverse" << std::endl;
136 const bool testinverse = Test_::test().getBool(
"testinverse",
true);
139 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
140 Increment_ dx2(Test_::resol(), Test_::ctlvars(), Test_::time());
141 Increment_ dx3(Test_::resol(), Test_::ctlvars(), Test_::time());
142 Test_::covariance().randomize(dx1);
143 EXPECT(dx1.norm() > 0.0);
145 Test_::covariance().multiply(dx1, dx2);
146 Test_::covariance().inverseMultiply(dx2, dx3);
148 EXPECT(dx2.norm() > 0.0);
149 EXPECT(dx3.norm() > 0.0);
151 const double tol = Test_::test().getDouble(
"tolerance");
152 EXPECT(dx3.norm()/dx1.norm() < tol);
164 Increment_ dx(Test_::resol(), Test_::ctlvars(), Test_::time());
165 Increment_ Bdx(Test_::resol(), Test_::ctlvars(), Test_::time());
166 Increment_ dy(Test_::resol(), Test_::ctlvars(), Test_::time());
167 Increment_ Bdy(Test_::resol(), Test_::ctlvars(), Test_::time());
172 Test_::covariance().multiply(dx, Bdx);
173 Test_::covariance().multiply(dy, Bdy);
174 const double zz1 = dot_product(dx, Bdy);
175 const double zz2 = dot_product(Bdx, dy);
176 oops::Log::test() <<
"<dx,Bdy>-<Bdx,dy>/<dx,Bdy>="
177 << (zz1-zz2)/zz1 << std::endl;
178 oops::Log::test() <<
"<dx,Bdy>-<Bdx,dy>/<Bdx,dy>="
179 << (zz1-zz2)/zz2 << std::endl;
180 const double tol = Test_::test().getDouble(
"tolerance");
181 EXPECT(oops::is_close(zz1, zz2, tol));
189 EXPECT_NO_THROW(parameters.validateAndDeserialize(config));
195 eckit::LocalConfiguration config;
196 config.set(
"covariance model",
"###INVALID###");
198 if (oops::Parameters::isValidationSupported())
199 EXPECT_THROWS_MSG(parameters.validate(config),
"unrecognized enum value");
200 EXPECT_THROWS_MSG(parameters.deserialize(config),
201 "does not exist in CovarianceFactory");
208 const std::string validName = config.getString(
"covariance model");
209 const std::vector<std::string> registeredNames =
211 const bool found = std::find(registeredNames.begin(), registeredNames.end(), validName) !=
212 registeredNames.end();
218 template <
typename MODEL>
225 std::string
testid()
const override {
return "test::ErrorCovariance<" + MODEL::name() +
">";}
228 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
230 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testErrorCovarianceZero")
231 { testErrorCovarianceZero<MODEL>(); });
232 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testErrorCovarianceInverse")
233 { testErrorCovarianceInverse<MODEL>(); });
234 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testErrorCovarianceSym")
235 { testErrorCovarianceSym<MODEL>(); });
236 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testCovarianceParametersWrapperValidName")
237 { testCovarianceParametersWrapperValidName<MODEL>(); });
238 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testCovarianceParametersWrapperInvalidName")
239 { testCovarianceParametersWrapperInvalidName<MODEL>(); });
240 ts.emplace_back(
CASE(
"interface/ErrorCovariance/testCovarianceFactoryGetMakerNames")
241 { testCovarianceFactoryGetMakerNames<MODEL>(); });
static std::vector< std::string > getMakerNames()
Return the names of all covariance models that can be created by one of the registered makers.
Geometry class used in oops; subclass of interface class interface::Geometry.
Increment class used in oops.
Contains a polymorphic parameter holding an instance of a subclass of ModelSpaceCovarianceParametersB...
State class used in oops; subclass of interface class interface::State.
oops::Geometry< MODEL > Geometry_
static ErrorCovarianceFixture< MODEL > & getInstance()
static const util::DateTime & time()
static const eckit::Configuration & test()
static const Geometry_ & resol()
static const oops::Variables & ctlvars()
static const Covariance_ & covariance()
std::unique_ptr< const util::DateTime > time_
oops::ModelSpaceCovarianceBase< MODEL > Covariance_
std::unique_ptr< const oops::Variables > ctlvars_
std::unique_ptr< const Geometry_ > resol_
std::unique_ptr< Covariance_ > B_
std::unique_ptr< const eckit::LocalConfiguration > test_
void clear() const override
std::string testid() const override
void register_tests() const override
virtual ~ErrorCovariance()
static const eckit::Configuration & config()
const eckit::mpi::Comm & world()
Default communicator with all MPI tasks (ie MPI_COMM_WORLD)
void testCovarianceFactoryGetMakerNames()
void testErrorCovarianceInverse()
void testCovarianceParametersWrapperValidName()
void testErrorCovarianceSym()
void testErrorCovarianceZero()
void testCovarianceParametersWrapperInvalidName()
CASE("test_linearmodelparameterswrapper_valid_name")