UFO
ObsTimeOperTLAD.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/ObsSpace.h"
15 #include "ioda/ObsVector.h"
16 
17 #include "oops/base/Variables.h"
18 #include "oops/util/DateTime.h"
19 #include "oops/util/Duration.h"
20 #include "oops/util/Logger.h"
21 
22 #include "ufo/GeoVaLs.h"
23 #include "ufo/ObsBias.h"
24 #include "ufo/ObsBiasIncrement.h"
26 
27 namespace ufo {
28 
29 // -----------------------------------------------------------------------------
31 // -----------------------------------------------------------------------------
32 
33 ObsTimeOperTLAD::ObsTimeOperTLAD(const ioda::ObsSpace & odb,
34  const eckit::Configuration & config)
35  : actualoperator_(LinearObsOperatorFactory::create(
36  odb, eckit::LocalConfiguration(config, "obs operator"))),
37  odb_(odb), timeWeights_(timeWeightCreate(odb, config))
38 {
39  oops::Log::trace() << "ObsTimeOperTLAD created" << std::endl;
40 }
41 
42 // -----------------------------------------------------------------------------
43 
45  oops::Log::trace() << "ObsTimeOperTLAD destructed" << std::endl;
46 }
47 
48 // -----------------------------------------------------------------------------
49 
51  const ObsBias & bias,
52  ObsDiagnostics & ydiags) {
53  oops::Log::trace() << "ObsTimeOperTLAD::setTrajectory entering" << std::endl;
54 
55  oops::Log::debug() << "ObsTimeOperTLAD::setTrajectory input geovals "
56  << geovals << std::endl;
57 
58  GeoVaLs gv1(odb_.comm()), gv2(odb_.comm());
59  geovals.split(gv1, gv2);
60 
61  oops::Log::debug() << "ObsTimeOperTLAD::setTrajectory split geovals gv1 "
62  << gv1 << std::endl;
63 
64  oops::Log::debug() << "ObsTimeOperTLAD::setTrajectory split geovals gv2 "
65  << gv2 << std::endl;
66 
67  gv1 *= timeWeights_[0];
68  gv2 *= timeWeights_[1];
69  gv1 += gv2;
70 
71  oops::Log::debug() << "ObsTimeOperTLAD::setTrajectory final geovals gv1 "
72  << gv1 << std::endl;
73 
74  actualoperator_->setTrajectory(gv1, bias, ydiags);
75 
76  oops::Log::debug() << gv1;
77 
78  oops::Log::trace() << "ObsTimeOperTLAD::setTrajectory exiting" << std::endl;
79 }
80 
81 // -----------------------------------------------------------------------------
82 
83 void ObsTimeOperTLAD::simulateObsTL(const GeoVaLs & geovals, ioda::ObsVector & ovec) const {
84  oops::Log::trace() << "ObsTimeOperTLAD::simulateObsTL entering" << std::endl;
85 
86  oops::Log::debug() << "ObsTimeOperTLAD::setTrajectory input geovals "
87  << geovals << std::endl;
88 
89  GeoVaLs gv1(odb_.comm()), gv2(odb_.comm());
90  geovals.split(gv1, gv2);
91 
92  oops::Log::debug() << "ObsTimeOperTLAD::simulateObsTL split geovals gv1 "
93  << gv1 << std::endl;
94 
95  oops::Log::debug() << "ObsTimeOperTLAD::simulateObsTL split geovals gv2 "
96  << gv2 << std::endl;
97 
98  gv1 *= timeWeights_[0];
99  gv2 *= timeWeights_[1];
100  gv1 += gv2;
101 
102  oops::Log::debug() << "ObsTimeOperTLAD::simulateObsTL final geovals gv1 "
103  << gv1 << std::endl;
104 
105  actualoperator_->simulateObsTL(gv1, ovec);
106 
107  oops::Log::trace() << "ObsTimeOperTLAD::simulateObsTL exiting" << std::endl;
108 }
109 
110 // -----------------------------------------------------------------------------
111 
112 void ObsTimeOperTLAD::simulateObsAD(GeoVaLs & geovals, const ioda::ObsVector & ovec) const {
113  oops::Log::trace() << "ObsTimeOperTLAD::simulateObsAD entering" << std::endl;
114 
115  oops::Log::debug() << "ObsTimeOperTLAD::simulateObsAD input geovals "
116  << geovals << std::endl;
117 
118  GeoVaLs gv1(odb_.comm()), gv2(odb_.comm());
119  geovals.split(gv1, gv2);
120 
121  oops::Log::debug() << "ObsTimeOperTLAD::simulateObsAD split geovals gv1 "
122  << gv1 << std::endl;
123 
124  oops::Log::debug() << "ObsTimeOperTLAD::simulateObsAD split geovals gv2 "
125  << gv2 << std::endl;
126 
127  actualoperator_->simulateObsAD(gv1, ovec);
128 
129  gv2 = gv1;
130  gv1 *= timeWeights_[0];
131  gv2 *= timeWeights_[1];
132 
133  geovals.merge(gv1, gv2);
134 
135  oops::Log::debug() << "ObsTimeOperTLAD::simulateObsAD final geovals "
136  << geovals << std::endl;
137 
138  oops::Log::trace() << "ObsTimeOperTLAD::simulateObsAD exiting" << std::endl;
139 }
140 
141 // -----------------------------------------------------------------------------
142 
143 void ObsTimeOperTLAD::print(std::ostream & os) const {
144  os << "ObsTimeOperTLAD::print not implemented" << std::endl;
145 }
146 
147 // -----------------------------------------------------------------------------
148 
149 } // namespace ufo
ufo::GeoVaLs::split
void split(GeoVaLs &, GeoVaLs &) const
Split two GeoVaLs.
Definition: GeoVaLs.cc:208
ObsBiasIncrement.h
ObsBias.h
ufo::ObsTimeOperTLAD::~ObsTimeOperTLAD
virtual ~ObsTimeOperTLAD()
Definition: ObsTimeOperTLAD.cc:44
ufo_radiancerttov_utils_mod::debug
logical, public debug
Definition: ufo_radiancerttov_utils_mod.F90:100
ufo::makerTimeOperTL_
static LinearObsOperatorMaker< ObsTimeOperTLAD > makerTimeOperTL_("TimeOperLinInterp")
ufo::ObsTimeOperTLAD::simulateObsAD
void simulateObsAD(GeoVaLs &, const ioda::ObsVector &) const override
Definition: ObsTimeOperTLAD.cc:112
ufo::ObsTimeOperTLAD::ObsTimeOperTLAD
ObsTimeOperTLAD(const ioda::ObsSpace &, const eckit::Configuration &)
Definition: ObsTimeOperTLAD.cc:33
ufo
Definition: RunCRTM.h:27
ufo::ObsTimeOperTLAD::print
void print(std::ostream &) const override
Definition: ObsTimeOperTLAD.cc:143
ufo::ObsTimeOperTLAD::timeWeights_
std::vector< std::vector< float > > timeWeights_
Definition: ObsTimeOperTLAD.h:60
ufo::ObsBias
Class to handle observation bias parameters.
Definition: ObsBias.h:44
ufo::timeWeightCreate
std::vector< std::vector< float > > timeWeightCreate(const ioda::ObsSpace &odb_, const eckit::Configuration &config)
Definition: ObsTimeOperUtil.cc:25
eckit
Forward declarations.
Definition: ObsAtmSfcInterp.h:20
ufo::ObsDiagnostics
Definition: src/ufo/ObsDiagnostics.h:35
ufo::ObsTimeOperTLAD::odb_
const ioda::ObsSpace & odb_
Definition: ObsTimeOperTLAD.h:59
ufo::ObsTimeOperTLAD::simulateObsTL
void simulateObsTL(const GeoVaLs &, ioda::ObsVector &) const override
Definition: ObsTimeOperTLAD.cc:83
ufo::GeoVaLs
GeoVaLs: geophysical values at locations.
Definition: src/ufo/GeoVaLs.h:39
ufo::ObsTimeOperTLAD::setTrajectory
void setTrajectory(const GeoVaLs &, const ObsBias &, ObsDiagnostics &) override
Obs Operator.
Definition: ObsTimeOperTLAD.cc:50
ufo::LinearObsOperatorFactory
Obs Operator Factory.
Definition: LinearObsOperatorBase.h:55
ObsTimeOperUtil.h
ufo::GeoVaLs::merge
void merge(const GeoVaLs &, const GeoVaLs &)
Merge two GeoVaLs.
Definition: GeoVaLs.cc:216
ufo::ObsTimeOperTLAD::actualoperator_
std::unique_ptr< LinearObsOperatorBase > actualoperator_
Definition: ObsTimeOperTLAD.h:58
ObsTimeOperTLAD.h
ufo::LinearObsOperatorMaker
Definition: LinearObsOperatorBase.h:72