OOPS
Observer.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 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 #ifndef OOPS_BASE_OBSERVER_H_
9 #define OOPS_BASE_OBSERVER_H_
10 
11 #include <memory>
12 #include <string>
13 #include <vector>
14 
15 #include "oops/base/ObsFilters.h"
16 #include "oops/base/Variables.h"
17 #include "oops/interface/GeoVaLs.h"
25 #include "oops/interface/State.h"
26 #include "oops/util/DateTime.h"
27 #include "oops/util/Duration.h"
28 #include "oops/util/Logger.h"
29 #include "oops/util/Printable.h"
30 
31 namespace oops {
32 
33 /// Computes observation equivalent for a single ObsType
34 
35 
36 // -----------------------------------------------------------------------------
37 
38 template <typename MODEL, typename OBS>
39 class Observer : public util::Printable {
49  template <typename DATA> using ObsDataPtr_ = std::shared_ptr<ObsDataVector<OBS, DATA> >;
50 
51  public:
52  Observer(const eckit::Configuration &, const ObsSpace_ &, const ObsAuxCtrl_ &,
55  ~Observer();
56 
57  void doInitialize(const State_ &, const util::DateTime &, const util::DateTime &);
58  void doProcessing(const State_ &, const util::DateTime &, const util::DateTime &);
59  void doFinalize();
60 
61  private:
62  void print(std::ostream &) const override;
63 
64 // Obs operator
66 
67 // Data
68  const ObsSpace_ & obsdb_;
71 
73  Variables geovars_; // Variables needed from model (through geovals)
74  std::unique_ptr<GetValues_> getvals_;
75  std::shared_ptr<GeoVaLs_> gvals_;
76 };
77 
78 // -----------------------------------------------------------------------------
79 
80 template <typename MODEL, typename OBS>
81 Observer<MODEL, OBS>::Observer(const eckit::Configuration & conf, const ObsSpace_ & obsdb,
82  const ObsAuxCtrl_ & ybias, ObsVector_ & yobs,
83  ObsDataPtr_<int> qcflags, ObsDataPtr_<float> obserr)
84  : hop_(obsdb, eckit::LocalConfiguration(conf, "obs operator")),
85  obsdb_(obsdb), yobs_(yobs), ybias_(ybias), filters_(obsdb, conf, qcflags, obserr)
86 {
87  Log::trace() << "Observer::Observer starting" << std::endl;
91  Log::trace() << "Observer::Observer done" << std::endl;
92 }
93 
94 // -----------------------------------------------------------------------------
95 
96 template <typename MODEL, typename OBS>
98  Log::trace() << "Observer::~Observer starting" << std::endl;
99  gvals_.reset();
100  Log::trace() << "Observer::~Observer done" << std::endl;
101 }
102 
103 // -----------------------------------------------------------------------------
104 
105 template <typename MODEL, typename OBS>
107  const util::DateTime & begin,
108  const util::DateTime & end) {
109  Log::trace() << "Observer::doInitialize start" << std::endl;
110  filters_.preProcess();
111  getvals_.reset(new GetValues_(xx.geometry(), hop_.locations(begin, end)));
112  gvals_.reset(new GeoVaLs_(hop_.locations(begin, end), geovars_));
113  Log::trace() << "Observer::doInitialize done" << std::endl;
114 }
115 
116 // -----------------------------------------------------------------------------
117 
118 template <typename MODEL, typename OBS>
120  const util::DateTime & t1,
121  const util::DateTime & t2) {
122  Log::trace() << "Observer::doProcessing start" << std::endl;
123 // Get state variables at obs locations
124  getvals_->fillGeoVaLs(xx, t1, t2, *gvals_);
125  Log::trace() << "Observer::doProcessing done" << std::endl;
126 }
127 
128 // -----------------------------------------------------------------------------
129 
130 template <typename MODEL, typename OBS>
132  Log::trace() << "Observer::doFinalize start" << std::endl;
133  filters_.priorFilter(*gvals_);
134  oops::Variables vars;
135  vars += filters_.requiredHdiagnostics();
136  vars += ybias_.requiredHdiagnostics();
137  ObsDiags_ ydiags(obsdb_, hop_.locations(obsdb_.windowStart(), obsdb_.windowEnd()), vars);
138  hop_.simulateObs(*gvals_, yobs_, ybias_, ydiags);
139  filters_.postFilter(yobs_, ydiags);
140  Log::trace() << "Observer::doFinalize done" << std::endl;
141 }
142 
143 // -----------------------------------------------------------------------------
144 
145 template <typename MODEL, typename OBS>
146 void Observer<MODEL, OBS>::print(std::ostream &) const {}
147 
148 // -----------------------------------------------------------------------------
149 
150 } // namespace oops
151 
152 #endif // OOPS_BASE_OBSERVER_H_
oops::Observer::doFinalize
void doFinalize()
Definition: Observer.h:131
oops::Observer::Observer
Observer(const eckit::Configuration &, const ObsSpace_ &, const ObsAuxCtrl_ &, ObsVector_ &, ObsDataPtr_< int > qcflags=ObsDataPtr_< int >(), ObsDataPtr_< float > obserr=ObsDataPtr_< float >())
Definition: Observer.h:81
oops::Observer::geovars_
Variables geovars_
Definition: Observer.h:73
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
oops::Observer::ObsSpace_
ObsSpace< OBS > ObsSpace_
Definition: Observer.h:42
ObsAuxControl.h
GetValues.h
oops::ObsSpace
Definition: oops/interface/ObsSpace.h:42
oops::Observer::ObsDataPtr_
std::shared_ptr< ObsDataVector< OBS, DATA > > ObsDataPtr_
Definition: Observer.h:49
oops::ObsAuxControl::requiredVars
const Variables & requiredVars() const
Other.
Definition: oops/interface/ObsAuxControl.h:133
oops::Observer::hop_
ObsOperator_ hop_
Definition: Observer.h:65
ObsOperator.h
oops::GetValues
Gets values from model State to observation locations (fills GeoVaLs)
Definition: oops/interface/GetValues.h:32
oops::Observer::ObsVector_
ObsVector< OBS > ObsVector_
Definition: Observer.h:47
oops::Observer::ObsFilters_
ObsFilters< OBS > ObsFilters_
Definition: Observer.h:45
oops::ObsAuxControl
Definition: oops/interface/ObsAuxControl.h:35
oops::ObsVector
Definition: oops/interface/ObsSpace.h:36
oops::Observer::yobs_
ObsVector_ & yobs_
Definition: Observer.h:69
ObsDiagnostics.h
eckit
Definition: FieldL95.h:22
oops::ObsFilters
Holds observation filters (usually QC) for one observation type.
Definition: ObsFilters.h:36
oops::ObsOperator
Definition: oops/interface/ObsOperator.h:38
oops::Observer::ObsAuxCtrl_
ObsAuxControl< OBS > ObsAuxCtrl_
Definition: Observer.h:44
oops::Observer::obsdb_
const ObsSpace_ & obsdb_
Definition: Observer.h:68
ObsFilters.h
oops::Observer::ObsOperator_
ObsOperator< OBS > ObsOperator_
Definition: Observer.h:46
ObsSpace.h
oops::Observer::doInitialize
void doInitialize(const State_ &, const util::DateTime &, const util::DateTime &)
Definition: Observer.h:106
oops::ObsDiagnostics
Definition: ObsDiagnostics.h:33
oops::Observer::ObsDiags_
ObsDiagnostics< OBS > ObsDiags_
Definition: Observer.h:41
oops::Observer::gvals_
std::shared_ptr< GeoVaLs_ > gvals_
Definition: Observer.h:75
oops::ObsFilters::requiredVars
Variables requiredVars() const
Definition: ObsFilters.h:56
oops::Observer::State_
State< MODEL > State_
Definition: Observer.h:48
oops::Observer::doProcessing
void doProcessing(const State_ &, const util::DateTime &, const util::DateTime &)
Definition: Observer.h:119
oops::State::geometry
Geometry_ geometry() const
Definition: oops/interface/State.h:215
oops::Observer::filters_
ObsFilters_ filters_
Definition: Observer.h:72
oops::Observer
Computes observation equivalent for a single ObsType.
Definition: Observer.h:39
oops::Observer::GeoVaLs_
GeoVaLs< OBS > GeoVaLs_
Definition: Observer.h:40
oops::ObsOperator::requiredVars
const Variables & requiredVars() const
Other.
Definition: oops/interface/ObsOperator.h:103
oops::State
Encapsulates the model state.
Definition: CostJbState.h:28
oops::Observer::ybias_
const ObsAuxCtrl_ & ybias_
Definition: Observer.h:70
State.h
oops::Variables
Definition: oops/base/Variables.h:23
oops::Observer::GetValues_
GetValues< MODEL, OBS > GetValues_
Definition: Observer.h:43
oops::Observer::~Observer
~Observer()
Definition: Observer.h:97
ObsVector.h
GeoVaLs.h
oops::Observer::print
void print(std::ostream &) const override
Definition: Observer.h:146
ObsDataVector.h
oops::GeoVaLs
Definition: oops/interface/GeoVaLs.h:32
oops::Observer::getvals_
std::unique_ptr< GetValues_ > getvals_
Definition: Observer.h:74
Variables.h