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, eckit::LocalConfiguration(config, "obs operator"))),
38  odb_(odb), timeWeights_(timeWeightCreate(odb, config))
39 {
40  oops::Log::trace() << "ObsTimeOper creating" << std::endl;
41 
42  util::DateTime windowBegin(odb_.windowStart());
43  util::DateTime windowEnd(odb_.windowEnd());
44 
45  util::Duration windowSub;
46  windowSub = util::Duration(config.getString("windowSub"));
47  util::Duration window = windowEnd - windowBegin;
48 
49  if (window == windowSub) {
50  ABORT("Time Interpolation of obs not implemented when assimilation window = subWindow");
51  }
52  oops::Log::trace() << "ObsTimeOper created" << std::endl;
53 }
54 
55 // -----------------------------------------------------------------------------
56 
58  oops::Log::trace() << "ObsTimeOper destructed" << std::endl;
59 }
60 
61 
62 // -----------------------------------------------------------------------------
63 
64 std::unique_ptr<Locations> ObsTimeOper::locations(const util::DateTime & t1,
65  const util::DateTime & t2) const {
66  oops::Log::trace() << "entered ObsOperatorTime::locations" << std::endl;
67 
68  util::DateTime t0, t3, stateTime;
69  util::Duration initial_dt, windowSub;
70 
71  util::DateTime windowBegin(odb_.windowStart());
72  util::DateTime windowEnd(odb_.windowEnd());
73 
74  initial_dt = t2 - t1;
75 
76  std::unique_ptr<Locations> locs;
77  std::unique_ptr<Locations> locs2;
78  if ((t1 == windowBegin) && (t2 == windowEnd)) {
79  oops::Log::debug() << "locs: full window to concatenate" << std::endl;
80  locs = std::unique_ptr<Locations>(new Locations(odb_, t1, t2));
81  *locs += *locs;
82  } else {
83 // define t0, t3, stateTime
84  if ((t1 == windowBegin) || (t2 == windowEnd))
85  windowSub = initial_dt * 2;
86  else
87  windowSub = initial_dt;
88 
89  t0 = t1 - (windowSub/2);
90  t3 = t2 + (windowSub/2);
91  stateTime = t1 + initial_dt/2;
92 
93  if (t1 == windowBegin) {
94  t0 = windowBegin;
95  stateTime = windowBegin;
96  }
97  if (t2 == windowEnd) {
98  t3 = windowEnd;
99  stateTime = windowEnd;
100  }
101 
102  if ((t1 == windowBegin) && (t2 != windowEnd)) {
103  oops::Log::debug() << "locs: locsObsAfterState only" << std::endl;
104  locs = std::unique_ptr<Locations>(new Locations(odb_, stateTime, t3));
105  } else if ((t1 != windowBegin) && (t2 == windowEnd)) {
106  oops::Log::debug() << " locs: locsObsBeforeState only " << std::endl;
107  locs = std::unique_ptr<Locations>(new Locations(odb_, stateTime, stateTime));
108  // the above locs is mainly empty except for self%max_indx = obsspace_get_gnlocs(obss)
109  locs2 = std::unique_ptr<Locations>(new Locations(odb_, t0, stateTime));
110  *locs += *locs2;
111  } else {
112  oops::Log::debug() << "locs: internal window concatenate" << std::endl;
113  locs = std::unique_ptr<Locations>(new Locations(odb_, stateTime, t3));
114  locs2 = std::unique_ptr<Locations>(new Locations(odb_, t0, stateTime));
115  *locs += *locs2;
116  }
117  }
118  // create concatenation of Locations class
119  return locs;
120 }
121 
122 
123 void ObsTimeOper::simulateObs(const GeoVaLs & gv, ioda::ObsVector & ovec,
124  ObsDiagnostics & ydiags) const {
125  oops::Log::trace() << "ObsTimeOper: simulateObs entered" << std::endl;
126 
127  oops::Log::trace() << gv << std::endl;
128 
129  GeoVaLs gv1(odb_.comm()), gv2(odb_.comm());
130  gv.split(gv1, gv2);
131 
132  oops::Log::trace() << gv1 << std::endl;
133  oops::Log::trace() << gv2 << std::endl;
134 
135  gv1 *= timeWeights_[0];
136  gv2 *= timeWeights_[1];
137  gv1 += gv2;
138  actualoperator_->simulateObs(gv1, ovec, ydiags);
139 
140  oops::Log::trace() << "ObsTimeOper: simulateObs exit " << std::endl;
141 }
142 
143 // -----------------------------------------------------------------------------
144 
145 void ObsTimeOper::print(std::ostream & os) const {
146  os << "ObsTimeOper::print not implemented";
147 }
148 
149 // -----------------------------------------------------------------------------
150 
151 } // namespace ufo
152 
153 
ufo::GeoVaLs::split
void split(GeoVaLs &, GeoVaLs &) const
Split two GeoVaLs.
Definition: GeoVaLs.cc:208
ufo::ObsTimeOper::locations
std::unique_ptr< Locations > locations(const util::DateTime &, const util::DateTime &) const override
Locations for GeoVaLs.
Definition: ObsTimeOper.cc:64
ufo_radiancerttov_utils_mod::debug
logical, public debug
Definition: ufo_radiancerttov_utils_mod.F90:100
ufo::Locations
Locations class to handle locations for UFO.
Definition: src/ufo/Locations.h:32
ufo::makerTimeOper_
static ObsOperatorMaker< ObsTimeOper > makerTimeOper_("TimeOperLinInterp")
ufo
Definition: RunCRTM.h:27
ufo::ObsTimeOper::actualoperator_
std::unique_ptr< ObsOperatorBase > actualoperator_
Definition: ObsTimeOper.h:62
ObsOperatorBase.h
ufo::ObsOperatorBase
Base class for observation operators.
Definition: ObsOperatorBase.h:37
ufo::timeWeightCreate
std::vector< std::vector< float > > timeWeightCreate(const ioda::ObsSpace &odb_, const eckit::Configuration &config)
Definition: ObsTimeOperUtil.cc:25
ufo::ObsTimeOper::odb_
const ioda::ObsSpace & odb_
Definition: ObsTimeOper.h:63
eckit
Forward declarations.
Definition: ObsAtmSfcInterp.h:20
ufo::ObsTimeOper::simulateObs
void simulateObs(const GeoVaLs &, ioda::ObsVector &, ObsDiagnostics &) const override
Obs Operator.
Definition: ObsTimeOper.cc:123
ufo::ObsDiagnostics
Definition: src/ufo/ObsDiagnostics.h:35
ufo::ObsOperatorFactory
Obs Operator Factory.
Definition: ObsOperatorBase.h:61
ufo::ObsTimeOper::ObsTimeOper
ObsTimeOper(const ioda::ObsSpace &, const eckit::Configuration &)
Definition: ObsTimeOper.cc:33
ufo::ObsOperatorMaker
Definition: ObsOperatorBase.h:78
ufo::GeoVaLs
GeoVaLs: geophysical values at locations.
Definition: src/ufo/GeoVaLs.h:39
ObsTimeOper.h
ufo::ObsTimeOper::~ObsTimeOper
virtual ~ObsTimeOper()
Definition: ObsTimeOper.cc:57
ufo::ObsTimeOper::print
void print(std::ostream &) const override
Definition: ObsTimeOper.cc:145
ufo::ObsTimeOper::timeWeights_
std::vector< std::vector< float > > timeWeights_
Definition: ObsTimeOper.h:64
ObsTimeOperUtil.h