FV3-JEDI
Increment.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 <algorithm>
9 #include <iomanip>
10 #include <ios>
11 #include <iostream>
12 #include <sstream>
13 #include <string>
14 #include <vector>
15 
16 #include "atlas/field.h"
17 
18 #include "eckit/config/LocalConfiguration.h"
19 #include "eckit/exception/Exceptions.h"
20 
21 #include "oops/base/Variables.h"
22 #include "oops/util/DateTime.h"
23 #include "oops/util/Duration.h"
24 #include "oops/util/Logger.h"
25 
26 #include "ufo/GeoVaLs.h"
27 #include "ufo/Locations.h"
28 
31 #include "fv3jedi/State/State.h"
32 
33 namespace fv3jedi {
34 
35 // -------------------------------------------------------------------------------------------------
36 Increment::Increment(const Geometry & geom, const oops::Variables & vars,
37  const util::DateTime & time): geom_(new Geometry(geom)), vars_(vars),
38  time_(time) {
39  oops::Log::trace() << "Increment::Increment (from geom, vars and time) starting" << std::endl;
42  oops::Log::trace() << "Increment::Increment (from geom, vars and time) done" << std::endl;
43 }
44 // -------------------------------------------------------------------------------------------------
45 Increment::Increment(const Geometry & geom, const Increment & other): geom_(new Geometry(geom)),
46  vars_(other.vars_), time_(other.time_) {
47  oops::Log::trace() << "Increment::Increment (from geom and other) starting" << std::endl;
50  other.geometry()->toFortran());
51  oops::Log::trace() << "Increment::Increment (from geom and other) done" << std::endl;
52 }
53 // -------------------------------------------------------------------------------------------------
54 Increment::Increment(const Increment & other, const bool copy): geom_(other.geom_),
55  vars_(other.vars_), time_(other.time_) {
56  oops::Log::trace() << "Increment::Increment (from other and bool copy) starting" << std::endl;
58  if (copy) {
60  } else {
62  }
63  oops::Log::trace() << "Increment::Increment (from other and bool copy) done" << std::endl;
64 }
65 // -------------------------------------------------------------------------------------------------
68 }
69 // -------------------------------------------------------------------------------------------------
70 void Increment::diff(const State & x1, const State & x2) {
71  ASSERT(this->validTime() == x1.validTime());
72  ASSERT(this->validTime() == x2.validTime());
73  // States at increment resolution
74  State x1_ir(*geom_, x1);
75  State x2_ir(*geom_, x2);
77  geom_->toFortran());
78 }
79 // -------------------------------------------------------------------------------------------------
82  time_ = rhs.time_;
83  return *this;
84 }
85 // -------------------------------------------------------------------------------------------------
87  ASSERT(this->validTime() == dx.validTime());
89  return *this;
90 }
91 // -------------------------------------------------------------------------------------------------
93  ASSERT(this->validTime() == dx.validTime());
95  return *this;
96 }
97 // -------------------------------------------------------------------------------------------------
98 Increment & Increment::operator*=(const double & zz) {
100  return *this;
101 }
102 // -------------------------------------------------------------------------------------------------
105 }
106 // -------------------------------------------------------------------------------------------------
107 void Increment::zero(const util::DateTime & vt) {
109  time_ = vt;
110 }
111 // -------------------------------------------------------------------------------------------------
114 }
115 // -------------------------------------------------------------------------------------------------
116 void Increment::axpy(const double & zz, const Increment & dx, const bool check) {
117  ASSERT(!check || this->validTime() == dx.validTime());
119 }
120 // -------------------------------------------------------------------------------------------------
121 void Increment::accumul(const double & zz, const State & xx) {
123 }
124 // -------------------------------------------------------------------------------------------------
127 }
128 // -------------------------------------------------------------------------------------------------
129 double Increment::dot_product_with(const Increment & other) const {
130  double zz;
132  return zz;
133 }
134 // -------------------------------------------------------------------------------------------------
137 }
138 // -------------------------------------------------------------------------------------------------
139 oops::LocalIncrement Increment::getLocal(const GeometryIterator & iter) const {
140  int ist, iend, jst, jend, npz;
141  fv3jedi_geom_start_end_f90(geom_->toFortran(), ist, iend, jst, jend, npz);
142 
143  oops::Variables fieldNames = vars_;
144 
145  std::vector<int> varlens(fieldNames.size());
146  for (unsigned int ii = 0; ii < fieldNames.size(); ii++) {
147  // might need to modify if non-npz variables are also used
148  varlens[ii] = npz;
149  }
150 
151  int lenvalues = std::accumulate(varlens.begin(), varlens.end(), 0);
152  std::vector<double> values(lenvalues);
153 
154  // Get variable values
156  values.size());
157 
158  return oops::LocalIncrement(oops::Variables(fieldNames), values, varlens);
159 }
160 // -------------------------------------------------------------------------------------------------
161 void Increment::setLocal(const oops::LocalIncrement & values, const GeometryIterator & iter) {
162  const std::vector<double> vals = values.getVals();
163  fv3jedi_increment_setpoint_f90(keyInc_, iter.toFortran(), vals[0], vals.size());
164 }
165 // -------------------------------------------------------------------------------------------------
166 void Increment::setAtlas(atlas::FieldSet * afieldset) const {
167  fv3jedi_increment_set_atlas_f90(keyInc_, geom_->toFortran(), vars_, afieldset->get());
168 }
169 // -------------------------------------------------------------------------------------------------
170 void Increment::toAtlas(atlas::FieldSet * afieldset) const {
171  fv3jedi_increment_to_atlas_f90(keyInc_, geom_->toFortran(), vars_, afieldset->get());
172 }
173 // -------------------------------------------------------------------------------------------------
174 void Increment::fromAtlas(atlas::FieldSet * afieldset) {
175  fv3jedi_increment_from_atlas_f90(keyInc_, geom_->toFortran(), vars_, afieldset->get());
176 }
177 // -------------------------------------------------------------------------------------------------
178 void Increment::read(const eckit::Configuration & config) {
179  const eckit::Configuration * conf = &config;
180  util::DateTime * dtp = &time_;
181  fv3jedi_increment_read_file_f90(geom_->toFortran(), keyInc_, &conf, &dtp);
182 }
183 // -------------------------------------------------------------------------------------------------
184 void Increment::write(const eckit::Configuration & config) const {
185  const eckit::Configuration * conf = &config;
186  const util::DateTime * dtp = &time_;
187  fv3jedi_increment_write_file_f90(geom_->toFortran(), keyInc_, &conf, &dtp);
188 }
189 // -------------------------------------------------------------------------------------------------
190 double Increment::norm() const {
191  double zz = 0.0;
193  return zz;
194 }
195 // -------------------------------------------------------------------------------------------------
196 void Increment::print(std::ostream & os) const {
197  // Get the number of fields
198  int numberFields;
199  int cubeSize;
200  fv3jedi_increment_getnfieldsncube_f90(keyInc_, numberFields, cubeSize);
201 
202  // Header
203  os << std::endl
204  << " --------------------------------------------------------------------------------";
205  os << std::endl << " Increment print | number of fields = " << numberFields
206  << " | cube sphere face size: C" << cubeSize;
207 
208  // Print info field by field
209  const int FieldNameLen = 15;
210  char fieldName[FieldNameLen];
211  std::vector<double> minMaxRms(3);
212  for (int f = 0; f < numberFields; f++) {
213  int fp1 = f+1;
214  fv3jedi_increment_getminmaxrms_f90(keyInc_, fp1, FieldNameLen, fieldName, minMaxRms[0]);
215  std::string fieldNameStr(fieldName);
216  os << std::endl << std::scientific << std::showpos << " "
217  << fieldNameStr.substr(0, FieldNameLen-1) << ": Min = " << minMaxRms[0]
218  << ", Max = " << minMaxRms[1] << ", RMS = " << minMaxRms[2]
219  << std::noshowpos; // << std::defaultfloat;
220  }
221 
222  os.unsetf(std::ios_base::floatfield);
223 
224  // Footer
225  os << std::endl
226  << " --------------------------------------------------------------------------------";
227 }
228 // -------------------------------------------------------------------------------------------------
229 void Increment::dirac(const eckit::Configuration & config) {
230  const eckit::Configuration * conf = &config;
231  fv3jedi_increment_dirac_f90(keyInc_, &conf, geom_->toFortran());
232 }
233 // -------------------------------------------------------------------------------------------------
234 size_t Increment::serialSize() const {
235  size_t nn = 1;
236  int inc_size;
238  nn+= inc_size; // to verify
239  nn += time_.serialSize();
240  return nn;
241 }
242 // -------------------------------------------------------------------------------------------------
243 void Increment::serialize(std::vector<double> & vect) const {
244  int size_inc = this->serialSize() - 3;
245  std::vector<double> v_inc(size_inc, 0);
246 
247  fv3jedi_increment_serialize_f90(keyInc_, size_inc, v_inc.data());
248  vect.insert(vect.end(), v_inc.begin(), v_inc.end());
249 
250  // Serialize the date and time
251  vect.push_back(-54321.98765);
252  time_.serialize(vect);
253 }
254 // -------------------------------------------------------------------------------------------------
255 void Increment::deserialize(const std::vector<double> & vect,
256  size_t & index) {
257  fv3jedi_increment_deserialize_f90(keyInc_, vect.size(), vect.data(), index);
258 
259  ASSERT(vect.at(index) == -54321.98765);
260  ++index;
261 
262  time_.deserialize(vect, index);
263 }
264 // -------------------------------------------------------------------------------------------------
265 } // namespace fv3jedi
fv3jedi::Increment::geom_
std::shared_ptr< const Geometry > geom_
Definition: Increment.h:117
fv3jedi::Increment::keyInc_
F90inc keyInc_
Definition: Increment.h:116
fv3jedi_fields_mod::copy
subroutine copy(self, other)
Definition: fv3jedi_fields_mod.f90:203
fv3jedi::fv3jedi_increment_to_atlas_f90
void fv3jedi_increment_to_atlas_f90(const F90inc &, const F90geom &, const oops::Variables &, atlas::field::FieldSetImpl *)
fv3jedi::fv3jedi_increment_self_sub_f90
void fv3jedi_increment_self_sub_f90(const F90inc &, const F90inc &)
fv3jedi::fv3jedi_increment_self_schur_f90
void fv3jedi_increment_self_schur_f90(const F90inc &, const F90inc &)
fv3jedi::fv3jedi_increment_write_file_f90
void fv3jedi_increment_write_file_f90(const F90geom &, const F90inc &, const eckit::Configuration *const *, const util::DateTime *const *)
fv3jedi::fv3jedi_increment_copy_f90
void fv3jedi_increment_copy_f90(const F90inc &, const F90inc &)
fv3jedi::Increment::ones
void ones()
Definition: Increment.cc:112
fv3jedi::fv3jedi_increment_random_f90
void fv3jedi_increment_random_f90(const F90inc &)
fv3jedi::Increment::write
void write(const eckit::Configuration &) const
Definition: Increment.cc:184
fv3jedi::fv3jedi_increment_getnfieldsncube_f90
void fv3jedi_increment_getnfieldsncube_f90(const F90state &, int &, int &)
fv3jedi::fv3jedi_increment_axpy_inc_f90
void fv3jedi_increment_axpy_inc_f90(const F90inc &, const double &, const F90inc &)
fv3jedi::Increment::serialSize
size_t serialSize() const
Serialize and deserialize.
Definition: Increment.cc:234
fv3jedi::fv3jedi_increment_axpy_state_f90
void fv3jedi_increment_axpy_state_f90(const F90inc &, const double &, const F90state &)
fv3jedi::Increment::operator*=
Increment & operator*=(const double &)
Definition: Increment.cc:98
Geometry.h
fv3jedi::Increment::getLocal
oops::LocalIncrement getLocal(const GeometryIterator &) const
Get/Set increment values at grid points.
Definition: Increment.cc:139
fv3jedi::Increment::deserialize
void deserialize(const std::vector< double > &, size_t &)
Definition: Increment.cc:255
fv3jedi::Increment::diff
void diff(const State &, const State &)
Basic operators.
Definition: Increment.cc:70
fv3jedi::fv3jedi_increment_getminmaxrms_f90
void fv3jedi_increment_getminmaxrms_f90(const F90state &, int &, const int &, char *, double &)
fv3jedi::fv3jedi_increment_delete_f90
void fv3jedi_increment_delete_f90(F90inc &)
fv3jedi::fv3jedi_increment_change_resol_f90
void fv3jedi_increment_change_resol_f90(const F90inc &, const F90geom &, const F90inc &, const F90geom &)
fv3jedi::fv3jedi_increment_deserialize_f90
void fv3jedi_increment_deserialize_f90(const F90inc &, const std::size_t &, const double[], const std::size_t &)
fv3jedi::fv3jedi_increment_getpoint_f90
void fv3jedi_increment_getpoint_f90(const F90inc &, const F90iter &, double &, const int &)
fv3jedi::Increment::setLocal
void setLocal(const oops::LocalIncrement &, const GeometryIterator &)
Definition: Increment.cc:161
fv3jedi::Increment::toAtlas
void toAtlas(atlas::FieldSet *) const
Definition: Increment.cc:170
fv3jedi::State::toFortran
int & toFortran()
Definition: State.h:87
fv3jedi::fv3jedi_increment_serialize_f90
void fv3jedi_increment_serialize_f90(const F90inc &, const std::size_t &, double[])
fv3jedi::State::validTime
const util::DateTime & validTime() const
Definition: State.h:83
fv3jedi::Increment::print
void print(std::ostream &) const
Definition: Increment.cc:196
fv3jedi::Increment::operator=
Increment & operator=(const Increment &)
Definition: Increment.cc:80
fv3jedi::Increment::validTime
const util::DateTime & validTime() const
Definition: Increment.h:107
fv3jedi::Increment::~Increment
virtual ~Increment()
Definition: Increment.cc:66
fv3jedi::Increment::Increment
Increment(const Geometry &, const oops::Variables &, const util::DateTime &)
Constructor, destructor.
Definition: Increment.cc:36
fv3jedi::fv3jedi_increment_ones_f90
void fv3jedi_increment_ones_f90(const F90inc &)
fv3jedi::Geometry
Geometry handles geometry for FV3JEDI model.
Definition: Geometry.h:41
fv3jedi::Increment::time_
util::DateTime time_
Definition: Increment.h:119
fv3jedi::Increment::axpy
void axpy(const double &, const Increment &, const bool check=true)
Definition: Increment.cc:116
fv3jedi::fv3jedi_increment_diff_incr_f90
void fv3jedi_increment_diff_incr_f90(const F90inc &, const F90state &, const F90state &, const F90geom &)
fv3jedi::fv3jedi_increment_self_add_f90
void fv3jedi_increment_self_add_f90(const F90inc &, const F90inc &)
fv3jedi::Increment::norm
double norm() const
Definition: Increment.cc:190
fv3jedi::Increment
Definition: Increment.h:52
fv3jedi::Increment::geometry
std::shared_ptr< const Geometry > geometry() const
Definition: Increment.h:103
fv3jedi::fv3jedi_increment_norm_f90
void fv3jedi_increment_norm_f90(const F90inc &, double &)
fv3jedi::State
Definition: State.h:45
fv3jedi::Increment::random
void random()
Definition: Increment.cc:135
fv3jedi::Increment::zero
void zero()
Definition: Increment.cc:103
fv3jedi::fv3jedi_geom_start_end_f90
void fv3jedi_geom_start_end_f90(const F90geom &, int &, int &, int &, int &, int &)
fv3jedi::Increment::schur_product_with
void schur_product_with(const Increment &)
Definition: Increment.cc:125
fv3jedi::fv3jedi_increment_from_atlas_f90
void fv3jedi_increment_from_atlas_f90(const F90inc &, const F90geom &, const oops::Variables &, atlas::field::FieldSetImpl *)
fv3jedi::GeometryIterator
Definition: GeometryIterator.h:30
fv3jedi::fv3jedi_increment_zero_f90
void fv3jedi_increment_zero_f90(const F90inc &)
fv3jedi::fv3jedi_increment_dot_prod_f90
void fv3jedi_increment_dot_prod_f90(const F90inc &, const F90inc &, double &)
fv3jedi::Increment::operator+=
Increment & operator+=(const Increment &)
Definition: Increment.cc:86
fv3jedi
Configuration files should be formatted as e.g.
Definition: ErrorCovariance.cc:20
Increment.h
fv3jedi::Increment::accumul
void accumul(const double &, const State &)
Other.
Definition: Increment.cc:121
fv3jedi::Increment::setAtlas
void setAtlas(atlas::FieldSet *) const
ATLAS.
Definition: Increment.cc:166
fv3jedi::fv3jedi_increment_set_atlas_f90
void fv3jedi_increment_set_atlas_f90(const F90inc &, const F90geom &, const oops::Variables &, atlas::field::FieldSetImpl *)
fv3jedi::fv3jedi_increment_sizes_f90
void fv3jedi_increment_sizes_f90(const F90inc &, int &)
fv3jedi::Increment::fromAtlas
void fromAtlas(atlas::FieldSet *)
Definition: Increment.cc:174
fv3jedi::fv3jedi_increment_read_file_f90
void fv3jedi_increment_read_file_f90(const F90geom &, const F90inc &, const eckit::Configuration *const *, util::DateTime *const *)
fv3jedi::GeometryIterator::toFortran
F90iter & toFortran()
Definition: GeometryIterator.h:45
fv3jedi::Increment::serialize
void serialize(std::vector< double > &) const
Definition: Increment.cc:243
fv3jedi::Increment::read
void read(const eckit::Configuration &)
I/O and diagnostics.
Definition: Increment.cc:178
fv3jedi::fv3jedi_increment_dirac_f90
void fv3jedi_increment_dirac_f90(const F90inc &, const eckit::Configuration *const *, const F90geom &)
fv3jedi::fv3jedi_increment_setpoint_f90
void fv3jedi_increment_setpoint_f90(F90inc &, const F90iter &, const double &, const int &)
fv3jedi::Increment::dirac
void dirac(const eckit::Configuration &)
Definition: Increment.cc:229
fv3jedi::Increment::vars_
oops::Variables vars_
Definition: Increment.h:118
fv3jedi::Increment::operator-=
Increment & operator-=(const Increment &)
Definition: Increment.cc:92
fv3jedi::fv3jedi_increment_self_mul_f90
void fv3jedi_increment_self_mul_f90(const F90inc &, const double &)
fv3jedi::Increment::dot_product_with
double dot_product_with(const Increment &) const
Definition: Increment.cc:129
State.h
fv3jedi::fv3jedi_increment_create_f90
void fv3jedi_increment_create_f90(F90inc &, const F90geom &, const oops::Variables &)