8 #ifndef TEST_UFO_OBSDIAGNOSTICS_H_
9 #define TEST_UFO_OBSDIAGNOSTICS_H_
15 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
17 #include "eckit/config/LocalConfiguration.h"
18 #include "eckit/testing/Test.h"
19 #include "ioda/ObsSpace.h"
20 #include "ioda/ObsVector.h"
21 #include "oops/base/Variables.h"
22 #include "oops/mpi/mpi.h"
23 #include "oops/runs/Test.h"
24 #include "test/TestEnvironment.h"
25 #include "ufo/GeoVaLs.h"
26 #include "ufo/Locations.h"
28 #include "ufo/ObsDiagnostics.h"
37 const eckit::LocalConfiguration
conf(::test::TestEnvironment::config());
40 util::DateTime bgn(
conf.getString(
"window begin"));
41 util::DateTime end(
conf.getString(
"window end"));
42 const eckit::LocalConfiguration obsconf(
conf,
"obs space");
43 ioda::ObsSpace ospace(obsconf, oops::mpi::world(), bgn, end, oops::mpi::myself());
44 const size_t nlocs = ospace.nlocs();
48 eckit::LocalConfiguration obsopconf(
conf,
"obs operator");
52 eckit::LocalConfiguration gconf(
conf,
"geovals");
59 ioda::ObsVector hofx(ospace);
62 eckit::LocalConfiguration diagconf(
conf,
"obs diagnostics");
63 oops::Variables diagvars(diagconf,
"variables");
64 EXPECT(diagvars.size() > 0);
65 std::unique_ptr<Locations> locs(hop.
locations(bgn, end));
72 const double tol =
conf.getDouble(
"tolerance");
73 eckit::LocalConfiguration diagrefconf(
conf,
"reference obs diagnostics");
77 for (
size_t ivar = 0; ivar < diagvars.size(); ivar++) {
78 const size_t nlevs = diags.nlevs(diagvars[ivar]);
79 EXPECT(nlevs == diagref.nlevs(diagvars[ivar]));
80 for (
size_t ilev = 0; ilev < nlevs; ilev++) {
81 std::vector<float> ref(nlocs);
82 std::vector<float> computed(nlocs);
83 diags.get(computed, diagvars[ivar], ilev+1);
84 diagref.get(ref, diagvars[ivar], ilev+1);
87 for (
size_t iloc = 0; iloc < nlocs; iloc++) {
88 ref[iloc] -= computed[iloc];
89 rms += ref[iloc] * ref[iloc];
91 rms = sqrt(rms / nlocs);
93 EXPECT(rms < 100*tol);
94 oops::Log::info() << diagvars[ivar] <<
", level " << ilev <<
95 ": difference between reference and computed: " << ref << std::endl;
107 std::string
testid()
const override {
return "ufo::test::ObsDiagnostics";}
110 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
112 ts.emplace_back(
CASE(
"ufo/ObsDiagnostics/testObsDiagnostics")
124 #endif // TEST_UFO_OBSDIAGNOSTICS_H_