9 #include "ioda/ObsSpace.h"
10 #include "oops/util/Logger.h"
22 order_(parameters.order.value().value_or(1)),
23 nscan_(parameters.numScanPositions) {
24 if (parameters.
order.value() != boost::none) {
35 ioda::ObsVector & out)
const {
36 const std::size_t
nlocs = odb.nlocs();
39 ASSERT(out.nlocs() ==
nlocs);
42 std::vector<int> scan_position(
nlocs, 0);
43 std::vector<double> LegPoly(
order_+1, 0);
45 odb.get_db(
"MetaData",
"scan_position", scan_position);
46 const std::size_t nvars =
vars_.size();
47 for (std::size_t jl = 0; jl <
nlocs; ++jl) {
48 double xscan{-1.0 + 2.0 * (scan_position[jl] - 1) / (
nscan_ - 1)};
53 for (std::size_t iorder=1; iorder <
order_; ++iorder) {
54 LegPoly[iorder+1] = ((2*iorder+1)*xscan*LegPoly[iorder]
55 -iorder*LegPoly[iorder-1])/(iorder+1);
57 for (std::size_t iorder=0; iorder <
order_+1; ++iorder) {
58 LegPoly[iorder] = sqrt(2*iorder+1)*LegPoly[iorder];
60 for (std::size_t jb = 0; jb < nvars; ++jb) {
61 out[jl*nvars+jb] = LegPoly[
order_];
GeoVaLs: geophysical values at locations.
Legendre(const Parameters_ &, const oops::Variables &)
void compute(const ioda::ObsSpace &, const GeoVaLs &, const ObsDiagnostics &, ioda::ObsVector &) const override
compute the predictor
Configuration parameters of the Legendre predictor.
oops::OptionalParameter< int > order
std::string & name()
predictor name
oops::Variables vars_
variables that will be bias-corrected using this predictor
integer function nlocs(this)
Return the number of observational locations in this Locations object.
static PredictorMaker< Legendre > makerFuncLegendre_("Legendre")