OOPS
test/interface/ObsAuxIncrement.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2009-2016 ECMWF.
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  * In applying this licence, ECMWF does not waive the privileges and immunities
7  * granted to it by virtue of its status as an intergovernmental organisation nor
8  * does it submit to any jurisdiction.
9  */
10 
11 #ifndef TEST_INTERFACE_OBSAUXINCREMENT_H_
12 #define TEST_INTERFACE_OBSAUXINCREMENT_H_
13 
14 #include <cmath>
15 #include <iostream>
16 #include <memory>
17 #include <string>
18 #include <vector>
19 
20 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
21 
22 #include <boost/noncopyable.hpp>
23 
24 #include "eckit/config/LocalConfiguration.h"
25 #include "eckit/testing/Test.h"
29 #include "oops/runs/Test.h"
30 #include "oops/util/DateTime.h"
31 #include "oops/util/dot_product.h"
33 #include "test/TestEnvironment.h"
34 
35 namespace test {
36 
37 // =============================================================================
38 
39 template <typename OBS> class ObsAuxIncrementFixture : private boost::noncopyable {
44 
45  public:
46  static const eckit::Configuration & config(const size_t ii) {return getInstance().conf_.at(ii);}
47  static const Covariance_ & covariance(const size_t ii) {return *getInstance().covar_.at(ii);}
48 
49  private:
51  static ObsAuxIncrementFixture<OBS> theObsAuxIncrementFixture;
52  return theObsAuxIncrementFixture;
53  }
54 
56  TestEnvironment::config().get("observations", conf_);
57  for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
58  std::shared_ptr<Covariance_> tmp(new Covariance_(Test_::obspace()[jj], conf_[jj]));
59  covar_.push_back(tmp);
60  }
61  }
62 
63  ~ObsAuxIncrementFixture<OBS>() {}
64 
65  std::vector<eckit::LocalConfiguration> conf_;
66  std::vector<std::shared_ptr<Covariance_> > covar_;
67 };
68 
69 // =============================================================================
70 
71 template <typename OBS> void testObsAuxIncrementConstructor() {
72  typedef ObsTestsFixture<OBS> Test_;
73  typedef ObsAuxIncrementFixture<OBS> AuxTest_;
74  typedef oops::ObsAuxIncrement<OBS> AuxIncr_;
75 
76  for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
77  AuxIncr_ dx(Test_::obspace()[jj], AuxTest_::config(jj));
78  EXPECT(dx.norm() == 0.0);
79  }
80 }
81 
82 // -----------------------------------------------------------------------------
83 
84 template <typename OBS> void testObsAuxIncrementCopyConstructor() {
85  typedef ObsTestsFixture<OBS> Test_;
86  typedef ObsAuxIncrementFixture<OBS> AuxTest_;
87  typedef oops::ObsAuxIncrement<OBS> AuxIncr_;
88 
89  for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
90  if (AuxTest_::config(jj).has("obs bias")) {
91  AuxIncr_ dx1(Test_::obspace()[jj], AuxTest_::config(jj));
93 
94  AuxIncr_ dx2(dx1);
95  EXPECT(dx2.norm() > 0.0);
96  EXPECT(dx2.norm() == dx1.norm());
97 
98 // Check that the copy is equal to the original
99  dx2 -= dx1;
100  EXPECT(dx2.norm() == 0.0);
101  }
102  }
103 }
104 
105 // -----------------------------------------------------------------------------
106 
107 template <typename OBS> void testObsAuxIncrementChangeRes() {
108  typedef ObsTestsFixture<OBS> Test_;
109  typedef ObsAuxIncrementFixture<OBS> AuxTest_;
110  typedef oops::ObsAuxIncrement<OBS> AuxIncr_;
111 
112  for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
113  if (AuxTest_::config(jj).has("obs bias")) {
114  AuxIncr_ dx1(Test_::obspace()[jj], AuxTest_::config(jj));
116 
117  AuxIncr_ dx2(dx1, AuxTest_::config(jj));
118  EXPECT(dx2.norm() > 0.0);
119  EXPECT(dx2.norm() == dx1.norm());
120 
121 // Check that the copy is equal to the original
122  dx2 -= dx1;
123  EXPECT(dx2.norm() == 0.0);
124  }
125  }
126 }
127 
128 // -----------------------------------------------------------------------------
129 
130 template <typename OBS> void testObsAuxIncrementTriangle() {
131  typedef ObsTestsFixture<OBS> Test_;
132  typedef ObsAuxIncrementFixture<OBS> AuxTest_;
133  typedef oops::ObsAuxIncrement<OBS> AuxIncr_;
134 
135  for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
136  if (AuxTest_::config(jj).has("obs bias")) {
137  AuxIncr_ dx1(Test_::obspace()[jj], AuxTest_::config(jj));
139  AuxIncr_ dx2(Test_::obspace()[jj], AuxTest_::config(jj));
141 
142 // test triangle inequality
143  double dot1 = dx1.norm();
144  EXPECT(dot1 > 0.0);
145 
146  double dot2 = dx2.norm();
147  EXPECT(dot2 > 0.0);
148 
149  dx2 += dx1;
150  double dot3 = dx2.norm();
151  EXPECT(dot3 > 0.0);
152 
153  EXPECT(dot3 <= dot1 + dot2);
154  }
155  }
156 }
157 
158 // -----------------------------------------------------------------------------
159 
160 template <typename OBS> void testObsAuxIncrementOpPlusEq() {
161  typedef ObsTestsFixture<OBS> Test_;
162  typedef ObsAuxIncrementFixture<OBS> AuxTest_;
163  typedef oops::ObsAuxIncrement<OBS> AuxIncr_;
164 
165  for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
166  AuxIncr_ dx1(Test_::obspace()[jj], AuxTest_::config(jj));
168  AuxIncr_ dx2(dx1);
169 
170 // test *= and +=
171  dx2 += dx1;
172  dx1 *= 2.0;
173 
174  dx2 -= dx1;
175  EXPECT(dx2.norm() < 1e-8);
176  }
177 }
178 
179 // -----------------------------------------------------------------------------
180 
181 template <typename OBS> void testObsAuxIncrementDotProduct() {
182  typedef ObsTestsFixture<OBS> Test_;
183  typedef ObsAuxIncrementFixture<OBS> AuxTest_;
184  typedef oops::ObsAuxIncrement<OBS> AuxIncr_;
185 
186  for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
187  AuxIncr_ dx1(Test_::obspace()[jj], AuxTest_::config(jj));
189  AuxIncr_ dx2(Test_::obspace()[jj], AuxTest_::config(jj));
191 
192 // test symmetry of dot product
193  double zz1 = dot_product(dx1, dx2);
194  double zz2 = dot_product(dx2, dx1);
195 
196  EXPECT(zz1 == zz2);
197  }
198 }
199 
200 // -----------------------------------------------------------------------------
201 
202 template <typename OBS> void testObsAuxIncrementZero() {
203  typedef ObsTestsFixture<OBS> Test_;
204  typedef ObsAuxIncrementFixture<OBS> AuxTest_;
205  typedef oops::ObsAuxIncrement<OBS> AuxIncr_;
206 
207  for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
208  AuxIncr_ dx(Test_::obspace()[jj], AuxTest_::config(jj));
210  EXPECT(dx.norm() > 0.0);
211 
212 // test zero
213  dx->zero();
214  EXPECT(dx.norm() == 0.0);
215  }
216 }
217 
218 // -----------------------------------------------------------------------------
219 
220 template <typename OBS> void testObsAuxIncrementAxpy() {
221  typedef ObsTestsFixture<OBS> Test_;
222  typedef ObsAuxIncrementFixture<OBS> AuxTest_;
223  typedef oops::ObsAuxIncrement<OBS> AuxIncr_;
224 
225  for (std::size_t jj = 0; jj < Test_::obspace().size(); ++jj) {
226  AuxIncr_ dx1(Test_::obspace()[jj], AuxTest_::config(jj));
228 
229 // test axpy
230  AuxIncr_ dx2(dx1);
231  dx2.axpy(2.0, dx1);
232 
233  dx2 -= dx1;
234  dx2 -= dx1;
235  dx2 -= dx1;
236 
237  EXPECT(dx2.norm() < 1e-8);
238  }
239 }
240 
241 // =============================================================================
242 
243 template <typename OBS>
244 class ObsAuxIncrement : public oops::Test {
246 
247  public:
249  virtual ~ObsAuxIncrement() {}
250 
251  private:
252  std::string testid() const override {return "test::ObsAuxIncrement<" + OBS::name() + ">";}
253 
254  void register_tests() const override {
255  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
256 
257  ts.emplace_back(CASE("interface/ObsAuxIncrement/testObsAuxIncrementConstructor")
258  { testObsAuxIncrementConstructor<OBS>(); });
259  ts.emplace_back(CASE("interface/ObsAuxIncrement/testObsAuxIncrementCopyConstructor")
260  { testObsAuxIncrementCopyConstructor<OBS>(); });
261  ts.emplace_back(CASE("interface/ObsAuxIncrement/testObsAuxIncrementChangeRes")
262  { testObsAuxIncrementChangeRes<OBS>(); });
263  ts.emplace_back(CASE("interface/ObsAuxIncrement/testObsAuxIncrementTriangle")
264  { testObsAuxIncrementTriangle<OBS>(); });
265  ts.emplace_back(CASE("interface/ObsAuxIncrement/testObsAuxIncrementOpPlusEq")
266  { testObsAuxIncrementOpPlusEq<OBS>(); });
267  ts.emplace_back(CASE("interface/ObsAuxIncrement/testObsAuxIncrementDotProduct")
268  { testObsAuxIncrementDotProduct<OBS>(); });
269  ts.emplace_back(CASE("interface/ObsAuxIncrement/testObsAuxIncrementAxpy")
270  { testObsAuxIncrementAxpy<OBS>(); });
271  }
272 
273  void clear() const override {
274  Test_::reset();
275  }
276 };
277 
278 // =============================================================================
279 
280 } // namespace test
281 
282 #endif // TEST_INTERFACE_OBSAUXINCREMENT_H_
test::testObsAuxIncrementOpPlusEq
void testObsAuxIncrementOpPlusEq()
Definition: test/interface/ObsAuxIncrement.h:160
test::ObsTestsFixture
Definition: ObsTestsFixture.h:29
ObsAuxIncrement.h
test::ObsAuxIncrementFixture::config
static const eckit::Configuration & config(const size_t ii)
Definition: test/interface/ObsAuxIncrement.h:46
ObsAuxCovariance.h
ObsAuxControl.h
test::ObsTestsFixture::reset
static void reset()
Definition: ObsTestsFixture.h:37
test::ObsAuxIncrement::register_tests
void register_tests() const override
Definition: test/interface/ObsAuxIncrement.h:254
test::ObsAuxIncrement::Test_
ObsTestsFixture< OBS > Test_
Definition: test/interface/ObsAuxIncrement.h:245
oops::ObsAuxIncrement
Definition: oops/interface/ObsAuxIncrement.h:38
oops::ObsAuxCovariance::randomize
void randomize(ObsAuxIncrement_ &) const
Definition: oops/interface/ObsAuxCovariance.h:117
test::CASE
CASE("test_linearmodelparameterswrapper_valid_name")
Definition: LinearModelFactory.cc:22
test::ObsAuxIncrement::clear
void clear() const override
Definition: test/interface/ObsAuxIncrement.h:273
test
Definition: LinearModelFactory.cc:20
test::testObsAuxIncrementCopyConstructor
void testObsAuxIncrementCopyConstructor()
Definition: test/interface/ObsAuxIncrement.h:84
oops::ObsAuxControl
Definition: oops/interface/ObsAuxControl.h:35
test::ObsAuxIncrementFixture
Definition: test/interface/ObsAuxIncrement.h:39
oops::ObsAuxCovariance
Definition: oops/interface/ObsAuxCovariance.h:36
oops::ObsSpaces::size
std::size_t size() const
Access.
Definition: ObsSpaces.h:57
test::testObsAuxIncrementChangeRes
void testObsAuxIncrementChangeRes()
Definition: test/interface/ObsAuxIncrement.h:107
Test.h
test::TestEnvironment::config
static const eckit::Configuration & config()
Definition: TestEnvironment.h:40
ObsTestsFixture.h
test::ObsAuxIncrement::testid
std::string testid() const override
Definition: test/interface/ObsAuxIncrement.h:252
test::ObsAuxIncrement::ObsAuxIncrement
ObsAuxIncrement()
Definition: test/interface/ObsAuxIncrement.h:248
test::testObsAuxIncrementConstructor
void testObsAuxIncrementConstructor()
Definition: test/interface/ObsAuxIncrement.h:71
test::ObsAuxIncrementFixture::getInstance
static ObsAuxIncrementFixture< OBS > & getInstance()
Definition: test/interface/ObsAuxIncrement.h:50
test::testObsAuxIncrementTriangle
void testObsAuxIncrementTriangle()
Definition: test/interface/ObsAuxIncrement.h:130
TestEnvironment.h
test::testObsAuxIncrementAxpy
void testObsAuxIncrementAxpy()
Definition: test/interface/ObsAuxIncrement.h:220
test::ObsAuxIncrementFixture::Test_
ObsTestsFixture< OBS > Test_
Definition: test/interface/ObsAuxIncrement.h:40
test::testObsAuxIncrementDotProduct
void testObsAuxIncrementDotProduct()
Definition: test/interface/ObsAuxIncrement.h:181
test::ObsAuxIncrementFixture::conf_
std::vector< eckit::LocalConfiguration > conf_
Definition: test/interface/ObsAuxIncrement.h:65
test::ObsAuxIncrementFixture::covariance
static const Covariance_ & covariance(const size_t ii)
Definition: test/interface/ObsAuxIncrement.h:47
test::ObsAuxIncrementFixture::ObsAux_
oops::ObsAuxControl< OBS > ObsAux_
Definition: test/interface/ObsAuxIncrement.h:42
oops::Test
Definition: Test.h:39
test::testObsAuxIncrementZero
void testObsAuxIncrementZero()
Definition: test/interface/ObsAuxIncrement.h:202
test::ObsTestsFixture::obspace
static ObsSpaces_ & obspace()
Definition: ObsTestsFixture.h:35
test::ObsAuxIncrementFixture::Covariance_
oops::ObsAuxCovariance< OBS > Covariance_
Definition: test/interface/ObsAuxIncrement.h:41
test::ObsAuxIncrement::~ObsAuxIncrement
virtual ~ObsAuxIncrement()
Definition: test/interface/ObsAuxIncrement.h:249
test::ObsAuxIncrementFixture::covar_
std::vector< std::shared_ptr< Covariance_ > > covar_
Definition: test/interface/ObsAuxIncrement.h:66
test::ObsAuxIncrementFixture::AuxIncr_
oops::ObsAuxIncrement< OBS > AuxIncr_
Definition: test/interface/ObsAuxIncrement.h:43
test::ObsAuxIncrement
Definition: test/interface/ObsAuxIncrement.h:244