FV3-JEDI
FieldsMetadata.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 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 #pragma once
9 
10 #include <algorithm>
11 #include <iterator>
12 #include <map>
13 #include <string>
14 #include <vector>
15 
16 #include "eckit/config/Configuration.h"
17 #include "eckit/config/LocalConfiguration.h"
18 #include "eckit/config/YAMLConfiguration.h"
19 #include "eckit/filesystem/PathName.h"
20 
21 #include "oops/util/abor1_cpp.h"
22 #include "oops/util/Logger.h"
23 #include "oops/util/Printable.h"
24 
25 namespace eckit {
26  class Configuration;
27 }
28 
29 namespace fv3jedi {
30 
31  // -----------------------------------------------------------------------------------------------
32 
33  class FieldMetadata : public util::Printable {
34  public:
35  explicit FieldMetadata(const std::string fieldIOName) {
36  fieldIOName_ = fieldIOName;
37  }
38 
39  // FieldIOName
40  std::string getFieldIOName() const {return fieldIOName_;}
41  void setFieldIOName(std::string fieldIOName) {fieldIOName_ = fieldIOName;}
42 
43  // FieldName
44  std::string getFieldName() const {return fieldName_;}
45  void setFieldName(std::string fieldName) {fieldName_ = fieldName;}
46 
47  // Kind
48  std::string getKind() const {return kind_;}
49  void setKind(std::string kind) {kind_ = kind;}
50 
51  // Levels
52  int getLevels() const {return levels_;}
53  void setLevels(int levels) {levels_ = levels;}
54 
55  // LongName
56  std::string getLongName() const {return longName_;}
57  void setLongName(std::string longName) {longName_ = longName;}
58 
59  // Space
60  std::string getSpace() const {return space_;}
61  void setSpace(std::string space) {space_ = space;}
62 
63  // StaggerLoc
64  std::string getStaggerLoc() const {return staggerLoc_;}
65  void setStaggerLoc(std::string staggerLoc) {staggerLoc_ = staggerLoc;}
66 
67  // Tracer
68  bool getTracer() const {return tracer_;}
69  void setTracer(bool tracer) {tracer_ = tracer;}
70 
71  // Units
72  std::string getUnits() const {return units_;}
73  void setUnits(std::string units) {units_ = units;}
74 
75  // IO file
76  std::string getIOFile() const {return io_file_;}
77  void setIOFile(std::string io_file) {io_file_ = io_file;}
78 
79  // Validity check on kind
80  void checkKindValid(const std::string fieldIOName, const std::string kind) const {
81  auto result = std::find(kindVal_.begin(), kindVal_.end(), kind);
82  if (result == std::end(kindVal_)) {
83  oops::Log::debug() << "Key: " << fieldIOName << " failed due to invalid kind: "
84  << kind << ". Options include: " << kindVal_ << std::endl;
85  ABORT("FieldMetadata::checkKindValid failed, run again with debug prints");
86  }
87  }
88 
89  // Validity check on stagger location
90  void checkStaggerLocValid(const std::string fieldIOName, const std::string staggerLoc) const {
91  auto result = std::find(staggerLocVal_.begin(), staggerLocVal_.end(), staggerLoc);
92  if (result == std::end(staggerLocVal_)) {
93  oops::Log::debug() << "Key: " << fieldIOName << " failed due to invalid stagger location: "
94  << staggerLoc << ". Options include: " << staggerLocVal_ << std::endl;
95  ABORT("FieldMetadata::checkStaggerLocValid failed, run again with debug prints");
96  }
97  }
98 
99  // Validity check on space
100  void checkSpaceValid(const std::string fieldIOName, const std::string space) const {
101  auto result = std::find(spaceVal_.begin(), spaceVal_.end(), space);
102  if (result == std::end(spaceVal_)) {
103  oops::Log::debug() << "Key: " << fieldIOName << " failed due to invalid space: "
104  << space << ". Options include: " << spaceVal_ << std::endl;
105  ABORT("FieldMetadata::checkSpace failed, run again with debug prints");
106  }
107  }
108 
109  // Validity check on string level
110  void checkLevelValid(const std::string fieldIOName, const std::string level) const {
111  auto result = std::find(levelVal_.begin(), levelVal_.end(), level);
112  if (result == std::end(levelVal_) && is_number(level) == false) {
113  oops::Log::debug() << "Key: " << fieldIOName << " failed due to invalid level choice: "
114  << level << ". Options include: " << levelVal_ << "or an integer"
115  << std::endl;
116  ABORT("FieldMetadata::checkLevelValid failed, run again with debug prints");
117  }
118  }
119 
120  // Function to check if string is a number
121  bool is_number(const std::string& s) const {
122  return !s.empty() && std::find_if(s.begin(), s.end(), [](unsigned char c)
123  { return !std::isdigit(c); }) == s.end();
124  }
125 
126  private:
127  std::string fieldIOName_;
128  std::string fieldName_;
129  std::string kind_;
130  int levels_;
131  std::string longName_;
132  std::string staggerLoc_;
133  std::string space_;
134  bool tracer_;
135  std::string units_;
136  std::string io_file_;
137 
138  const std::vector<std::string> kindVal_ = {"double", "integer"};
139  const std::vector<std::string> levelVal_ = {"full", "half"};
140  const std::vector<std::string> spaceVal_ = {"vector", "magnitude", "direction"};
141  const std::vector<std::string> staggerLocVal_ = {"center", "eastwest", "northsouth", "corner"};
142 
143  void print(std::ostream & os) const {
144  os << " FieldIOName: " << fieldIOName_ << "\n";
145  os << " FieldName: " << fieldName_ << "\n";
146  os << " Kind: " << kind_ << "\n";
147  os << " Levels: " << levels_ << "\n";
148  os << " LongName: " << longName_ << "\n";
149  os << " Space: " << space_ << "\n";
150  os << " StaggerLocation: " << staggerLoc_ << "\n";
151  os << " Tracer: " << tracer_ << "\n";
152  os << " Units: " << units_ << "\n";
153  os << " IOFile: " << io_file_ << "\n";
154  }
155  };
156 
157  // -----------------------------------------------------------------------------------------------
158 
160  public:
161  explicit FieldsMetadata(const eckit::Configuration &);
162 
163  FieldMetadata getField(const std::string &) const;
164 
165  private:
166  std::map<std::string, FieldMetadata> fields_;
167  };
168 
169  // -----------------------------------------------------------------------------------------------
170 
171 } // namespace fv3jedi
fv3jedi::FieldMetadata::setUnits
void setUnits(std::string units)
Definition: FieldsMetadata.h:73
fv3jedi::FieldMetadata::FieldMetadata
FieldMetadata(const std::string fieldIOName)
Definition: FieldsMetadata.h:35
fv3jedi::FieldMetadata::tracer_
bool tracer_
Definition: FieldsMetadata.h:134
fv3jedi::FieldsMetadata::fields_
std::map< std::string, FieldMetadata > fields_
Definition: FieldsMetadata.h:166
fv3jedi::FieldMetadata::getTracer
bool getTracer() const
Definition: FieldsMetadata.h:68
fv3jedi::FieldMetadata::getStaggerLoc
std::string getStaggerLoc() const
Definition: FieldsMetadata.h:64
fv3jedi::FieldMetadata::units_
std::string units_
Definition: FieldsMetadata.h:135
fv3jedi::FieldMetadata::checkLevelValid
void checkLevelValid(const std::string fieldIOName, const std::string level) const
Definition: FieldsMetadata.h:110
fv3jedi::FieldMetadata::getLongName
std::string getLongName() const
Definition: FieldsMetadata.h:56
fv3jedi::FieldMetadata::kind_
std::string kind_
Definition: FieldsMetadata.h:129
fv3jedi::FieldMetadata::fieldName_
std::string fieldName_
Definition: FieldsMetadata.h:128
fv3jedi::FieldMetadata::longName_
std::string longName_
Definition: FieldsMetadata.h:131
fv3jedi::FieldMetadata::getFieldIOName
std::string getFieldIOName() const
Definition: FieldsMetadata.h:40
fv3jedi::FieldMetadata::setTracer
void setTracer(bool tracer)
Definition: FieldsMetadata.h:69
fv3jedi::FieldMetadata::space_
std::string space_
Definition: FieldsMetadata.h:133
fv3jedi::FieldMetadata::getIOFile
std::string getIOFile() const
Definition: FieldsMetadata.h:76
fv3jedi::FieldMetadata::spaceVal_
const std::vector< std::string > spaceVal_
Definition: FieldsMetadata.h:140
fv3jedi::FieldMetadata::is_number
bool is_number(const std::string &s) const
Definition: FieldsMetadata.h:121
fv3jedi::FieldMetadata::getUnits
std::string getUnits() const
Definition: FieldsMetadata.h:72
eckit
Definition: FieldsMetadata.h:25
fv3jedi::FieldMetadata::setFieldIOName
void setFieldIOName(std::string fieldIOName)
Definition: FieldsMetadata.h:41
fv3jedi::FieldMetadata::checkSpaceValid
void checkSpaceValid(const std::string fieldIOName, const std::string space) const
Definition: FieldsMetadata.h:100
fv3jedi::FieldMetadata::setIOFile
void setIOFile(std::string io_file)
Definition: FieldsMetadata.h:77
fv3jedi::FieldMetadata::setStaggerLoc
void setStaggerLoc(std::string staggerLoc)
Definition: FieldsMetadata.h:65
fv3jedi::FieldMetadata::getLevels
int getLevels() const
Definition: FieldsMetadata.h:52
fv3jedi::FieldMetadata::setSpace
void setSpace(std::string space)
Definition: FieldsMetadata.h:61
fv3jedi::FieldMetadata::checkKindValid
void checkKindValid(const std::string fieldIOName, const std::string kind) const
Definition: FieldsMetadata.h:80
fv3jedi::FieldMetadata::levels_
int levels_
Definition: FieldsMetadata.h:130
fv3jedi::FieldMetadata::getKind
std::string getKind() const
Definition: FieldsMetadata.h:48
fv3jedi::FieldMetadata::setLongName
void setLongName(std::string longName)
Definition: FieldsMetadata.h:57
fv3jedi::FieldsMetadata::FieldsMetadata
FieldsMetadata(const eckit::Configuration &)
Definition: FieldsMetadata.cc:69
fv3jedi::FieldMetadata::checkStaggerLocValid
void checkStaggerLocValid(const std::string fieldIOName, const std::string staggerLoc) const
Definition: FieldsMetadata.h:90
fv3jedi::FieldMetadata
Definition: FieldsMetadata.h:33
fv3jedi::FieldMetadata::getFieldName
std::string getFieldName() const
Definition: FieldsMetadata.h:44
fv3jedi::FieldMetadata::print
void print(std::ostream &os) const
Definition: FieldsMetadata.h:143
fv3jedi
Configuration files should be formatted as e.g.
Definition: ErrorCovariance.cc:20
fv3jedi::FieldsMetadata::getField
FieldMetadata getField(const std::string &) const
Definition: FieldsMetadata.cc:182
fv3jedi::FieldMetadata::setLevels
void setLevels(int levels)
Definition: FieldsMetadata.h:53
fv3jedi::FieldMetadata::kindVal_
const std::vector< std::string > kindVal_
Definition: FieldsMetadata.h:138
fv3jedi::FieldsMetadata
Definition: FieldsMetadata.h:159
fv3jedi::FieldMetadata::staggerLoc_
std::string staggerLoc_
Definition: FieldsMetadata.h:132
fv3jedi::FieldMetadata::fieldIOName_
std::string fieldIOName_
Definition: FieldsMetadata.h:127
fv3jedi::FieldMetadata::io_file_
std::string io_file_
Definition: FieldsMetadata.h:136
fv3jedi::FieldMetadata::staggerLocVal_
const std::vector< std::string > staggerLocVal_
Definition: FieldsMetadata.h:141
fv3jedi::FieldMetadata::levelVal_
const std::vector< std::string > levelVal_
Definition: FieldsMetadata.h:139
fv3jedi::FieldMetadata::setKind
void setKind(std::string kind)
Definition: FieldsMetadata.h:49
fv3jedi::FieldMetadata::setFieldName
void setFieldName(std::string fieldName)
Definition: FieldsMetadata.h:45
fv3jedi::FieldMetadata::getSpace
std::string getSpace() const
Definition: FieldsMetadata.h:60