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() == "ObsFunction") {
134  ObsFunction obsfunc(vars_[ivar]);
135  ufo::Variables funcvars = obsfunc.requiredVariables();
136  vars += funcvars.allFromGroup(group);
137  }
138  }
139  return vars;
140 }
141 
142 // -----------------------------------------------------------------------------
143 
144 oops::Variables Variables::toOopsVariables() const {
145  oops::Variables vars;
146  for (size_t ivar = 0; ivar < vars_.size(); ++ivar) {
147  for (size_t jj = 0; jj < vars_[ivar].size(); ++jj) {
148  vars.push_back(vars_[ivar].variable(jj));
149  }
150  }
151  return vars;
152 }
153 
154 // -----------------------------------------------------------------------------
155 
156 bool Variables::hasGroup(const std::string & group) const {
157  bool found = false;
158  for (size_t jj = 0; jj < vars_.size(); ++jj) {
159  if (vars_[jj].group() == group) found = true;
160  if (vars_[jj].group() == "ObsFunction") {
161  ObsFunction obsfunc(vars_[jj]);
162  ufo::Variables funcvars = obsfunc.requiredVariables();
163  found = found || funcvars.hasGroup(group);
164  }
165  }
166  return found;
167 }
168 
169 // -----------------------------------------------------------------------------
170 
171 void Variables::print(std::ostream & os) const {
172  os << vars_.size() << " variables: ";
173  for (size_t jj = 0; jj < vars_.size(); ++jj) {
174  if (jj > 0) os << ", ";
175  os << vars_[jj];
176  }
177 }
178 
179 // -----------------------------------------------------------------------------
180 
181 } // namespace ufo
ufo::Variables::nvars
size_t nvars() const
Definition: Variables.cc:104
ufo::ObsFunction
Definition: src/ufo/filters/obsfunctions/ObsFunction.h:26
ufo::Variables
Definition: src/ufo/filters/Variables.h:24
ufo::Variables::hasGroup
bool hasGroup(const std::string &) const
Definition: Variables.cc:156
ufo::Variables::operator[]
const Variable & operator[](const size_t) const
Definition: Variables.cc:98
ufo::ObsFunction::requiredVariables
const ufo::Variables & requiredVariables() const
required variables
Definition: ObsFunction.cc:34
ufo
Definition: RunCRTM.h:27
ufo::Variables::size
size_t size() const
Definition: Variables.cc:92
Variables.h
ufo::Variables::vars_
std::vector< Variable > vars_
Definition: src/ufo/filters/Variables.h:54
ufo::Variables::Variables
Variables()
Definition: Variables.cc:27
ufo::Variables::toOopsVariables
oops::Variables toOopsVariables() const
Definition: Variables.cc:144
ufo::Variables::print
void print(std::ostream &) const
Definition: Variables.cc:171
ObsFunction.h
ufo::Variables::allFromGroup
Variables allFromGroup(const std::string &) const
Definition: Variables.cc:128
ufo::Variables::variable
Variable variable(const size_t) const
Definition: Variables.cc:114
ufo::Variables::~Variables
~Variables()
Definition: Variables.cc:73
ufo::Variable
Definition: Variable.h:23
ufo::Variables::operator+=
Variables & operator+=(const Variables &)
Definition: Variables.cc:78