FV3-JEDI
LinearGetValues.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2020 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 namespace fv3jedi {
11 
12 // -------------------------------------------------------------------------------------------------
13 
14 LinearGetValues::LinearGetValues(const Geometry & geom, const ufo::Locations & locs) : locs_(locs),
15  geom_(new Geometry(geom)), linearmodel2geovals_(), model2geovals_() {
16  oops::Log::trace() << "LinearGetValues::LinearGetValues starting" << std::endl;
17 
18  // Create the variable change object
19  {
20  util::Timer timervc(classname(), "VarChaModel2GeoVaLs");
21  char sep = '.';
22  eckit::LocalConfiguration dummyconfig(sep);
23  model2geovals_.reset(new VarChaModel2GeoVaLs(geom, dummyconfig));
24  }
25 
26  // Call GetValues consructor
27  {
28  util::Timer timergv(classname(), "LinearGetValues");
30  }
31  oops::Log::trace() << "LinearGetValues::LinearGetValues done" << std::endl;
32 }
33 
34 // -------------------------------------------------------------------------------------------------
35 
37  oops::Log::trace() << "LinearGetValues::~LinearGetValues starting" << std::endl;
38 
39  {
40  util::Timer timergv(classname(), "~GetValues");
42  }
43 
44  {
45  util::Timer timervc(classname(), "~LinVarChaModel2GeoVaLs");
46  for (lvcIter jlvc = linearmodel2geovals_.begin(); jlvc != linearmodel2geovals_.end(); ++jlvc) {
47  delete jlvc->second;
48  }
49  }
50 
51  oops::Log::trace() << "LinearGetValues::~LinearGetValues done" << std::endl;
52 }
53 
54 // -------------------------------------------------------------------------------------------------
55 
56 const LinVarChaModel2GeoVaLs * LinearGetValues::getLinVarCha(const util::DateTime & t1) const {
57  lvcIterCnst jlvc = linearmodel2geovals_.find(t1);
58  if (jlvc == linearmodel2geovals_.end()) {
59  oops::Log::error() << "LinearGetValues.getLinVarCha: linear variable change not available " <<
60  "at time " << t1 << std::endl;
61  ABORT("LinearGetValues.getLinVarCha: linear variable change not available");
62  }
63  return jlvc->second;
64 }
65 
66 // -------------------------------------------------------------------------------------------------
67 
68 void LinearGetValues::setTrajectory(const State & state, const util::DateTime & t1,
69  const util::DateTime & t2, ufo::GeoVaLs & geovals) {
70  oops::Log::trace() << "LinearGetValues::setTrajectory starting" << std::endl;
71 
72  // Create state with geovals variables
73  State stategeovalvars(*geom_, geovals.getVars(), state.validTime());
74  model2geovals_->changeVar(state, stategeovalvars);
75 
76  // Create the linear variable change object
77  {
78  util::Timer timervc(classname(), "LinearVarChaModel2GeoVaLs");
79  ASSERT(linearmodel2geovals_.find(t1) == linearmodel2geovals_.end());
80  char sep = '.';
81  eckit::LocalConfiguration dummyconfig(sep);
82  LinVarChaModel2GeoVaLs * linearmodel2geovals = new LinVarChaModel2GeoVaLs(state, state, *geom_,
83  dummyconfig);
84  linearmodel2geovals_[t1] = linearmodel2geovals;
85  }
86 
87  const util::DateTime * t1p = &t1;
88  const util::DateTime * t2p = &t2;
89 
90  {
91  util::Timer timergv(classname(), "SetTrajectory");
93  stategeovalvars.toFortran(), &t1p, &t2p,
94  locs_.toFortran(), geovals.toFortran());
95  }
96  oops::Log::trace() << "LinearGetValues::setTrajectory done" << std::endl;
97 }
98 
99 // -------------------------------------------------------------------------------------------------
100 
101 void LinearGetValues::fillGeoVaLsTL(const Increment & inc, const util::DateTime & t1,
102  const util::DateTime & t2, ufo::GeoVaLs & geovals) const {
103  oops::Log::trace() << "LinearGetValues::fillGeovalsTL starting" << std::endl;
104 
105  // Create increment with geovals variables
106  Increment incgeovalvars(*geom_, geovals.getVars(), inc.validTime());
107 
108  {
109  util::Timer timervc(classname(), "multiply");
110  const LinVarChaModel2GeoVaLs * linearmodel2geovals = this->getLinVarCha(t1);
111  linearmodel2geovals->multiply(inc, incgeovalvars);
112  }
113 
114  const util::DateTime * t1p = &t1;
115  const util::DateTime * t2p = &t2;
116  {
117  util::Timer timergv(classname(), "fillGeoVaLsTL");
119  incgeovalvars.toFortran(), &t1p, &t2p,
120  locs_.toFortran(), geovals.toFortran());
121  }
122  oops::Log::trace() << "LinearGetValues::fillGeovalsTL done" << std::endl;
123 }
124 
125 // -------------------------------------------------------------------------------------------------
126 
127 void LinearGetValues::fillGeoVaLsAD(Increment & inc, const util::DateTime & t1,
128  const util::DateTime & t2, const ufo::GeoVaLs & geovals) const {
129  oops::Log::trace() << "LinearGetValues::fillGeovalsAD starting" << std::endl;
130 
131  // Create increment with geovals variables
132  Increment incgeovalvars(*geom_, geovals.getVars(), inc.validTime());
133 
134  const util::DateTime * t1p = &t1;
135  const util::DateTime * t2p = &t2;
136  {
137  util::Timer timergv(classname(), "fillGeoVaLsAD");
139  incgeovalvars.toFortran(), &t1p, &t2p,
140  locs_.toFortran(), geovals.toFortran());
141  }
142 
143  // Change variables
144  {
145  util::Timer timervc(classname(), "multiplyAD");
146  const LinVarChaModel2GeoVaLs * linearmodel2geovals = this->getLinVarCha(t1);
147  linearmodel2geovals->multiplyAD(incgeovalvars, inc);
148  }
149 
150  oops::Log::trace() << "LinearGetValues::fillGeovalsAD done" << std::endl;
151 }
152 
153 // -------------------------------------------------------------------------------------------------
154 
155 void LinearGetValues::print(std::ostream & os) const {
156  os << " LinearGetValues for fv3-jedi" << std::endl;
157 }
158 
159 // -------------------------------------------------------------------------------------------------
160 
161 } // namespace fv3jedi
fv3jedi::Increment::toFortran
int & toFortran()
Definition: Increment.h:110
fv3jedi::LinearGetValues::fillGeoVaLsTL
void fillGeoVaLsTL(const Increment &inc, const util::DateTime &t1, const util::DateTime &t2, ufo::GeoVaLs &geovals) const
Definition: LinearGetValues.cc:101
fv3jedi::LinVarChaModel2GeoVaLs::multiplyAD
void multiplyAD(const Increment &, Increment &) const
Definition: LinVarChaModel2GeoVaLs.cc:63
fv3jedi::LinearGetValues::setTrajectory
void setTrajectory(const State &state, const util::DateTime &t1, const util::DateTime &t2, ufo::GeoVaLs &geovals)
Definition: LinearGetValues.cc:68
fv3jedi::fv3jedi_lineargetvalues_fill_geovals_tl_f90
void fv3jedi_lineargetvalues_fill_geovals_tl_f90(const F90lineargetvalues &, const F90geom &, const F90inc &, const util::DateTime **, const util::DateTime **, const F90locs &, const F90goms &)
fv3jedi::LinearGetValues::LinearGetValues
LinearGetValues(const Geometry &, const ufo::Locations &)
Definition: LinearGetValues.cc:14
fv3jedi::LinearGetValues::print
void print(std::ostream &) const
Definition: LinearGetValues.cc:155
fv3jedi::LinearGetValues::geom_
std::shared_ptr< const Geometry > geom_
Definition: LinearGetValues.h:71
fv3jedi::Geometry::toFortran
F90geom & toFortran()
Definition: Geometry.h:53
fv3jedi::LinearGetValues::getLinVarCha
const LinVarChaModel2GeoVaLs * getLinVarCha(const util::DateTime &) const
Definition: LinearGetValues.cc:56
fv3jedi::LinVarChaModel2GeoVaLs::multiply
void multiply(const Increment &, Increment &) const
Definition: LinVarChaModel2GeoVaLs.cc:48
fv3jedi::LinearGetValues::classname
static const std::string classname()
Definition: LinearGetValues.h:50
fv3jedi::fv3jedi_lineargetvalues_fill_geovals_ad_f90
void fv3jedi_lineargetvalues_fill_geovals_ad_f90(const F90lineargetvalues &, const F90geom &, const F90inc &, const util::DateTime **, const util::DateTime **, const F90locs &, const F90goms &)
fv3jedi::State::toFortran
int & toFortran()
Definition: State.h:87
fv3jedi::fv3jedi_lineargetvalues_create_f90
void fv3jedi_lineargetvalues_create_f90(F90lineargetvalues &, const F90geom &, const F90locs &)
fv3jedi::State::validTime
const util::DateTime & validTime() const
Definition: State.h:83
fv3jedi::Increment::validTime
const util::DateTime & validTime() const
Definition: Increment.h:107
fv3jedi::Geometry
Geometry handles geometry for FV3JEDI model.
Definition: Geometry.h:41
fv3jedi::fv3jedi_lineargetvalues_set_trajectory_f90
void fv3jedi_lineargetvalues_set_trajectory_f90(const F90lineargetvalues &, const F90geom &, const F90state &, const util::DateTime **, const util::DateTime **, const F90locs &, const F90goms &)
fv3jedi::fv3jedi_lineargetvalues_delete_f90
void fv3jedi_lineargetvalues_delete_f90(F90lineargetvalues &)
fv3jedi::Increment
Definition: Increment.h:52
fv3jedi::State
Definition: State.h:45
fv3jedi::LinearGetValues::lvcIterCnst
std::map< util::DateTime, LinVarChaModel2GeoVaLs * >::const_iterator lvcIterCnst
Definition: LinearGetValues.h:66
fv3jedi::LinearGetValues::keyLinearGetValues_
F90lineargetvalues keyLinearGetValues_
Definition: LinearGetValues.h:69
LinearGetValues.h
fv3jedi::LinearGetValues::model2geovals_
std::unique_ptr< VarChaModel2GeoVaLs > model2geovals_
Definition: LinearGetValues.h:73
fv3jedi::LinearGetValues::lvcIter
std::map< util::DateTime, LinVarChaModel2GeoVaLs * >::iterator lvcIter
Definition: LinearGetValues.h:65
fv3jedi
Configuration files should be formatted as e.g.
Definition: ErrorCovariance.cc:20
fv3jedi::VarChaModel2GeoVaLs
Definition: VarChaModel2GeoVaLs.h:24
fv3jedi::LinearGetValues::~LinearGetValues
virtual ~LinearGetValues()
Definition: LinearGetValues.cc:36
fv3jedi::LinVarChaModel2GeoVaLs
Definition: LinVarChaModel2GeoVaLs.h:34
fv3jedi::LinearGetValues::fillGeoVaLsAD
void fillGeoVaLsAD(Increment &inc, const util::DateTime &t1, const util::DateTime &t2, const ufo::GeoVaLs &geovals) const
Definition: LinearGetValues.cc:127
fv3jedi::LinearGetValues::linearmodel2geovals_
std::map< util::DateTime, LinVarChaModel2GeoVaLs * > linearmodel2geovals_
Definition: LinearGetValues.h:72
fv3jedi::LinearGetValues::locs_
ufo::Locations locs_
Definition: LinearGetValues.h:70