UFO
test/ufo/ObsBias.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2021- UCAR
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
8 #ifndef TEST_UFO_OBSBIAS_H_
9 #define TEST_UFO_OBSBIAS_H_
10 
11 #include <string>
12 #include <vector>
13 
14 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
15 
16 #include "eckit/config/LocalConfiguration.h"
17 #include "eckit/testing/Test.h"
18 #include "ioda/ObsSpace.h"
19 #include "oops/mpi/mpi.h"
20 #include "oops/runs/Test.h"
21 #include "oops/util/DateTime.h"
22 #include "oops/util/FloatCompare.h"
23 #include "oops/util/Logger.h"
24 #include "test/TestEnvironment.h"
25 #include "ufo/ObsBias.h"
26 
27 namespace ufo {
28 namespace test {
29 // -----------------------------------------------------------------------------
30 
31 /// \brief Tests ObsBias::read and ObsBias::write methods
32 /// \details Test that if we write and then read or initialize ObsBias the coefficients
33 /// are correct for the read/initialized ObsBias.
35  eckit::LocalConfiguration conf(::test::TestEnvironment::config());
36 
37  util::DateTime bgn(conf.getString("window begin"));
38  util::DateTime end(conf.getString("window end"));
39  std::vector<eckit::LocalConfiguration> obsconfs
40  = conf.getSubConfigurations("observations");
41 
42  for (auto & oconf : obsconfs) {
43  ioda::ObsTopLevelParameters obsparams;
44  obsparams.validateAndDeserialize(oconf.getSubConfiguration("obs space"));
45  ioda::ObsSpace odb(obsparams, oops::mpi::world(), bgn, end, oops::mpi::myself());
46 
47  // setup ObsBias parameters
48  eckit::LocalConfiguration biasconf = oconf.getSubConfiguration("obs bias");
49  ObsBiasParameters biasparams;
50  biasparams.validateAndDeserialize(biasconf);
51 
52  // setup ObsBias parameters with input file == output file from the original yaml
53  eckit::LocalConfiguration biasconf_forread = biasconf;
54  biasconf_forread.set("input file", biasconf.getString("output file"));
55  ObsBiasParameters biasparams_forread;
56  biasparams_forread.validateAndDeserialize(biasconf_forread);
57 
58  // init ObsBias
59  ObsBias ybias(odb, biasparams);
60  oops::Log::test() << "Initialized obs bias: " << ybias << std::endl;
61  // save original coefficients for comparison later
62  const Eigen::VectorXd original_coeffs = ybias.data();
63  // write out; assign zero; read back in; compare with original coefficients
64  ybias.write(biasparams);
65  ybias.zero();
66  EXPECT_EQUAL(ybias.data().norm(), 0.0);
67  ybias.read(biasparams_forread);
68  oops::Log::test() << "Obs bias after write out; assign zero; read back in: "
69  << ybias << std::endl;
70  EXPECT_EQUAL((original_coeffs - ybias.data()).norm(), 0.0);
71  // create ObsBias from output coefficients; compare with original coefficients
72  ObsBias ybias2(odb, biasparams_forread);
73  oops::Log::test() << "Obs bias initialized from the written out file: " << ybias2 << std::endl;
74  EXPECT_EQUAL((original_coeffs - ybias2.data()).norm(), 0.0);
75  }
76 }
77 
78 // -----------------------------------------------------------------------------
79 
80 class ObsBias : public oops::Test {
81  public:
82  ObsBias() = default;
83  virtual ~ObsBias() = default;
84 
85  private:
86  std::string testid() const override {return "ufo::test::ObsBias";}
87 
88  void register_tests() const override {
89  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
90 
91  ts.emplace_back(CASE("ufo/ObsBias/testObsBiasReadWrite")
92  { testObsBiasReadWrite(); });
93  }
94 
95  void clear() const override {}
96 };
97 
98 // -----------------------------------------------------------------------------
99 
100 } // namespace test
101 } // namespace ufo
102 
103 #endif // TEST_UFO_OBSBIAS_H_
Parameters influencing the bias correction process.
void clear() const override
virtual ~ObsBias()=default
std::string testid() const override
void register_tests() const override
CASE("ufo/DataExtractor/bilinearinterp/float_linear")
void testObsBiasReadWrite()
Tests ObsBias::read and ObsBias::write methods.
Definition: RunCRTM.h:27