IODA
obsspace_f.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2017-2019 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 "ioda/core/obsspace_f.h"
9 
10 #include <algorithm>
11 #include <cstring>
12 #include <string>
13 #include <vector>
14 
15 #include "eckit/exception/Exceptions.h"
16 
17 #include "oops/util/DateTime.h"
18 
19 #include "ioda/ObsSpace.h"
20 
21 namespace ioda {
22 
23 // -----------------------------------------------------------------------------
24 const ObsSpace * obsspace_construct_f(const eckit::Configuration * conf,
25  const util::DateTime * begin,
26  const util::DateTime * end) {
27  return new ObsSpace(*conf, oops::mpi::world(), *begin, *end, oops::mpi::myself());
28 }
29 
30 // -----------------------------------------------------------------------------
32  ASSERT(obss != nullptr);
33  delete obss;
34 }
35 
36 // -----------------------------------------------------------------------------
37 void obsspace_obsname_f(const ObsSpace & obss, size_t & lcname, char * cname) {
38  std::string obsname = obss.obsname();
39  lcname = obsname.size();
40  ASSERT(lcname < 100); // to not overflow the associated fortran string
41  strncpy(cname, obsname.c_str(), lcname);
42 }
43 
44 // -----------------------------------------------------------------------------
45 const oops::Variables * obsspace_obsvariables_f(const ObsSpace & obss) {
46  return &obss.obsvariables();
47 }
48 
49 // -----------------------------------------------------------------------------
50 std::size_t obsspace_get_gnlocs_f(const ObsSpace & obss) {
51  return obss.gnlocs();
52 }
53 // -----------------------------------------------------------------------------
54 std::size_t obsspace_get_nlocs_f(const ObsSpace & obss) {
55  return obss.nlocs();
56 }
57 // -----------------------------------------------------------------------------
58 std::size_t obsspace_get_nrecs_f(const ObsSpace & obss) {
59  return obss.nrecs();
60 }
61 // -----------------------------------------------------------------------------
62 std::size_t obsspace_get_nvars_f(const ObsSpace & obss) {
63  return obss.nvars();
64 }
65 // -----------------------------------------------------------------------------
66 void obsspace_get_comm_f(const ObsSpace & obss, int & lcname, char * cname) {
67  lcname = obss.comm().name().size();
68  ASSERT(lcname < 100); // to not overflow the associated fortran string
69  strncpy(cname, obss.comm().name().c_str(), lcname);
70 }
71 // -----------------------------------------------------------------------------
72 void obsspace_get_recnum_f(const ObsSpace & obss,
73  const std::size_t & length, std::size_t * recnum) {
74  ASSERT(length >= obss.nlocs());
75  for (std::size_t i = 0; i < length; i++) {
76  recnum[i] = obss.recnum()[i];
77  }
78 }
79 // -----------------------------------------------------------------------------
80 void obsspace_get_index_f(const ObsSpace & obss,
81  const std::size_t & length, std::size_t * index) {
82  ASSERT(length >= obss.nlocs());
83  for (std::size_t i = 0; i < length; i++) {
84  // Fortran array indices start at 1, whereas C indices start at 0.
85  // Add 1 to each index value as it is handed off from C to Fortran.
86  index[i] = obss.index()[i] + 1;
87  }
88 }
89 // -----------------------------------------------------------------------------
90 bool obsspace_has_f(const ObsSpace & obss, const char * group, const char * vname) {
91  return obss.has(std::string(group), std::string(vname));
92 }
93 // -----------------------------------------------------------------------------
94 void obsspace_get_int32_f(const ObsSpace & obss, const char * group, const char * vname,
95  const std::size_t & length, int32_t* vec) {
96  if (std::string(group) == "VarMetaData") ASSERT(length >= obss.nvars());
97  else
98  ASSERT(length >= obss.nlocs());
99  std::vector<int32_t> vdata(length);
100  obss.get_db(std::string(group), std::string(vname), vdata);
101  std::copy(vdata.begin(), vdata.end(), vec);
102 }
103 // -----------------------------------------------------------------------------
104 void obsspace_get_int64_f(const ObsSpace & obss, const char * group, const char * vname,
105  const std::size_t & length, int64_t* vec) {
106  if (std::string(group) == "VarMetaData") ASSERT(length >= obss.nvars());
107  else
108  ASSERT(length >= obss.nlocs());
109 // obss.get_db(std::string(group), std::string(vname), vec);
110 }
111 // -----------------------------------------------------------------------------
112 void obsspace_get_real32_f(const ObsSpace & obss, const char * group, const char * vname,
113  const std::size_t & length, float* vec) {
114  if (std::string(group) == "VarMetaData") ASSERT(length >= obss.nvars());
115  else
116  ASSERT(length >= obss.nlocs());
117 // obss.get_db(std::string(group), std::string(vname), vec);
118 }
119 // -----------------------------------------------------------------------------
120 void obsspace_get_real64_f(const ObsSpace & obss, const char * group, const char * vname,
121  const std::size_t & length, double* vec) {
122  if (std::string(group) == "VarMetaData") ASSERT(length >= obss.nvars());
123  else
124  ASSERT(length >= obss.nlocs());
125  std::vector<double> vdata(length);
126  obss.get_db(std::string(group), std::string(vname), vdata);
127  std::copy(vdata.begin(), vdata.end(), vec);
128 }
129 // -----------------------------------------------------------------------------
130 void obsspace_get_datetime_f(const ObsSpace & obss, const char * group, const char * vname,
131  const std::size_t & length, int32_t* date, int32_t* time) {
132  if (std::string(group) == "VarMetaData") ASSERT(length >= obss.nvars());
133  else
134  ASSERT(length >= obss.nlocs());
135 
136  // Load a DateTime vector from the database, then convert to a date and time
137  // vector which are then returned.
138  util::DateTime temp_dt("0000-01-01T00:00:00Z");
139  std::vector<util::DateTime> dt_vect(length, temp_dt);
140  obss.get_db(std::string(group), std::string(vname), dt_vect);
141 
142  // Convert to date and time values. The DateTime utilities can return year, month,
143  // day, hour, minute second.
144  int year;
145  int month;
146  int day;
147  int hour;
148  int minute;
149  int second;
150  for (std::size_t i = 0; i < length; i++) {
151  dt_vect[i].toYYYYMMDDhhmmss(year, month, day, hour, minute, second);
152  date[i] = (year * 10000) + (month * 100) + day;
153  time[i] = (hour * 10000) + (minute * 100) + second;
154  }
155 }
156 // -----------------------------------------------------------------------------
157 void obsspace_put_int32_f(ObsSpace & obss, const char * group, const char * vname,
158  const std::size_t & length, int32_t* vec) {
159  if (std::string(group) == "VarMetaData") ASSERT(length >= obss.nvars());
160  else
161  ASSERT(length >= obss.nlocs());
162  std::vector<int32_t> vdata;
163  vdata.assign(vec, vec + length);
164  obss.put_db(std::string(group), std::string(vname), vdata);
165 }
166 // -----------------------------------------------------------------------------
167 void obsspace_put_int64_f(ObsSpace & obss, const char * group, const char * vname,
168  const std::size_t & length, int64_t* vec) {
169  if (std::string(group) == "VarMetaData") ASSERT(length >= obss.nvars());
170  else
171  ASSERT(length >= obss.nlocs());
172 // obss.put_db(std::string(group), std::string(vname), vec);
173 }
174 // -----------------------------------------------------------------------------
175 void obsspace_put_real32_f(ObsSpace & obss, const char * group, const char * vname,
176  const std::size_t & length, float* vec) {
177  if (std::string(group) == "VarMetaData") ASSERT(length >= obss.nvars());
178  else
179  ASSERT(length >= obss.nlocs());
180 // obss.put_db(std::string(group), std::string(vname), vec);
181 }
182 // -----------------------------------------------------------------------------
183 void obsspace_put_real64_f(ObsSpace & obss, const char * group, const char * vname,
184  const std::size_t & length, double* vec) {
185  if (std::string(group) == "VarMetaData") ASSERT(length >= obss.nvars());
186  else
187  ASSERT(length >= obss.nlocs());
188  std::vector<double> vdata;
189  vdata.assign(vec, vec + length);
190  obss.put_db(std::string(group), std::string(vname), vdata);
191 }
192 // -----------------------------------------------------------------------------
193 
194 } // namespace ioda
ioda::ObsSpace::recnum
const std::vector< std::size_t > & recnum() const
Definition: ObsSpace.cc:377
ioda::ObsSpace::get_db
void get_db(const std::string &group, const std::string &name, std::vector< int > &vdata) const
Definition: ObsSpace.cc:167
ioda::obsspace_has_f
bool obsspace_has_f(const ObsSpace &obss, const char *group, const char *vname)
Definition: obsspace_f.cc:90
ioda::obsspace_obsvariables_f
const oops::Variables * obsspace_obsvariables_f(const ObsSpace &obss)
Definition: obsspace_f.cc:45
ioda::ObsSpace::index
const std::vector< std::size_t > & index() const
Definition: ObsSpace.cc:386
ioda::obsspace_get_int32_f
void obsspace_get_int32_f(const ObsSpace &obss, const char *group, const char *vname, const std::size_t &length, int32_t *vec)
Definition: obsspace_f.cc:94
ioda::ObsSpace::nrecs
std::size_t nrecs() const
Definition: ObsSpace.cc:358
ioda::ObsSpace::has
bool has(const std::string &, const std::string &) const
Definition: ObsSpace.cc:282
ObsSpace.h
ioda::obsspace_construct_f
const ObsSpace * obsspace_construct_f(const eckit::Configuration *conf, const util::DateTime *begin, const util::DateTime *end)
Definition: obsspace_f.cc:24
ioda::obsspace_get_nrecs_f
std::size_t obsspace_get_nrecs_f(const ObsSpace &obss)
Definition: obsspace_f.cc:58
ioda::obsspace_get_recnum_f
void obsspace_get_recnum_f(const ObsSpace &obss, const std::size_t &length, std::size_t *recnum)
Definition: obsspace_f.cc:72
ioda::obsspace_get_int64_f
void obsspace_get_int64_f(const ObsSpace &obss, const char *group, const char *vname, const std::size_t &length, int64_t *vec)
Definition: obsspace_f.cc:104
ioda::obsspace_get_datetime_f
void obsspace_get_datetime_f(const ObsSpace &obss, const char *group, const char *vname, const std::size_t &length, int32_t *date, int32_t *time)
Definition: obsspace_f.cc:130
ioda::ObsSpace::comm
const eckit::mpi::Comm & comm() const
Definition: src/ObsSpace.h:103
ioda
Definition: IodaUtils.cc:13
ioda::obsspace_put_int32_f
void obsspace_put_int32_f(ObsSpace &obss, const char *group, const char *vname, const std::size_t &length, int32_t *vec)
Definition: obsspace_f.cc:157
ioda::obsspace_get_nlocs_f
std::size_t obsspace_get_nlocs_f(const ObsSpace &obss)
Definition: obsspace_f.cc:54
ioda::obsspace_obsname_f
void obsspace_obsname_f(const ObsSpace &obss, size_t &lcname, char *cname)
Definition: obsspace_f.cc:37
ioda::obsspace_get_comm_f
void obsspace_get_comm_f(const ObsSpace &obss, int &lcname, char *cname)
Definition: obsspace_f.cc:66
ioda::obsspace_get_gnlocs_f
std::size_t obsspace_get_gnlocs_f(const ObsSpace &obss)
Definition: obsspace_f.cc:50
ioda::obsspace_put_int64_f
void obsspace_put_int64_f(ObsSpace &obss, const char *group, const char *vname, const std::size_t &length, int64_t *vec)
Definition: obsspace_f.cc:167
ioda::ObsSpace::nlocs
std::size_t nlocs() const
Definition: ObsSpace.cc:344
ioda::ObsSpace::obsname
const std::string & obsname() const
Definition: src/ObsSpace.h:97
ioda::obsspace_get_real64_f
void obsspace_get_real64_f(const ObsSpace &obss, const char *group, const char *vname, const std::size_t &length, double *vec)
Definition: obsspace_f.cc:120
ioda::ObsSpace::put_db
void put_db(const std::string &group, const std::string &name, const std::vector< int > &vdata)
Definition: ObsSpace.cc:242
ioda::obsspace_destruct_f
void obsspace_destruct_f(ObsSpace *obss)
Definition: obsspace_f.cc:31
ioda::obsspace_put_real64_f
void obsspace_put_real64_f(ObsSpace &obss, const char *group, const char *vname, const std::size_t &length, double *vec)
Definition: obsspace_f.cc:183
ioda::ObsSpace::gnlocs
std::size_t gnlocs() const
Definition: ObsSpace.cc:332
ioda::obsspace_get_nvars_f
std::size_t obsspace_get_nvars_f(const ObsSpace &obss)
Definition: obsspace_f.cc:62
ioda::ObsSpace::obsvariables
const oops::Variables & obsvariables() const
Definition: src/ObsSpace.h:107
ioda::ObsSpace::nvars
std::size_t nvars() const
Definition: ObsSpace.cc:368
ioda::ObsSpace
Observation Space View.
Definition: src/ObsSpace.h:35
ioda::obsspace_get_real32_f
void obsspace_get_real32_f(const ObsSpace &obss, const char *group, const char *vname, const std::size_t &length, float *vec)
Definition: obsspace_f.cc:112
ioda::obsspace_get_index_f
void obsspace_get_index_f(const ObsSpace &obss, const std::size_t &length, std::size_t *index)
Definition: obsspace_f.cc:80
ioda::obsspace_put_real32_f
void obsspace_put_real32_f(ObsSpace &obss, const char *group, const char *vname, const std::size_t &length, float *vec)
Definition: obsspace_f.cc:175