8 #ifndef TEST_UFO_OBSFUNCTION_H_
9 #define TEST_UFO_OBSFUNCTION_H_
16 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
18 #include "eckit/config/LocalConfiguration.h"
19 #include "eckit/testing/Test.h"
20 #include "ioda/ObsSpace.h"
21 #include "ioda/ObsVector.h"
22 #include "oops/mpi/mpi.h"
23 #include "oops/runs/Test.h"
24 #include "test/TestEnvironment.h"
28 #include "ufo/GeoVaLs.h"
29 #include "ufo/ObsDiagnostics.h"
39 for (
size_t ivar = 0; ivar < vals.nvars() ; ++ivar) {
42 for (
size_t jj = 0; jj < ref.nlocs() ; ++jj) {
43 vals[ivar][jj] -= ref[ivar][jj];
44 rms += vals[ivar][jj] * vals[ivar][jj];
47 ospace.comm().allReduceInPlace(rms, eckit::mpi::sum());
48 ospace.comm().allReduceInPlace(nobs, eckit::mpi::sum());
49 if (nobs > 0) rms = sqrt(rms /
static_cast<float>(nobs));
57 const eckit::LocalConfiguration
conf(::test::TestEnvironment::config());
59 util::DateTime bgn(
conf.getString(
"window begin"));
60 util::DateTime end(
conf.getString(
"window end"));
61 const eckit::LocalConfiguration obsconf(
conf,
"obs space");
62 ioda::ObsSpace ospace(obsconf, oops::mpi::world(), bgn, end, oops::mpi::myself());
68 const eckit::LocalConfiguration obsfuncconf(
conf,
"obs function");
76 const oops::Variables geovars = allfuncvars.
allFromGroup(
"GeoVaLs").toOopsVariables();
77 std::unique_ptr<GeoVaLs> gval;
78 if (geovars.size() > 0) {
79 const eckit::LocalConfiguration gconf(
conf,
"geovals");
80 gval.reset(
new GeoVaLs(gconf, ospace, geovars));
81 inputs.associate(*gval);
85 const oops::Variables diagvars = allfuncvars.
allFromGroup(
"ObsDiag").toOopsVariables();
86 std::unique_ptr<ObsDiagnostics> diags;
87 if (diagvars.size() > 0) {
88 const eckit::LocalConfiguration diagconf(
conf,
"obs diagnostics");
90 inputs.associate(*diags);
94 const oops::Variables outputvars(obsfuncconf,
"variables");
97 obsfunc.compute(inputs, vals);
98 vals.save(
"TestResult");
99 int nvars = vals.nvars();
103 inputs.get(funcname, vals_ofd);
109 const double tol = obsfuncconf.getDouble(
"tolerance");
112 std::vector<float> rms_out(nvars);
115 oops::Log::info() <<
"Vector difference between reference and computed: " << std::endl;
116 oops::Log::info() << vals << std::endl;
117 for (
size_t ivar = 0; ivar < nvars; ivar++) {
118 EXPECT(rms_out[ivar] < 100*tol);
122 oops::Log::info() <<
"Vector difference between reference and computed via ObsFilterData: "
124 oops::Log::info() << vals_ofd << std::endl;
125 for (
size_t ivar = 0; ivar < nvars; ivar++) {
126 EXPECT(rms_out[ivar] < 100*tol);
137 std::string
testid()
const override {
return "ufo::test::ObsFunction";}
140 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
142 ts.emplace_back(
CASE(
"ufo/ObsFunction/testFunction")
154 #endif // TEST_UFO_OBSFUNCTION_H_