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::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
48  eckit::LocalConfiguration biasconf = oconf.getSubConfiguration("obs bias");
49  ObsBiasParameters biasparams;
50  biasparams.validateAndDeserialize(biasconf);
51  ObsBias ybias(odb, biasparams);
52 
53  // Setup ObsBiasIncrements
54  eckit::LocalConfiguration biaserrconf = biasconf.getSubConfiguration("covariance");
55  ObsBiasIncrement ybias_inc(odb, biasparams);
56  ObsBiasIncrement ybias_inc_2(ybias_inc);
57  ObsBiasIncrement ybias_inc_3(ybias_inc);
58  ybias_inc_2.zero();
59  ybias_inc_3.zero();
60 
61  // Setup ObsBiasCovariance (include reading from file)
62  ObsBiasCovariance ybias_cov(odb, biasparams);
63 
64  // Randomize increments
65  ybias_cov.randomize(ybias_inc);
66 
67  // linearize for first outer loop
68  biaserrconf.set("iteration", 0);
69  ybias_cov.linearize(ybias, biaserrconf);
70 
71  // linearize for second outer loop
72  biaserrconf.set("iteration", 1);
73  EXPECT_THROWS(ybias_cov.linearize(ybias, biaserrconf));
74 
75  // mimic QC flags from first outer loop
76  const std::vector<int> qc_flags(odb.nlocs(), 50);
77  const std::vector<std::string> vars = odb.obsvariables().variables();
78  for ( const auto & var : vars)
79  odb.put_db("EffectiveQC0", var , qc_flags);
80 
81  // mimic effective errors
82  const std::vector<float> errs(odb.nlocs(), 1.0);
83  for ( const auto & var : vars)
84  odb.put_db("EffectiveError0", var , errs);
85 
86  // mimic predictors
87  ioda::ObsVector predx(odb);
88  for (std::size_t jj = 0; jj < predx.size(); ++jj)
89  predx[jj] = 1.0;
90  for (const auto & pred : ybias_cov.predictorNames()) {
91  predx.save(pred + "Predictor");
92  }
93 
94  // Randomize increments again
95  ybias_cov.randomize(ybias_inc);
96 
97  // linearize for second outer loop
98  ybias_cov.linearize(ybias, biaserrconf);
99 
100  // delta_bias * B
101  ybias_cov.multiply(ybias_inc, ybias_inc_2);
102 
103  EXPECT(ybias_inc.norm() != ybias_inc_2.norm());
104  oops::Log::test() << "ufo::testObsBiasCovarianceDetails multiply is verified" << std::endl;
105 
106  // delta_bias / B
107  ybias_cov.inverseMultiply(ybias_inc_2, ybias_inc_3);
108 
109  // Verifing the reading is right
110  const double tolerance = oconf.getDouble("tolerance");
111  EXPECT(ybias_inc.norm() - ybias_inc_3.norm() < tolerance);
112  oops::Log::test() << "ufo::testObsBiasCovarianceDetails inverseMultiply is verified"
113  << std::endl;
114  }
115 }
116 
117 // -----------------------------------------------------------------------------
118 
119 class ObsBiasCovarianceDetails : public oops::Test {
120  public:
123  private:
124  std::string testid() const override {return "ufo::test::ObsBiasCovarianceDetails";}
125 
126  void register_tests() const override {
127  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
128 
129  ts.emplace_back(CASE("ufo/ObsBias/testObsBiasCovarianceDetails")
131  }
132 
133  void clear() const override {}
134 };
135 
136 // -----------------------------------------------------------------------------
137 
138 } // namespace test
139 } // namespace ufo
140 
141 #endif // TEST_UFO_OBSBIASCOVARIANCEDETAILS_H_
void inverseMultiply(const ObsBiasIncrement &, ObsBiasIncrement &) const
void randomize(ObsBiasIncrement &) const
void multiply(const ObsBiasIncrement &, ObsBiasIncrement &) const
void linearize(const ObsBias &, const eckit::Configuration &)
const std::vector< std::string > predictorNames() const
Contains increments to bias correction coefficients.
Parameters influencing the bias correction process.
CASE("ufo/DataExtractor/bilinearinterp/float_linear")
void testObsBiasCovarianceDetails()
Definition: RunCRTM.h:27