11 #ifndef TEST_INTERFACE_MODEL_H_
12 #define TEST_INTERFACE_MODEL_H_
20 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
22 #include <boost/noncopyable.hpp>
24 #include "eckit/config/LocalConfiguration.h"
25 #include "eckit/testing/Test.h"
33 #include "oops/util/DateTime.h"
34 #include "oops/util/Duration.h"
41 template <
typename MODEL>
class ModelFixture :
private boost::noncopyable {
64 return theModelFixture;
83 ~ModelFixture<MODEL>() {}
85 std::unique_ptr<const eckit::LocalConfiguration>
test_;
86 std::unique_ptr<const Geometry_>
resol_;
87 std::unique_ptr<const State_>
xref_;
88 std::unique_ptr<const ModelAux_>
bias_;
89 std::unique_ptr<const Model_>
model_;
98 const util::Duration zero(0);
99 EXPECT(Test_::model().timeResolution() > zero);
109 const double ininorm = Test_::xref().
norm();
110 State_ xx(Test_::xref());
111 const util::DateTime vt(xx.validTime());
113 const util::Duration zero(0);
116 Test_::model().forecast(xx, Test_::bias(), zero, post);
118 EXPECT(xx.validTime() == vt);
119 EXPECT(xx.norm() == ininorm);
122 EXPECT(Test_::xref().norm() == ininorm);
131 const double fnorm =
Test_::test().getDouble(
"final norm");
132 const double tol =
Test_::test().getDouble(
"tolerance");
133 const util::Duration len(
Test_::test().getString(
"forecast length"));
135 const double ininorm = Test_::xref().norm();
136 State_ xx(Test_::xref());
137 const util::DateTime vt(xx.validTime()+len);
141 Test_::model().forecast(xx, Test_::bias(), len, post);
143 EXPECT(xx.validTime() == vt);
145 oops::Log::debug() <<
"xx.norm(): " << std::fixed << std::setprecision(8) << xx.norm()
147 oops::Log::debug() <<
"fnorm: " << std::fixed << std::setprecision(8) << fnorm << std::endl;
149 EXPECT(oops::is_close(xx.norm(), fnorm, tol));
152 EXPECT(Test_::xref().norm() == ininorm);
161 const bool testreforecast =
Test_::test().getBool(
"test reforecast",
true);
163 if (testreforecast) {
165 const util::Duration len(
Test_::test().getString(
"forecast length"));
167 const double ininorm = Test_::xref().norm();
170 State_ xx1(Test_::xref());
171 State_ xx2(Test_::xref());
174 const util::DateTime vt(xx1.validTime()+len);
179 Test_::model().forecast(xx1, Test_::bias(), len, post);
182 Test_::model().forecast(xx2, Test_::bias(), len, post);
185 EXPECT(xx1.validTime() == vt);
186 EXPECT(xx2.validTime() == vt);
189 oops::Log::debug() <<
"xx1.norm(): " << std::fixed << std::setprecision(8) << xx1.norm()
191 oops::Log::debug() <<
"xx2.norm(): " << std::fixed << std::setprecision(8) << xx2.norm()
195 EXPECT(xx1.norm() == xx2.norm());
198 EXPECT(Test_::xref().norm() == ininorm);
207 template <
typename MODEL>
216 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
218 ts.emplace_back(
CASE(
"interface/Model/testModelConstructor")
219 { testModelConstructor<MODEL>(); });
220 ts.emplace_back(
CASE(
"interface/Model/testModelNoForecast")
221 { testModelNoForecast<MODEL>(); });
222 ts.emplace_back(
CASE(
"interface/Model/testModelForecast")
223 { testModelForecast<MODEL>(); });
224 ts.emplace_back(
CASE(
"interface/Model/testModelReForecast")
225 { testModelReForecast<MODEL>(); });
Geometry class used in oops; subclass of interface class interface::Geometry.
Abstract nonlinear forecast model used by high level algorithms and applications.
Control model post processing.
State class used in oops; subclass of interface class interface::State.
double norm() const
Norm (used in tests)
std::unique_ptr< const State_ > xref_
std::unique_ptr< const eckit::LocalConfiguration > test_
std::unique_ptr< const ModelAux_ > bias_
static const Model_ & model()
oops::State< MODEL > State_
oops::Model< MODEL > Model_
static const eckit::Configuration & test()
static ModelFixture< MODEL > & getInstance()
static const Geometry_ & resol()
static const ModelAux_ & bias()
oops::ModelAuxControl< MODEL > ModelAux_
static const State_ & xref()
std::unique_ptr< const Model_ > model_
oops::Geometry< MODEL > Geometry_
std::unique_ptr< const Geometry_ > resol_
void register_tests() const override
std::string testid() const override
void clear() const override
static const eckit::Configuration & config()
const eckit::mpi::Comm & world()
Default communicator with all MPI tasks (ie MPI_COMM_WORLD)
void testModelConstructor()
tests constructor, timeResolution() method and print method
void testModelNoForecast()
void testModelReForecast()
CASE("assimilation/FullGMRES/FullGMRES")