UFO
Variables.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 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 
9 
10 #include <algorithm>
11 #include <iostream>
12 #include <string>
13 #include <vector>
14 
15 #include "eckit/exception/Exceptions.h"
16 
17 #include "oops/util/abor1_cpp.h"
18 #include "oops/util/Logger.h"
19 
21 
22 // -----------------------------------------------------------------------------
23 namespace ufo {
24 
25 // -----------------------------------------------------------------------------
26 
28  : vars_() {
29  oops::Log::trace() << "ufo::Variables created empty" << std::endl;
30 }
31 
32 // -----------------------------------------------------------------------------
33 
34 Variables::Variables(const std::vector<eckit::LocalConfiguration> & confs)
35  : vars_() {
36  oops::Log::trace() << "ufo::Variables(config) start " << std::endl;
37  for (size_t jvar = 0; jvar < confs.size(); ++jvar) {
38  vars_.push_back(Variable(confs[jvar]));
39  }
40  oops::Log::trace() << "ufo::Variables(conf) done" << std::endl;
41 }
42 
43 // -----------------------------------------------------------------------------
44 
45 Variables::Variables(const oops::Variables & oopsvars)
46  : vars_() {
47  oops::Log::trace() << "ufo::Variables(oops::Vars) start" << std::endl;
48  if (oopsvars.channels().size() > 0) {
49  // note: for variables with channels will use only the first variable
50  // should work for all current cases
51  // find string before channel:
52  size_t pos = oopsvars[0].find_last_of('_');
53  vars_.push_back(Variable(oopsvars[0].substr(0, pos), oopsvars.channels()));
54  } else {
55  for (size_t jvar = 0; jvar < oopsvars.size(); ++jvar) {
56  vars_.push_back(Variable(oopsvars[jvar]));
57  }
58  }
59 }
60 
61 // -----------------------------------------------------------------------------
62 
63 Variables::Variables(const ufo::Variables & vars, const std::string & group)
64  : vars_() {
65  oops::Log::trace() << "ufo::Variables(ufovars, group) start " << std::endl;
66  for (size_t jvar = 0; jvar < vars.size(); ++jvar) {
67  vars_.push_back(Variable(vars[jvar], group));
68  }
69 }
70 
71 // -----------------------------------------------------------------------------
72 
74 }
75 
76 // -----------------------------------------------------------------------------
77 
79  vars_.insert(vars_.end(), rhs.vars_.begin(), rhs.vars_.end());
80  return *this;
81 }
82 
83 // -----------------------------------------------------------------------------
84 
86  vars_.push_back(rhs);
87  return *this;
88 }
89 
90 // -----------------------------------------------------------------------------
91 
92 size_t Variables::size() const {
93  return vars_.size();
94 }
95 
96 // -----------------------------------------------------------------------------
97 
98 const Variable & Variables::operator[](const size_t jj) const {
99  return vars_[jj];
100 }
101 
102 // -----------------------------------------------------------------------------
103 
104 size_t Variables::nvars() const {
105  size_t nvars = 0;
106  for (size_t ivar = 0; ivar < vars_.size(); ++ivar) {
107  nvars += vars_[ivar].size();
108  }
109  return nvars;
110 }
111 
112 // -----------------------------------------------------------------------------
113 
114 Variable Variables::variable(const size_t jj) const {
115  size_t curr_indx = 0;
116  for (size_t ivar = 0; ivar < vars_.size(); ++ivar) {
117  if (jj < curr_indx + vars_[ivar].size())
118  return vars_[ivar][jj-curr_indx];
119  else
120  curr_indx += vars_[ivar].size();
121  }
122  ABORT("Variable index exceeds collective variable arrays size");
123  abort(); /* Prevent g++ warning of missing return */
124 }
125 
126 // -----------------------------------------------------------------------------
127 
128 Variables Variables::allFromGroup(const std::string & group) const {
129  Variables vars;
130  for (size_t ivar = 0; ivar < vars_.size(); ++ivar) {
131  if (vars_[ivar].group() == group) {
132  vars += vars_[ivar];
133  } else if (vars_[ivar].group() == ObsFunctionTraits<float>::groupName) {
134  ObsFunction<float> obsfunc(vars_[ivar]);
135  ufo::Variables funcvars = obsfunc.requiredVariables();
136  vars += funcvars.allFromGroup(group);
137  } else if (vars_[ivar].group() == ObsFunctionTraits<int>::groupName) {
138  ObsFunction<int> obsfunc(vars_[ivar]);
139  ufo::Variables funcvars = obsfunc.requiredVariables();
140  vars += funcvars.allFromGroup(group);
141  } else if (vars_[ivar].group() == ObsFunctionTraits<std::string>::groupName) {
142  ObsFunction<std::string> obsfunc(vars_[ivar]);
143  ufo::Variables funcvars = obsfunc.requiredVariables();
144  vars += funcvars.allFromGroup(group);
145  } else if (vars_[ivar].group() == ObsFunctionTraits<util::DateTime>::groupName) {
146  ObsFunction<util::DateTime> obsfunc(vars_[ivar]);
147  ufo::Variables funcvars = obsfunc.requiredVariables();
148  vars += funcvars.allFromGroup(group);
149  }
150  }
151  return vars;
152 }
153 
154 // -----------------------------------------------------------------------------
155 
156 oops::Variables Variables::toOopsVariables() const {
157  oops::Variables vars;
158  for (size_t ivar = 0; ivar < vars_.size(); ++ivar) {
159  for (size_t jj = 0; jj < vars_[ivar].size(); ++jj) {
160  vars.push_back(vars_[ivar].variable(jj));
161  }
162  }
163  return vars;
164 }
165 
166 // -----------------------------------------------------------------------------
167 
168 bool Variables::hasGroup(const std::string & group) const {
169  bool found = false;
170  for (size_t jj = 0; jj < vars_.size(); ++jj) {
171  if (vars_[jj].group() == group)
172  found = true;
173 
174  if (vars_[jj].group() == ObsFunctionTraits<float>::groupName) {
175  ObsFunction<float> obsfunc(vars_[jj]);
176  ufo::Variables funcvars = obsfunc.requiredVariables();
177  found = found || funcvars.hasGroup(group);
178  } else if (vars_[jj].group() == ObsFunctionTraits<int>::groupName) {
179  ObsFunction<int> obsfunc(vars_[jj]);
180  ufo::Variables funcvars = obsfunc.requiredVariables();
181  found = found || funcvars.hasGroup(group);
182  } else if (vars_[jj].group() == ObsFunctionTraits<std::string>::groupName) {
183  ObsFunction<std::string> obsfunc(vars_[jj]);
184  ufo::Variables funcvars = obsfunc.requiredVariables();
185  found = found || funcvars.hasGroup(group);
186  } else if (vars_[jj].group() == ObsFunctionTraits<util::DateTime>::groupName) {
187  ObsFunction<util::DateTime> obsfunc(vars_[jj]);
188  ufo::Variables funcvars = obsfunc.requiredVariables();
189  found = found || funcvars.hasGroup(group);
190  }
191  }
192  return found;
193 }
194 
195 // -----------------------------------------------------------------------------
196 
197 void Variables::print(std::ostream & os) const {
198  os << vars_.size() << " variables: ";
199  for (size_t jj = 0; jj < vars_.size(); ++jj) {
200  if (jj > 0) os << ", ";
201  os << vars_[jj];
202  }
203 }
204 
205 // -----------------------------------------------------------------------------
206 
207 } // namespace ufo
A function of observation data.
const ufo::Variables & requiredVariables() const
required variables
Definition: ObsFunction.cc:39
bool hasGroup(const std::string &) const
Definition: Variables.cc:168
void print(std::ostream &) const
Definition: Variables.cc:197
size_t nvars() const
Return the number of constituent "primitive" (single-channel) variables.
Definition: Variables.cc:104
Variables & operator+=(const Variables &)
Definition: Variables.cc:78
Variable variable(const size_t) const
Return a given constituent "primitive" (single-channel) variable.
Definition: Variables.cc:114
const Variable & operator[](const size_t) const
Return a given constituent Variable (which may contain multiple channels).
Definition: Variables.cc:98
std::vector< Variable > vars_
oops::Variables toOopsVariables() const
Definition: Variables.cc:156
size_t size() const
Return the number of constituent Variable objects (some of which may contain multiple channels).
Definition: Variables.cc:92
Variables allFromGroup(const std::string &) const
Definition: Variables.cc:128
Definition: RunCRTM.h:27
Common properties of ObsFunctions producing values of type FunctionValue.