8 #ifndef TEST_GENERIC_VERTICALLOCEV_H_
9 #define TEST_GENERIC_VERTICALLOCEV_H_
11 #include <Eigen/Dense>
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"
32 #include "oops/util/DateTime.h"
33 #include "oops/util/dot_product.h"
48 const Geometry_ & geometry = Test_::resol();
50 VerticalLocEV_ vertloc(geometry, vertlocconf);
51 oops::Log::test() <<
"Number of eigenvalues used in VerticalLoc: " << vertloc.neig() << std::endl;
55 int neig = vertloc.neig();
56 oops::Log::debug() <<
"Expected number of eigen modes: " << nEigExpected << std::endl;
57 oops::Log::debug() <<
"Actual number of eigen modes: " << neig << std::endl;
58 EXPECT(nEigExpected == neig);
61 EXPECT(vertloc.testTruncateEvecs(geometry));
71 std::vector<util::DateTime> times;
72 times.push_back(Test_::time());
73 Increment4D_ dx1(Test_::resol(), Test_::ctlvars(), times);
74 Increment4D_ dx2(Test_::resol(), Test_::ctlvars(), times);
75 IncrementEnsemble_ incEns(Test_::resol(), Test_::ctlvars(), times, neig);
77 for (
int i = 1; i < neig; ++i) {incEns[i][0].zero();}
78 for (
int i = 1; i < neig; ++i) {
79 double n = incEns[0][0].dot_product_with(incEns[i][0]);
80 EXPECT(n < 100*DBL_EPSILON);
86 double normRandom = dx2.dot_product_with(dx2);
87 dx2.schur_product_with(dx1);
88 EXPECT(std::abs(dx2.dot_product_with(dx2)-normRandom) < normRandom*DBL_EPSILON);
89 oops::Log::debug() <<
"Increment ones()" << dx1 << std::endl;
92 vertloc.modulateIncrement(dx1, incEns);
95 double n0 = incEns[0][0].dot_product_with(incEns[0][0]);
96 oops::Log::debug() <<
"dot product 0: " << n0 << std::endl;
98 double tol = 2*n0*DBL_EPSILON;
99 oops::Log::debug() <<
"tolerance :" << tol << std::endl;
101 for (
int i = 1; i < neig; ++i) {
102 double n = incEns[0][0].dot_product_with(incEns[i][0]);
103 oops::Log::debug() <<
"dot product " << i <<
": " << n << std::endl;
109 IncrementEnsemble_ incEns2(Test_::resol(), Test_::ctlvars(), times, 1);
112 Eigen::MatrixXd modInc = vertloc.modulateIncrement(incEns2, geometry.begin(), 0);
113 Eigen::MatrixXd modIncInner = modInc.transpose()*modInc;
114 oops::Log::debug() <<
"modInc'*modInc" << modIncInner << std::endl;
115 for (
int i = 1; i < neig; ++i) {
116 EXPECT(modIncInner(0, i) < modIncInner(0, 0)*DBL_EPSILON);
122 template <
typename MODEL>
129 std::string
testid()
const override {
return "test::VerticalLocEV<" + MODEL::name() +
">";}
132 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
134 ts.emplace_back(
CASE(
"generic/VerticalLocEV/testVerticalLocEV")
135 { testVerticalLocEV<MODEL>(); });
145 #endif // TEST_GENERIC_VERTICALLOCEV_H_