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"
33 #include "oops/util/DateTime.h"
34 #include "oops/util/dot_product.h"
49 const Geometry_ & geometry = Test_::resol();
51 VerticalLocEV_ vertloc(geometry, vertlocconf);
52 oops::Log::test() <<
"Number of eigenvalues used in VerticalLoc: " << vertloc.neig() << std::endl;
56 int neig = vertloc.neig();
57 oops::Log::debug() <<
"Expected number of eigen modes: " << nEigExpected << std::endl;
58 oops::Log::debug() <<
"Actual number of eigen modes: " << neig << std::endl;
59 EXPECT(nEigExpected == neig);
62 EXPECT(vertloc.testTruncateEvecs(geometry));
72 std::vector<util::DateTime> times;
74 Increment4D_ dx1(Test_::resol(), Test_::ctlvars(), times);
75 Increment4D_ dx2(Test_::resol(), Test_::ctlvars(), times);
76 IncrementEnsemble_ incEns(Test_::resol(), Test_::ctlvars(), times, neig);
78 for (
int i = 1;
i < neig; ++
i) {incEns[
i][0].zero();}
79 for (
int i = 1;
i < neig; ++
i) {
80 double n = incEns[0][0].dot_product_with(incEns[
i][0]);
81 EXPECT(n < 100*DBL_EPSILON);
87 double normRandom = dx2.dot_product_with(dx2);
88 dx2.schur_product_with(dx1);
89 EXPECT(std::abs(dx2.dot_product_with(dx2)-normRandom) < normRandom*DBL_EPSILON);
90 oops::Log::debug() <<
"Increment ones()" << dx1 << std::endl;
93 vertloc.modulateIncrement(dx1, incEns);
96 double n0 = incEns[0][0].dot_product_with(incEns[0][0]);
97 oops::Log::debug() <<
"dot product 0: " << n0 << std::endl;
99 double tol = 2*n0*DBL_EPSILON;
100 oops::Log::debug() <<
"tolerance :" << tol << std::endl;
102 for (
int i = 1;
i < neig; ++
i) {
103 double n = incEns[0][0].dot_product_with(incEns[
i][0]);
104 oops::Log::debug() <<
"dot product " <<
i <<
": " << n << std::endl;
110 IncrementEnsemble_ incEns2(Test_::resol(), Test_::ctlvars(), times, 1);
113 Eigen::MatrixXd modInc = vertloc.modulateIncrement(incEns2, geometry.begin(), 0);
114 Eigen::MatrixXd modIncInner = modInc.transpose()*modInc;
115 oops::Log::debug() <<
"modInc'*modInc" << modIncInner << std::endl;
116 for (
int i = 1;
i < neig; ++
i) {
117 EXPECT(modIncInner(0,
i) < modIncInner(0, 0)*DBL_EPSILON);
123 template <
typename MODEL>
133 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
135 ts.emplace_back(
CASE(
"generic/VerticalLocEV/testVerticalLocEV")
136 { testVerticalLocEV<MODEL>(); });
Geometry class used in oops; subclass of interface class interface::Geometry.
4D model state Increment (vector of 3D Increments)
Ensemble of 4D increments.
static const eckit::Configuration & config()
virtual ~VerticalLocEV()=default
std::string testid() const override
void register_tests() const override
void clear() const override
CASE("assimilation/FullGMRES/FullGMRES")