UFO
LinearObsOperator.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2018 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 
9 
10 #include <vector>
11 
12 #include "ioda/ObsVector.h"
14 #include "ufo/Locations.h"
15 #include "ufo/ObsBias.h"
16 #include "ufo/ObsBiasIncrement.h"
17 #include "ufo/ObsDiagnostics.h"
18 
19 namespace ufo {
20 
21 // -----------------------------------------------------------------------------
22 
23 LinearObsOperator::LinearObsOperator(ioda::ObsSpace & os, const Parameters_ & params)
24  : oper_(LinearObsOperatorFactory::create(os, params.operatorParameters)), odb_(os)
25 {
26  // We use += rather than = to make sure the Variables objects contain no duplicate entries
27  // and the variables are sorted alphabetically.
28  oops::Variables operatorVars;
29  operatorVars += oper_->simulatedVars();
30  oops::Variables obsSpaceVars;
31  obsSpaceVars += os.obsvariables();
32  if (!(operatorVars == obsSpaceVars))
33  throw eckit::UserError("The list of variables simulated by the obs operator differs from "
34  "the list of simulated variables in the obs space",
35  Here());
36 }
37 
38 // -----------------------------------------------------------------------------
39 
40 void LinearObsOperator::setTrajectory(const GeoVaLs & gvals, const ObsBias & bias) {
41  oops::Variables vars;
42  vars += bias.requiredHdiagnostics();
43  std::vector<float> lons(odb_.nlocs());
44  std::vector<float> lats(odb_.nlocs());
45  std::vector<util::DateTime> times(odb_.nlocs());
46  odb_.get_db("MetaData", "latitude", lats);
47  odb_.get_db("MetaData", "longitude", lons);
48  odb_.get_db("MetaData", "datetime", times);
49  ObsDiagnostics ydiags(odb_, Locations(lons, lats, times, odb_.distribution()), vars);
50  oper_->setTrajectory(gvals, ydiags);
51  if (bias) {
53  biasoper_->setTrajectory(gvals, bias, ydiags);
54  }
55 }
56 
57 // -----------------------------------------------------------------------------
58 
59 void LinearObsOperator::simulateObsTL(const GeoVaLs & gvals, ioda::ObsVector & yy,
60  const ObsBiasIncrement & bias) const {
61  oper_->simulateObsTL(gvals, yy);
62  if (bias) {
63  ioda::ObsVector ybiasinc(odb_);
64  biasoper_->computeObsBiasTL(gvals, bias, ybiasinc);
65  yy += ybiasinc;
66  }
67 }
68 
69 // -----------------------------------------------------------------------------
70 
71 void LinearObsOperator::simulateObsAD(GeoVaLs & gvals, const ioda::ObsVector & yy,
72  ObsBiasIncrement & bias) const {
73  oper_->simulateObsAD(gvals, yy);
74  if (bias) {
75  ioda::ObsVector ybiasinc(yy);
76  biasoper_->computeObsBiasAD(gvals, bias, ybiasinc);
77  }
78 }
79 
80 // -----------------------------------------------------------------------------
81 
82 const oops::Variables & LinearObsOperator::requiredVars() const {
83  return oper_->requiredVars();
84 }
85 
86 // -----------------------------------------------------------------------------
87 
88 void LinearObsOperator::print(std::ostream & os) const {
89  os << *oper_;
90 }
91 
92 // -----------------------------------------------------------------------------
93 
94 } // namespace ufo
GeoVaLs: geophysical values at locations.
Tangent linear and adjoint of the linear combination bias correction operator.
Linear obs operator factory.
void print(std::ostream &) const
void setTrajectory(const GeoVaLs &, const ObsBias &)
Obs Operator.
std::unique_ptr< LinearObsOperatorBase > oper_
const oops::Variables & requiredVars() const
Operator input required from Model.
void simulateObsTL(const GeoVaLs &, ioda::ObsVector &, const ObsBiasIncrement &) const
void simulateObsAD(GeoVaLs &, const ioda::ObsVector &, ObsBiasIncrement &) const
LinearObsOperator(ioda::ObsSpace &, const Parameters_ &)
std::unique_ptr< LinearObsBiasOperator > biasoper_
Contains a polymorphic parameter holding an instance of a subclass of ObsOperatorParametersBase.
Locations class to handle simple lat-lon-time locations.
const oops::Variables & requiredHdiagnostics() const
Contains increments to bias correction coefficients.
Definition: RunCRTM.h:27