12 #ifndef TEST_INTERFACE_INCREMENT_H_
13 #define TEST_INTERFACE_INCREMENT_H_
21 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
23 #include <boost/noncopyable.hpp>
25 #include "eckit/config/LocalConfiguration.h"
26 #include "eckit/testing/Test.h"
33 #include "oops/util/DateTime.h"
34 #include "oops/util/dot_product.h"
35 #include "oops/util/Logger.h"
56 return theIncrementFixture;
66 const double tol_default = 1e-8;
68 time_.reset(
new util::DateTime(
test_->getString(
"date")));
71 oops::Log::warning() <<
72 "Warning: Increment norm tolerance greater than 1e-8 "
73 "may not be suitable for certain solvers." <<
77 ~IncrementFixture<MODEL>() {}
81 std::unique_ptr<const eckit::LocalConfiguration>
test_;
83 std::unique_ptr<util::DateTime>
time_;
94 Increment_ dx(Test_::resol(), Test_::ctlvars(), Test_::time());
96 EXPECT(dx.norm() == 0.0);
105 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
107 EXPECT(dx1.norm() > 0.0);
110 EXPECT(dx2.norm() > 0.0);
114 EXPECT(dx2.norm() == 0.0);
123 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
125 EXPECT(dx1.norm() > 0.0);
128 Increment_ dx2(dx1,
true);
129 EXPECT(dx2.norm() == dx1.norm());
132 Increment_ dx3(dx1,
false);
133 EXPECT(dx3.norm() == 0.0);
143 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
144 Increment_ dx2(Test_::resol(), dx1);
147 EXPECT(dx2.norm() == dx1.norm());
156 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
158 Increment_ dx2(Test_::resol(), Test_::ctlvars(), Test_::time());
162 double dot1 = dx1.norm();
165 double dot2 = dx2.norm();
169 double dot3 = dx2.norm();
172 EXPECT(dot3 <= dot1 + dot2);
181 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
190 EXPECT(dx2.norm() < Test_::tolerance());
199 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
201 Increment_ dx2(Test_::resol(), Test_::ctlvars(), Test_::time());
205 double zz1 = dot_product(dx1, dx2);
206 double zz2 = dot_product(dx2, dx1);
217 Increment_ dx(Test_::resol(), Test_::ctlvars(), Test_::time());
219 EXPECT(dx.norm() > 0.0);
223 EXPECT(dx.norm() == 0.0);
224 EXPECT(dx.validTime() == Test_::time());
227 util::Duration onehour(3600);
228 util::DateTime newTime(Test_::time().toString());
234 EXPECT(dx.norm() == 0.0);
235 EXPECT(dx.validTime() == newTime);
244 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
255 EXPECT(dx2.norm() < Test_::tolerance());
266 bool skipTest = Test_::test().getBool(
"skip accum test",
false);
268 oops::Log::warning() <<
"Skipping Increment.accum test";
273 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
276 Increment_ dx2(Test_::resol(), Test_::ctlvars(), Test_::time());
279 Increment_ diff(dx1);
281 EXPECT(diff.norm() != 0.0);
284 State_ x(Test_::resol(), Test_::ctlvars(), Test_::time());
300 EXPECT(diff.norm() != 0.0);
305 EXPECT(diff.norm() == 0.0);
315 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
318 util::DateTime tt(Test_::time() + util::Duration(
"PT15H"));
319 Increment_ dx2(Test_::resol(), Test_::ctlvars(), tt);
322 std::vector<double> vect;
324 EXPECT(vect.size() == dx1.serialSize());
327 dx2.deserialize(vect, index);
328 EXPECT(index == dx1.serialSize());
329 EXPECT(index == dx2.serialSize());
332 EXPECT(vect.size() == dx1.serialSize() * 2);
334 if (dx1.serialSize() > 0) {
335 EXPECT(dx1.norm() > 0.0);
336 EXPECT(dx2.norm() > 0.0);
337 EXPECT(dx2.validTime() == Test_::time());
340 EXPECT(dx2.norm() == 0.0);
352 bool skipTest = Test_::test().getBool(
"skip diff test",
false);
354 oops::Log::warning() <<
"Skipping Increment.diff test";
359 State_ x1(Test_::resol(), Test_::ctlvars(), Test_::time());
360 State_ x2(Test_::resol(), Test_::ctlvars(), Test_::time());
363 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
366 Increment_ dx2(Test_::resol(), Test_::ctlvars(), Test_::time());
370 Increment_ diff1(dx1);
371 Increment_ diff2(Test_::resol(), Test_::ctlvars(), Test_::time());
373 EXPECT(diff1.norm() != 0.0);
385 EXPECT(diff1.norm() == diff2.norm());
395 Increment_ dx(Test_::resol(), Test_::ctlvars(), Test_::time());
398 util::Duration onehour(3600);
399 dx.updateTime(onehour);
402 util::DateTime newTime(Test_::time().toString());
404 EXPECT(dx.validTime() == newTime);
414 Increment_ dx1(Test_::resol(), Test_::ctlvars(), Test_::time());
417 EXPECT(dx1.norm() == dx2.norm());
420 dx1.schur_product_with(dx2);
423 EXPECT(dx1.norm() != dx2.norm());
428 dx1.schur_product_with(dx2);
429 EXPECT(dx1.norm() == 0.0);
433 Increment_ dx1in(dx1);
435 dx1.schur_product_with(dx2);
436 EXPECT(dx1.norm() == dx1in.norm());
441 template <
typename MODEL>
448 std::string
testid()
const override {
return "test::Increment<" + MODEL::name() +
">";}
451 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
453 ts.emplace_back(
CASE(
"interface/Increment/testIncrementConstructor")
454 { testIncrementConstructor<MODEL>(); });
455 ts.emplace_back(
CASE(
"interface/Increment/testIncrementCopyConstructor")
456 { testIncrementCopyConstructor<MODEL>(); });
457 ts.emplace_back(
CASE(
"interface/Increment/testIncrementCopyBoolConstructor")
458 { testIncrementCopyBoolConstructor<MODEL>(); });
459 ts.emplace_back(
CASE(
"interface/Increment/testIncrementChangeResConstructor")
460 { testIncrementChangeResConstructor<MODEL>(); });
461 ts.emplace_back(
CASE(
"interface/Increment/testIncrementTriangle")
462 { testIncrementTriangle<MODEL>(); });
463 ts.emplace_back(
CASE(
"interface/Increment/testIncrementOpPlusEq")
464 { testIncrementOpPlusEq<MODEL>(); });
465 ts.emplace_back(
CASE(
"interface/Increment/testIncrementDotProduct")
466 { testIncrementDotProduct<MODEL>(); });
467 ts.emplace_back(
CASE(
"interface/Increment/testIncrementAxpy")
468 { testIncrementAxpy<MODEL>(); });
469 ts.emplace_back(
CASE(
"interface/Increment/testIncrementAccum")
470 { testIncrementAccum<MODEL>(); });
471 ts.emplace_back(
CASE(
"interface/Increment/testIncrementDiff")
472 { testIncrementDiff<MODEL>(); });
473 ts.emplace_back(
CASE(
"interface/Increment/testIncrementZero")
474 { testIncrementZero<MODEL>(); });
475 ts.emplace_back(
CASE(
"interface/Increment/testIncrementTime")
476 { testIncrementTime<MODEL>(); });
477 ts.emplace_back(
CASE(
"interface/Increment/testIncrementSchur")
478 { testIncrementSchur<MODEL>(); });
479 ts.emplace_back(
CASE(
"interface/Increment/testIncrementSerialize")
480 { testIncrementSerialize<MODEL>(); });
490 #endif // TEST_INTERFACE_INCREMENT_H_