FV3-JEDI
Tlm.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2017-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 
8 #include <vector>
9 
10 #include "eckit/config/LocalConfiguration.h"
11 
12 #include "oops/util/abor1_cpp.h"
13 #include "oops/util/DateTime.h"
14 #include "oops/util/Logger.h"
15 
18 #include "fv3jedi/State/State.h"
19 #include "fv3jedi/Tlm/Tlm.h"
24 
25 namespace fv3jedi {
26 
27 // -------------------------------------------------------------------------------------------------
28 static oops::LinearModelMaker<Traits, Tlm> makerTLM_("FV3JEDITLM");
29 // -------------------------------------------------------------------------------------------------
30 Tlm::Tlm(const Geometry & resol, const eckit::Configuration & tlConf) : keySelf_(0), tstep_(),
31  trajmap_(), linvars_(tlConf, "tlm variables")
32 {
33  oops::Log::trace() << "Tlm::Tlm starting" << std::endl;
34 
35  // Store time step
36  tstep_ = util::Duration(tlConf.getString("tstep"));
37 
38  // Pointer to configuration
39  const eckit::Configuration * configc = &tlConf;
40 
41  // Implementation
42  stageFv3Files(tlConf, resol.getComm());
43  fv3jedi_tlm_create_f90(keySelf_, resol.toFortran(), &configc);
44  removeFv3Files(resol.getComm());
45 
46  oops::Log::trace() << "Tlm::Tlm done" << std::endl;
47 }
48 // -------------------------------------------------------------------------------------------------
50  oops::Log::trace() << "Tlm::~Tlm starting" << std::endl;
51 
52  // Implementation
54 
55  // Clear trajecotory
56  for (trajIter jtra = trajmap_.begin(); jtra != trajmap_.end(); ++jtra) {
57  fv3jedi_traj_wipe_f90(jtra->second);
58  }
59  oops::Log::trace() << "Tlm::~Tlm done" << std::endl;
60 }
61 // -------------------------------------------------------------------------------------------------
62 void Tlm::setTrajectory(const State & xx, State & xlr, const ModelBias & bias) {
63  oops::Log::trace() << "Tlm::setTrajectory starting" << std::endl;
64 
65  // Interpolate to resolution of the trajectory
66  xlr.changeResolution(xx);
67 
68  // Set trajecotry
69  int keyTraj = 0;
70  fv3jedi_traj_set_f90(keyTraj, xlr.toFortran());
71  ASSERT(keyTraj != 0);
72  trajmap_[xx.validTime()] = keyTraj;
73 
74  oops::Log::trace() << "Tlm::setTrajectory done" << std::endl;
75 }
76 // -------------------------------------------------------------------------------------------------
77 void Tlm::initializeTL(Increment & dx) const {
78  oops::Log::trace() << "Tlm::initializeTL starting" << std::endl;
79 
80  // Implementation
82 
83  oops::Log::trace() << "Tlm::initializeTL done" << std::endl;
84 }
85 // -------------------------------------------------------------------------------------------------
86 void Tlm::stepTL(Increment & dx, const ModelBiasIncrement &) const {
87  oops::Log::trace() << "Tlm::stepTL starting" << std::endl;
88 
89  // Get traj index
90  trajICst itra = trajmap_.find(dx.validTime());
91 
92  // Check traj is available
93  if (itra == trajmap_.end()) {
94  oops::Log::error() << "Tlm: trajectory not available at time " << dx.validTime() << std::endl;
95  ABORT("Tlm: trajectory not available");
96  }
97 
98  // Implementation
99  fv3jedi_tlm_step_tl_f90(keySelf_, dx.toFortran(), itra->second);
100 
101  // Tick increment clock
102  dx.validTime() += tstep_;
103 
104  oops::Log::trace() << "Tlm::stepTL done" << std::endl;
105 }
106 // -------------------------------------------------------------------------------------------------
107 void Tlm::finalizeTL(Increment & dx) const {
108  oops::Log::trace() << "Tlm::finalizeTL starting" << std::endl;
109 
110  // Implementation
112 
113  oops::Log::trace() << "Tlm::finalizeTL done" << std::endl;
114 }
115 // -------------------------------------------------------------------------------------------------
116 void Tlm::initializeAD(Increment & dx) const {
117  oops::Log::trace() << "Tlm::initializeAD starting" << std::endl;
118 
119  // Implementation
121 
122  oops::Log::trace() << "Tlm::initializeAD done" << std::endl;
123 }
124 // -------------------------------------------------------------------------------------------------
126  oops::Log::trace() << "Tlm::stepAD starting" << std::endl;
127 
128  // Tick increment clock (backwards)
129  dx.validTime() -= tstep_;
130 
131  // Get traj index
132  trajICst itra = trajmap_.find(dx.validTime());
133 
134  // Check traj is available
135  if (itra == trajmap_.end()) {
136  oops::Log::error() << "Tlm: trajectory not available at time " << dx.validTime() << std::endl;
137  ABORT("Tlm: trajectory not available");
138  }
139 
140  // Implementation
141  fv3jedi_tlm_step_ad_f90(keySelf_, dx.toFortran(), itra->second);
142 
143  oops::Log::trace() << "Tlm::stepAD done" << std::endl;
144 }
145 // -------------------------------------------------------------------------------------------------
146 void Tlm::finalizeAD(Increment & dx) const {
147  oops::Log::trace() << "Tlm::finalizeAD starting" << std::endl;
148 
149  // Implementation
151 
152  oops::Log::trace() << "Tlm::finalizeAD done" << std::endl;
153 }
154 // -------------------------------------------------------------------------------------------------
155 void Tlm::print(std::ostream & os) const {
156  oops::Log::trace() << "Tlm::print starting" << std::endl;
157 
158  // Print information about the Tlm object
159  os << "FV3JEDI TLM Trajectory, nstep=" << trajmap_.size() << std::endl;
160  typedef std::map< util::DateTime, int >::const_iterator trajICst;
161  if (trajmap_.size() > 0) {
162  os << "FV3JEDI TLM Trajectory: times are:";
163  for (trajICst jtra = trajmap_.begin(); jtra != trajmap_.end(); ++jtra) {
164  os << " " << jtra->first;
165  }
166  }
167 
168  oops::Log::trace() << "Tlm::print done" << std::endl;
169 }
170 // -------------------------------------------------------------------------------------------------
171 } // namespace fv3jedi
fv3jedi::Tlm::finalizeAD
void finalizeAD(Increment &) const override
Definition: Tlm.cc:146
fv3jedi::Tlm::setTrajectory
void setTrajectory(const State &, State &, const ModelBias &) override
Definition: Tlm.cc:62
Traits.h
fv3jedi::Increment::toFortran
int & toFortran()
Definition: Increment.h:110
fv3jedi::fv3jedi_traj_set_f90
void fv3jedi_traj_set_f90(F90traj &, const F90state &)
fv3jedi::Geometry::getComm
const eckit::mpi::Comm & getComm() const
Definition: Geometry.h:55
fv3jedi::Tlm::stepAD
void stepAD(Increment &, ModelBiasIncrement &) const override
Definition: Tlm.cc:125
fv3jedi::fv3jedi_tlm_create_f90
void fv3jedi_tlm_create_f90(F90tlm &, const F90geom &, const eckit::Configuration *const *)
fv3jedi::Tlm::finalizeTL
void finalizeTL(Increment &) const override
Definition: Tlm.cc:107
fv3jedi::makerTLM_
static oops::LinearModelMaker< Traits, Tlm > makerTLM_("FV3JEDITLM")
fv3jedi::Tlm::Tlm
Tlm(const Geometry &, const eckit::Configuration &)
Definition: Tlm.cc:30
fv3jedi::fv3jedi_tlm_delete_f90
void fv3jedi_tlm_delete_f90(F90tlm &)
Utilities.h
fv3jedi::Tlm::print
void print(std::ostream &) const override
Definition: Tlm.cc:155
fv3jedi::fv3jedi_tlm_initialize_ad_f90
void fv3jedi_tlm_initialize_ad_f90(const F90tlm &, const F90inc &)
Tlm.h
fv3jedi::Geometry::toFortran
F90geom & toFortran()
Definition: Geometry.h:53
Tlm.interface.h
fv3jedi::fv3jedi_tlm_step_tl_f90
void fv3jedi_tlm_step_tl_f90(const F90tlm &, const F90inc &, const F90traj &)
fv3jedi::Tlm::trajIter
std::map< util::DateTime, int >::iterator trajIter
Definition: Tlm.h:59
Geometry.h
fv3jedi::State::changeResolution
void changeResolution(const State &xx)
Definition: State.cc:84
fv3jedi::fv3jedi_tlm_finalize_ad_f90
void fv3jedi_tlm_finalize_ad_f90(const F90tlm &, const F90inc &)
fv3jedi::Tlm::initializeAD
void initializeAD(Increment &) const override
Definition: Tlm.cc:116
fv3jedi::ModelBias
Model error for the FV3JEDI model.
Definition: ModelBias.h:41
fv3jedi::fv3jedi_tlm_finalize_tl_f90
void fv3jedi_tlm_finalize_tl_f90(const F90tlm &, const F90inc &)
fv3jedi::State::toFortran
int & toFortran()
Definition: State.h:87
fv3jedi::State::validTime
const util::DateTime & validTime() const
Definition: State.h:83
fv3jedi::fv3jedi_tlm_initialize_tl_f90
void fv3jedi_tlm_initialize_tl_f90(const F90tlm &, const F90inc &)
fv3jedi::fv3jedi_tlm_step_ad_f90
void fv3jedi_tlm_step_ad_f90(const F90tlm &, const F90inc &, const F90traj &)
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::Tlm::~Tlm
~Tlm()
Definition: Tlm.cc:49
fv3jedi::Tlm::tstep_
util::Duration tstep_
Definition: Tlm.h:64
fv3jedi::Increment
Definition: Increment.h:52
fv3jedi::Tlm::keySelf_
F90model keySelf_
Definition: Tlm.h:63
fv3jedi::Tlm::stepTL
void stepTL(Increment &, const ModelBiasIncrement &) const override
Definition: Tlm.cc:86
fv3jedi::State
Definition: State.h:45
fv3jedi::Tlm::trajmap_
std::map< util::DateTime, F90traj > trajmap_
Definition: Tlm.h:65
fv3jedi::stageFv3Files
void stageFv3Files(const eckit::Configuration &conf, const eckit::mpi::Comm &comm)
Definition: Utilities.cc:53
fv3jedi::fv3jedi_traj_wipe_f90
void fv3jedi_traj_wipe_f90(F90traj &)
fv3jedi::Tlm::initializeTL
void initializeTL(Increment &) const override
Definition: Tlm.cc:77
fv3jedi
Configuration files should be formatted as e.g.
Definition: ErrorCovariance.cc:20
Increment.h
fv3jedi::ModelBiasIncrement
Definition: ModelBiasIncrement.h:27
fv3jedi::removeFv3Files
void removeFv3Files(const eckit::mpi::Comm &comm)
Definition: Utilities.cc:130
Traj.interface.h
fv3jedi::Tlm::trajICst
std::map< util::DateTime, int >::const_iterator trajICst
Definition: Tlm.h:60
State.h