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"
27 #include "ufo/ObsBias.h"
28 #include "ufo/ObsDiagnostics.h"
36 template <>
struct VectorPrintSelector<float> {
typedef VectorPrintSimple selector; };
45 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
48 util::DateTime bgn(conf.getString(
"window begin"));
49 util::DateTime end(conf.getString(
"window end"));
50 const eckit::LocalConfiguration obsconf(conf,
"obs space");
51 ioda::ObsTopLevelParameters obsparams;
52 obsparams.validateAndDeserialize(obsconf);
53 ioda::ObsSpace ospace(obsparams, oops::mpi::world(), bgn, end, oops::mpi::myself());
54 const size_t nlocs = ospace.nlocs();
58 eckit::LocalConfiguration obsopconf(conf,
"obs operator");
60 obsopparams.validateAndDeserialize(obsopconf);
64 eckit::LocalConfiguration gconf(conf,
"geovals");
68 eckit::LocalConfiguration biasconf = conf.getSubConfiguration(
"obs bias");
70 biasparams.validateAndDeserialize(biasconf);
71 const ObsBias ybias(ospace, biasparams);
74 ioda::ObsVector hofx(ospace);
77 ioda::ObsVector bias(ospace);
81 eckit::LocalConfiguration diagconf(conf,
"obs diagnostics");
82 oops::Variables diagvars(diagconf,
"variables");
83 EXPECT(diagvars.size() > 0);
84 std::unique_ptr<Locations> locs(hop.
locations());
91 const double tol = conf.getDouble(
"tolerance");
92 eckit::LocalConfiguration diagrefconf(conf,
"reference obs diagnostics");
96 for (
size_t ivar = 0; ivar < diagvars.size(); ivar++) {
97 const size_t nlevs = diags.nlevs(diagvars[ivar]);
98 EXPECT(nlevs == diagref.nlevs(diagvars[ivar]));
99 for (
size_t ilev = 0; ilev < nlevs; ilev++) {
100 std::vector<float> ref(
nlocs);
101 std::vector<float> computed(
nlocs);
102 diags.get(computed, diagvars[ivar], ilev);
103 diagref.get(ref, diagvars[ivar], ilev);
106 for (
size_t iloc = 0; iloc <
nlocs; iloc++) {
107 ref[iloc] -= computed[iloc];
108 rms += ref[iloc] * ref[iloc];
110 rms = sqrt(rms /
nlocs);
112 EXPECT(rms < 100*tol);
113 oops::Log::info() << diagvars[ivar] <<
", level " << ilev <<
114 ": difference between reference and computed: " << ref << std::endl;
126 std::string
testid()
const override {
return "ufo::test::ObsDiagnostics";}
129 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
131 ts.emplace_back(
CASE(
"ufo/ObsDiagnostics/testObsDiagnostics")
Parameters influencing the bias correction process.
std::unique_ptr< Locations > locations() const
Operator locations.
void simulateObs(const GeoVaLs &, ioda::ObsVector &, const ObsBias &, ioda::ObsVector &, ObsDiagnostics &) const
Obs Operator.
const oops::Variables & requiredVars() const
Operator input required from Model.
Contains a polymorphic parameter holding an instance of a subclass of ObsOperatorParametersBase.
void register_tests() const override
virtual ~ObsDiagnostics()
std::string testid() const override
void clear() const override
void testObsDiagnostics()
CASE("ufo/DataExtractor/bilinearinterp/float_linear")
integer function nlocs(this)
Return the number of observational locations in this Locations object.