13 #include "eckit/mpi/Comm.h"
15 #include "ioda/ObsSpace.h"
16 #include "ioda/ObsVector.h"
18 #include "oops/util/IntSetParser.h"
19 #include "oops/util/Logger.h"
20 #include "oops/util/missingValues.h"
29 : predbases_(0), jobs_(0), odb_(odb), conf_(
conf) {
30 oops::Log::trace() <<
"ObsBiasIncrement::create starting." << std::endl;
33 if (
conf_.has(
"obs bias.jobs")) {
34 const std::set<int> jobs = oops::parseIntSet(
conf_.getString(
"obs bias.jobs"));
35 jobs_.assign(jobs.begin(), jobs.end());
39 if (
conf_.has(
"obs bias.predictors")) {
40 std::vector<eckit::LocalConfiguration> confs;
41 conf_.get(
"obs bias.predictors", confs);
42 typedef std::unique_ptr<PredictorBase> predictor;
43 for (std::size_t j = 0; j < confs.size(); ++j) {
53 oops::Log::trace() <<
"ObsBiasIncrement::create done." << std::endl;
59 : odb_(other.odb_), conf_(other.conf_), predbases_(other.predbases_),
60 prednames_(other.prednames_), jobs_(other.jobs_) {
61 oops::Log::trace() <<
"ObsBiasIncrement::copy ctor starting" << std::endl;
70 oops::Log::trace() <<
"ObsBiasIncrement::copy ctor done." << std::endl;
76 const eckit::Configuration &
conf)
77 : odb_(other.odb_), conf_(
conf), predbases_(), prednames_(), jobs_() {
78 oops::Log::trace() <<
"ObsBiasIncrement::copy ctor starting." << std::endl;
80 if (
conf_.has(
"obs bias.jobs")) {
81 const std::set<int> jobs = oops::parseIntSet(
conf_.getString(
"obs bias.jobs"));
82 jobs_.assign(jobs.begin(), jobs.end());
86 if (
conf_.has(
"obs bias.predictors")) {
87 std::vector<eckit::LocalConfiguration> confs;
88 conf_.get(
"obs bias.predictors", confs);
89 typedef std::unique_ptr<PredictorBase> predictor;
90 for (std::size_t j = 0; j < confs.size(); ++j) {
103 oops::Log::trace() <<
"ObsBiasIncrement::copy ctor done." << std::endl;
189 const std::vector<ioda::ObsVector> & predData,
190 ioda::ObsVector & ybiasinc)
const {
191 oops::Log::trace() <<
"ObsBiasIncrement::computeObsBiasTL starts." << std::endl;
194 const std::size_t nlocs = ybiasinc.nlocs();
196 const std::size_t njobs =
jobs_.size();
199 ASSERT(predData.size() == npreds);
200 ASSERT(ybiasinc.nvars() == njobs);
228 Eigen::Map<const Eigen::MatrixXd> coeffs(
biascoeffsinc_.data(), npreds, njobs);
231 for (std::size_t jch = 0; jch < njobs; ++jch) {
232 for (std::size_t jp = 0; jp < npreds; ++jp) {
233 const double beta = coeffs(jp, jch);
235 for (std::size_t jl = 0; jl < nlocs; ++jl) {
236 ybiasinc[jl*njobs+jch] += predData[jp][jl*njobs+jch] * beta;
242 oops::Log::trace() <<
"ObsBiasIncrement::computeObsBiasTL done." << std::endl;
248 const std::vector<ioda::ObsVector> & predData,
249 const ioda::ObsVector & ybiasinc) {
250 oops::Log::trace() <<
"ObsBiasIncrement::computeObsBiasAD starts." << std::endl;
253 const std::size_t nlocs = ybiasinc.nlocs();
255 const std::size_t njobs =
jobs_.size();
258 ASSERT(predData.size() == npreds);
259 ASSERT(ybiasinc.nvars() == njobs);
262 Eigen::Map<Eigen::MatrixXd> coeffs(
biascoeffsinc_.data(), npreds, njobs);
265 Eigen::VectorXd tmp = Eigen::VectorXd::Zero(nlocs, 1);
266 for (std::size_t jch = 0; jch < njobs; ++jch) {
267 for (std::size_t jl = 0; jl < nlocs; ++jl) {
269 if (ybiasinc[indx] != util::missingValue(ybiasinc[indx])) {
270 tmp(jl) = ybiasinc[indx];
274 for (std::size_t jp = 0; jp < npreds; ++jp) {
275 for (std::size_t jl = 0; jl < nlocs; ++jl) {
276 coeffs(jp, jch) += predData[jp][jl*njobs+jch] * tmp(jl);
281 tmp.setConstant(0.0);
288 oops::Log::trace() <<
"ObsBiasIncrement::computeAD done." << std::endl;
296 Eigen::Map<const Eigen::MatrixXd>
299 os <<
"ObsBiasIncrement::print " << std::endl;
300 os <<
"---------------------------------------------------------------" << std::endl;
301 auto njobs =
jobs_.size();
302 for (std::size_t p = 0; p <
prednames_.size(); ++p) {
303 os << std::fixed << std::setw(20) <<
prednames_[p]
304 <<
": Min= " << std::setw(15) << std::setprecision(8)
305 << coeffs.row(p).minCoeff()
306 <<
", Max= " << std::setw(15) << std::setprecision(8)
307 << coeffs.row(p).maxCoeff()
308 <<
", Norm= " << std::setw(15) << std::setprecision(8)
309 << coeffs.row(p).norm()
312 os <<
"---------------------------------------------------------------" << std::endl;
313 os <<
"ObsBiasIncrement::print done" << std::endl;