14 #include "ioda/ObsDataVector.h"
15 #include "oops/util/missingValues.h"
24 SatWindsSPDBCheck::SatWindsSPDBCheck(
const eckit::LocalConfiguration & conf)
28 options_.deserialize(conf);
31 const float error_min = options_.error_min.value();
32 const float error_max = options_.error_max.value();
33 ASSERT(error_min < error_max);
36 invars_ +=
Variable(
"eastward_wind@ObsValue");
37 invars_ +=
Variable(
"northward_wind@ObsValue");
40 std::string test_hofx = options_.test_hofx.value();
41 invars_ +=
Variable(
"eastward_wind@" + test_hofx);
42 invars_ +=
Variable(
"northward_wind@" + test_hofx);
46 const std::string errgrp = options_.original_obserr.value();
47 invars_ +=
Variable(
"eastward_wind@"+errgrp);
54 SatWindsSPDBCheck::~SatWindsSPDBCheck() {}
58 void SatWindsSPDBCheck::compute(
const ObsFilterData & in,
60 const size_t nlocs = in.nlocs();
63 float residual = 0.0f;
67 ASSERT(out.nvars() == 1);
70 const float error_min = options_.error_min.value();
71 const float error_max = options_.error_max.value();
74 std::vector<float> u, v;
75 in.get(Variable(
"eastward_wind@ObsValue"), u);
76 in.get(Variable(
"northward_wind@ObsValue"), v);
78 std::string test_hofx = options_.test_hofx.value();
79 std::vector<float> um, vm;
80 in.get(Variable(
"eastward_wind@" + test_hofx), um);
81 in.get(Variable(
"northward_wind@" + test_hofx), vm);
84 std::vector<float> currentObserr(
nlocs);
85 const std::string errgrp = options_.original_obserr.value();
86 in.get(Variable(
"eastward_wind@"+errgrp), currentObserr);
88 for (
size_t jj = 0; jj <
nlocs; ++jj) {
91 spdb = sqrt(u[jj]*u[jj]+v[jj]*v[jj]) - sqrt(um[jj]*um[jj]+vm[jj]*vm[jj]);
93 obserr = currentObserr[jj];
94 obserr = std::max(error_min, std::min(obserr, error_max));
95 residual = sqrt((u[jj]-um[jj])*(u[jj]-um[jj]) + (v[jj]-vm[jj])*(v[jj]-vm[jj]));
96 out[0][jj] = residual/obserr;
104 const ufo::Variables & SatWindsSPDBCheck::requiredVariables()
const {
integer function nlocs(this)
Return the number of observational locations in this Locations object.
static ObsFunctionMaker< SatWindsSPDBCheck > makerObsFuncSatWindsSPDBCheck_("SatWindsSPDBCheck")