UFO
LinearObsBiasOperator.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2021 UCAR
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
8 #include "ufo/LinearObsBiasOperator.h"
9 
10 #include <memory>
11 #include <vector>
12 
13 #include "ioda/ObsSpace.h"
14 #include "ioda/ObsVector.h"
15 
16 #include "oops/util/Logger.h"
17 #include "oops/util/missingValues.h"
18 
19 #include "ufo/ObsBias.h"
20 #include "ufo/ObsBiasIncrement.h"
21 
22 namespace ufo {
23 
24 // -----------------------------------------------------------------------------
25 
27  : odb_(odb) {
28  oops::Log::trace() << "LinearObsBiasOperator::create done." << std::endl;
29 }
30 
31 // -----------------------------------------------------------------------------
32 
33 void LinearObsBiasOperator::setTrajectory(const GeoVaLs & geovals, const ObsBias & bias,
34  ObsDiagnostics & ydiags) {
35  oops::Log::trace() << "LinearObsBiasOperator::setTrajectory starts." << std::endl;
36  const std::vector<std::shared_ptr<const PredictorBase>> variablePredictors =
37  bias.variablePredictors();
38  const std::size_t npreds = variablePredictors.size();
39 
40  predData_.resize(npreds, ioda::ObsVector(odb_));
41  for (std::size_t p = 0; p < npreds; ++p) {
42  variablePredictors[p]->compute(odb_, geovals, ydiags, predData_[p]);
43  }
44 
45  oops::Log::trace() << "LinearObsBiasOperator::setTrajectory done." << std::endl;
46 }
47 
48 // -----------------------------------------------------------------------------
49 
51  const ObsBiasIncrement & biascoeffinc,
52  ioda::ObsVector & ybiasinc) const {
53  oops::Log::trace() << "LinearObsBiasOperator::computeObsBiasTL starts." << std::endl;
54 
55  const size_t npreds = predData_.size();
56 
57  ybiasinc.zero();
58  for (size_t jpred = 0; jpred < npreds; ++jpred) {
59  ybiasinc.axpy(biascoeffinc.coefficients(jpred), predData_[jpred]);
60  }
61 
62  oops::Log::trace() << "LinearObsBiasOperator::computeObsBiasTL done." << std::endl;
63 }
64 
65 // -----------------------------------------------------------------------------
66 
68  ObsBiasIncrement & biascoeffinc,
69  const ioda::ObsVector & ybiasinc) const {
70  oops::Log::trace() << "LinearObsBiasOperator::computeObsBiasAD starts." << std::endl;
71 
72  const size_t npreds = predData_.size();
73 
74  for (std::size_t jpred = 0; jpred < npreds; ++jpred) {
75  biascoeffinc.updateCoeff(jpred, predData_[jpred].multivar_dot_product_with(ybiasinc));
76  }
77 
78  oops::Log::trace() << "LinearObsBiasOperator::computeAD done." << std::endl;
79 }
80 
81 // -----------------------------------------------------------------------------
82 
83 void LinearObsBiasOperator::print(std::ostream & os) const {
84  os << "TL/AD bias computed as linear combination of predictors.";
85 }
86 
87 // -----------------------------------------------------------------------------
88 
89 } // namespace ufo
GeoVaLs: geophysical values at locations.
void computeObsBiasTL(const GeoVaLs &, const ObsBiasIncrement &, ioda::ObsVector &) const
Compute TL of bias correction.
LinearObsBiasOperator(ioda::ObsSpace &)
std::vector< ioda::ObsVector > predData_
predictors values; set in setTrajectory
ioda::ObsSpace & odb_
ObsSpace used for this bias correction.
void computeObsBiasAD(GeoVaLs &, ObsBiasIncrement &, const ioda::ObsVector &) const
Compute adjoint of bias correction.
void print(std::ostream &) const override
Print used for logging.
void setTrajectory(const GeoVaLs &, const ObsBias &, ObsDiagnostics &)
Set trajectory (save predictors)
std::vector< std::shared_ptr< const PredictorBase > > variablePredictors() const
Return the vector of variable predictors.
Definition: ObsBias.cc:254
Contains increments to bias correction coefficients.
std::vector< double > coefficients(size_t jpred) const
Return bias coefficient increments for predictor with index jpred.
void updateCoeff(size_t jpred, const std::vector< double > &coeffs)
Definition: RunCRTM.h:27