UFO
ObsBiasCovarianceDetails.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2020 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_OBSBIASCOVARIANCEDETAILS_H_
9 #define TEST_UFO_OBSBIASCOVARIANCEDETAILS_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/Duration.h"
23 #include "oops/util/Logger.h"
24 #include "test/TestEnvironment.h"
25 #include "ufo/ObsBias.h"
26 #include "ufo/ObsBiasCovariance.h"
27 #include "ufo/ObsBiasIncrement.h"
28 
29 namespace ufo {
30 namespace test {
31 // -----------------------------------------------------------------------------
32 
34  eckit::LocalConfiguration conf(::test::TestEnvironment::config());
35 
36  // Setup ObsSpace
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::ObsSpace odb(oconf.getSubConfiguration("obs space"), oops::mpi::world(),
44  bgn, end, oops::mpi::myself());
45 
46  // Setup ObsBias
47  ObsBias ybias(odb, oconf);
48 
49  // Setup ObsBiasIncrements
50  ObsBiasIncrement ybias_inc(odb, oconf);
51  ObsBiasIncrement ybias_inc_2(ybias_inc);
52  ObsBiasIncrement ybias_inc_3(ybias_inc);
53  ybias_inc_2.zero();
54  ybias_inc_3.zero();
55 
56  // Setup ObsBiasCovariance (include reading from file)
57  ObsBiasCovariance ybias_cov(odb, oconf);
58 
59  // Randomize increments
60  ybias_cov.randomize(ybias_inc);
61 
62  // linearize for first outer loop
63  oconf.set("iteration", 0);
64  ybias_cov.linearize(ybias, oconf);
65 
66  // linearize for second outer loop
67  oconf.set("iteration", 1);
68  EXPECT_THROWS(ybias_cov.linearize(ybias, oconf));
69 
70  // mimic QC flags from first outer loop
71  const std::vector<int> qc_flags(odb.nlocs(), 50);
72  const std::vector<std::string> vars = odb.obsvariables().variables();
73  for ( const auto & var : vars)
74  odb.put_db("EffectiveQC0", var , qc_flags);
75 
76  // mimic effective errors
77  const std::vector<float> errs(odb.nlocs(), 1.0);
78  for ( const auto & var : vars)
79  odb.put_db("EffectiveError", var , errs);
80 
81  // mimic predictors
82  ioda::ObsVector predx(odb);
83  for (std::size_t jj = 0; jj < predx.size(); ++jj)
84  predx[jj] = 1.0;
85  for (const auto & pred : ybias_cov.predictorNames()) {
86  predx.save(pred + "Predictor");
87  }
88 
89  // Randomize increments again
90  ybias_cov.randomize(ybias_inc);
91 
92  // linearize for second outer loop
93  ybias_cov.linearize(ybias, oconf);
94 
95  // delta_bias * B
96  ybias_cov.multiply(ybias_inc, ybias_inc_2);
97 
98  EXPECT(ybias_inc.norm() != ybias_inc_2.norm());
99  oops::Log::test() << "ufo::testObsBiasCovarianceDetails multiply is verified" << std::endl;
100 
101  // delta_bias / B
102  ybias_cov.inverseMultiply(ybias_inc_2, ybias_inc_3);
103 
104  // Verifing the reading is right
105  const double tolerance = oconf.getDouble("tolerance");
106  EXPECT(ybias_inc.norm() - ybias_inc_3.norm() < tolerance);
107  oops::Log::test() << "ufo::testObsBiasCovarianceDetails inverseMultiply is verified"
108  << std::endl;
109  }
110 }
111 
112 // -----------------------------------------------------------------------------
113 
114 class ObsBiasCovarianceDetails : public oops::Test {
115  public:
118  private:
119  std::string testid() const override {return "ufo::test::ObsBiasCovarianceDetails";}
120 
121  void register_tests() const override {
122  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
123 
124  ts.emplace_back(CASE("ufo/ObsBias/testObsBiasCovarianceDetails")
126  }
127 
128  void clear() const override {}
129 };
130 
131 // -----------------------------------------------------------------------------
132 
133 } // namespace test
134 } // namespace ufo
135 
136 #endif // TEST_UFO_OBSBIASCOVARIANCEDETAILS_H_
ufo::ObsBiasCovariance::randomize
void randomize(ObsBiasIncrement &) const
Definition: ObsBiasCovariance.cc:348
ufo::ObsBiasIncrement::norm
double norm() const
Definition: ObsBiasIncrement.cc:177
ObsBiasIncrement.h
ObsBias.h
ufo::test::CASE
CASE("ufo/MetOfficeBuddyPairFinder/" "Duplicates, constraints on buddy counts, legacy pair collector")
Definition: test/ufo/MetOfficeBuddyPairFinder.h:171
ufo::ObsBiasCovariance
Definition: ObsBiasCovariance.h:37
ufo::ObsBiasCovariance::predictorNames
const std::vector< std::string > predictorNames() const
Definition: ObsBiasCovariance.h:55
ufo
Definition: RunCRTM.h:27
ufo::test::ObsBiasCovarianceDetails::testid
std::string testid() const override
Definition: ObsBiasCovarianceDetails.h:119
ObsBiasCovariance.h
ufo::ObsBias
Class to handle observation bias parameters.
Definition: ObsBias.h:44
ufo::ObsBiasCovariance::linearize
void linearize(const ObsBias &, const eckit::Configuration &)
Definition: ObsBiasCovariance.cc:218
ufo::test::ObsBiasCovarianceDetails
Definition: ObsBiasCovarianceDetails.h:114
ufo::test::ObsBiasCovarianceDetails::clear
void clear() const override
Definition: ObsBiasCovarianceDetails.h:128
ufo::test::ObsBiasCovarianceDetails::ObsBiasCovarianceDetails
ObsBiasCovarianceDetails()
Definition: ObsBiasCovarianceDetails.h:116
ufo::ObsBiasIncrement
Definition: ObsBiasIncrement.h:39
ufo::ObsBiasCovariance::multiply
void multiply(const ObsBiasIncrement &, ObsBiasIncrement &) const
Definition: ObsBiasCovariance.cc:322
ufo::test::testObsBiasCovarianceDetails
void testObsBiasCovarianceDetails()
Definition: ObsBiasCovarianceDetails.h:33
ufo::test::ObsBiasCovarianceDetails::register_tests
void register_tests() const override
Definition: ObsBiasCovarianceDetails.h:121
ufo::test::ObsBiasCovarianceDetails::~ObsBiasCovarianceDetails
virtual ~ObsBiasCovarianceDetails()
Definition: ObsBiasCovarianceDetails.h:117
ufo::ObsBiasCovariance::inverseMultiply
void inverseMultiply(const ObsBiasIncrement &, ObsBiasIncrement &) const
Definition: ObsBiasCovariance.cc:335
ufo::ObsBiasIncrement::zero
void zero()
Definition: ObsBiasIncrement.cc:115
conf
Definition: conf.py:1