13 #include "ioda/ObsVector.h"
15 #include "oops/util/Logger.h"
16 #include "oops/util/missingValues.h"
18 #include "ufo/ObsBias.h"
19 #include "ufo/ObsDiagnostics.h"
27 oops::Log::trace() <<
"ObsBiasOperator::create done." << std::endl;
34 oops::Log::trace() <<
"ObsBiasOperator::computeObsBias starting" << std::endl;
38 const std::size_t npreds = predictors.size();
39 std::vector<ioda::ObsVector> predData(npreds, ioda::ObsVector(
odb_));
40 for (std::size_t p = 0; p < npreds; ++p) {
41 predictors[p]->compute(
odb_, geovals, ydiags, predData[p]);
42 predData[p].save(predictors[p]->name() +
"Predictor");
45 const oops::Variables &correctedVars = biascoeffs.
correctedVars();
48 ASSERT(correctedVars.channels().empty() ||
49 correctedVars.variables().size() == correctedVars.channels().size());
51 const std::size_t
nlocs = ybias.nlocs();
52 const std::size_t nvars = ybias.nvars();
67 std::vector<double> biasTerm(
nlocs);
69 for (std::size_t jvar = 0; jvar < nvars; ++jvar) {
70 std::string predictorSuffix;
71 if (correctedVars.channels().empty())
72 predictorSuffix = correctedVars[jvar];
74 predictorSuffix = std::to_string(correctedVars.channels()[jvar]);
76 for (std::size_t jp = 0; jp < npreds; ++jp) {
78 const double beta = biascoeffs(jp, jvar);
79 for (std::size_t jl = 0; jl <
nlocs; ++jl) {
80 if (predData[jp][jl*nvars+jvar] !=
missing) {
81 biasTerm[jl] = predData[jp][jl*nvars+jvar] * beta;
82 ybias[jl*nvars+jvar] += biasTerm[jl];
86 const std::string varname = predictors[jp]->name() +
"_" + predictorSuffix;
87 if (ydiags.
has(varname)) {
88 ydiags.
allocate(1, oops::Variables({varname}));
89 ydiags.
save(biasTerm, varname, 0);
91 oops::Log::error() << varname <<
" is not reserved in ydiags !" << std::endl;
92 ABORT(
"ObsBiasOperatorTerm variable is not reserved in ydiags");
97 oops::Log::trace() <<
"ObsBiasOperator::computeObsBiasOperator done." << std::endl;
103 os <<
"ObsBiasOperator: linear combination of the predictors." << std::endl;
GeoVaLs: geophysical values at locations.
const oops::Variables & correctedVars() const
Return the list of bias-corrected variables.
const Predictors & predictors() const
Return a reference to the vector of all (static and variable) predictors.
void print(std::ostream &) const override
Print details (used for logging)
void computeObsBias(const GeoVaLs &, ioda::ObsVector &, const ObsBias &, ObsDiagnostics &) const
Compute bias correction.
ObsBiasOperator(ioda::ObsSpace &)
ioda::ObsSpace & odb_
ObsSpace used for computing predictors.
void allocate(const int nlev, const oops::Variables &vars)
Allocate diagnostics for variables vars with nlev number of levels.
bool has(const std::string &var) const
void save(const std::vector< double > &, const std::string &, const int)
integer function nlocs(this)
Return the number of observational locations in this Locations object.
std::vector< std::shared_ptr< PredictorBase > > Predictors