UFO
ObsTimeOper.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 UK Met Office
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 <algorithm>
11 #include <ostream>
12 #include <vector>
13 
14 #include "ioda/ObsVector.h"
15 
16 #include "oops/base/Variables.h"
17 #include "oops/util/DateTime.h"
18 #include "oops/util/Duration.h"
19 #include "oops/util/Logger.h"
20 
21 #include "ufo/GeoVaLs.h"
22 #include "ufo/Locations.h"
23 #include "ufo/ObsDiagnostics.h"
24 #include "ufo/ObsOperatorBase.h"
26 
27 namespace ufo {
28 
29 // -----------------------------------------------------------------------------
30 static ObsOperatorMaker<ObsTimeOper> makerTimeOper_("TimeOperLinInterp");
31 // -----------------------------------------------------------------------------
32 
33 ObsTimeOper::ObsTimeOper(const ioda::ObsSpace & odb,
34  const eckit::Configuration & config)
35  : ObsOperatorBase(odb, config),
36  actualoperator_(ObsOperatorFactory::create(
37  odb,
38  oops::validateAndDeserialize<ObsOperatorParametersWrapper>(
39  eckit::LocalConfiguration(config, "obs operator")).operatorParameters)),
40  odb_(odb), timeWeights_(timeWeightCreate(odb, config))
41 {
42  oops::Log::trace() << "ObsTimeOper creating" << std::endl;
43 
44  util::DateTime windowBegin(odb_.windowStart());
45  util::DateTime windowEnd(odb_.windowEnd());
46 
47  util::Duration windowSub;
48  windowSub = util::Duration(config.getString("windowSub"));
49  util::Duration window = windowEnd - windowBegin;
50 
51  if (window == windowSub) {
52  ABORT("Time Interpolation of obs not implemented when assimilation window = subWindow");
53  }
54  oops::Log::trace() << "ObsTimeOper created" << std::endl;
55 }
56 
57 // -----------------------------------------------------------------------------
58 
60  oops::Log::trace() << "ObsTimeOper destructed" << std::endl;
61 }
62 
63 
64 // -----------------------------------------------------------------------------
65 
66 std::unique_ptr<Locations> ObsTimeOper::locations() const {
67  oops::Log::trace() << "entered ObsOperatorTime::locations" << std::endl;
68 
69  std::unique_ptr<Locations> locs = actualoperator_->locations();
70  // concatenate locations with itself (double the size)
71  *locs += *locs;
72 
73  return locs;
74 }
75 
76 // -----------------------------------------------------------------------------
77 
78 void ObsTimeOper::simulateObs(const GeoVaLs & gv, ioda::ObsVector & ovec,
79  ObsDiagnostics & ydiags) const {
80  oops::Log::trace() << "ObsTimeOper: simulateObs entered" << std::endl;
81 
82  oops::Log::trace() << gv << std::endl;
83 
84  GeoVaLs gv1(odb_.distribution(), gv.getVars());
85  GeoVaLs gv2(odb_.distribution(), gv.getVars());
86 
87  gv.split(gv1, gv2);
88 
89  oops::Log::trace() << gv1 << std::endl;
90  oops::Log::trace() << gv2 << std::endl;
91 
92  gv1 *= timeWeights_[0];
93  gv2 *= timeWeights_[1];
94  gv1 += gv2;
95  actualoperator_->simulateObs(gv1, ovec, ydiags);
96 
97  oops::Log::trace() << "ObsTimeOper: simulateObs exit " << std::endl;
98 }
99 
100 // -----------------------------------------------------------------------------
101 
102 void ObsTimeOper::print(std::ostream & os) const {
103  os << "ObsTimeOper::print not implemented";
104 }
105 
106 // -----------------------------------------------------------------------------
107 
108 } // namespace ufo
109 
110 
GeoVaLs: geophysical values at locations.
void split(GeoVaLs &, GeoVaLs &) const
Split two GeoVaLs.
Definition: GeoVaLs.cc:259
const oops::Variables & getVars() const
Obs Operator Factory.
Contains a polymorphic parameter holding an instance of a subclass of ObsOperatorParametersBase.
void print(std::ostream &) const override
Definition: ObsTimeOper.cc:102
ObsTimeOper(const ioda::ObsSpace &, const eckit::Configuration &)
Definition: ObsTimeOper.cc:33
void simulateObs(const GeoVaLs &, ioda::ObsVector &, ObsDiagnostics &) const override
Obs Operator.
Definition: ObsTimeOper.cc:78
std::unique_ptr< ObsOperatorBase > actualoperator_
Definition: ObsTimeOper.h:60
const ioda::ObsSpace & odb_
Definition: ObsTimeOper.h:61
virtual ~ObsTimeOper()
Definition: ObsTimeOper.cc:59
std::unique_ptr< Locations > locations() const override
Locations for GeoVaLs.
Definition: ObsTimeOper.cc:66
std::vector< std::vector< float > > timeWeights_
Definition: ObsTimeOper.h:62
Forward declarations.
Definition: ObsAodExt.h:21
Definition: RunCRTM.h:27
std::vector< std::vector< float > > timeWeightCreate(const ioda::ObsSpace &odb_, const eckit::Configuration &config)
static ObsOperatorMaker< ObsTimeOper > makerTimeOper_("TimeOperLinInterp")