FV3-JEDI
FieldsMetadata.cc
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 // -------------------------------------------------------------------------------------------------
9 
10 /*!
11  Configuration files should be formatted as e.g.:
12 
13  Fields:
14  - FieldName: ud
15  FieldIONames: [u, ud, U]
16  Kind: double
17  Levels: full
18  LongName: u_component_of_native_D_grid_wind
19  Space: vector
20  StaggerLoc: northsouth
21  Tracer: false
22  Units: ms-1
23  IOFile: core
24 
25  - FieldName: t
26  FieldIONames: [t, T, air_temperature]
27  Kind: double
28  Levels: full
29  LongName: air_temperature
30  Space: magnitude
31  StaggerLoc: center
32  Tracer: false
33  Units: K
34  IOFile: core
35 
36  FieldName: The name that the interface recognizes a field as. E.g. if a field needs to be
37  accessed in a variable change this is the name that is used to do so.
38  FieldIONames: Name used by the model and in the files. There can be multiple options per
39  FieldName.
40  Kind: What kind of data, 'double', 'integer' (default: double)
41  Levels: Can be 'full' (nz), 'half' (nz+1) or a number. (Default: full)
42  LongName: Long name written to output files (default: FieldName)
43  Space: Where the field represents a 'vector', a 'magnitude' or a 'direction'
44  (default: magnitude)
45  StaggerLoc: Horizontal staggering location, options are 'center', 'northsouth', 'eastwest' or
46  'corner' (default: center)
47  Tracer: Boolean of whether or nor the field is a tracer (default: false)
48  Units: Units of the field, can be 1 for dimensionless
49  IOFile: Optional; can be core, tracer, sfcd, sfcw; determines which restart file to
50  read the field from. Default will be defined in IO/fv3jedi_io_<gfs|geos>_mod.f90
51 
52  If no default the metadata must be provided below.
53 */
54 
55 // -------------------------------------------------------------------------------------------------
56 
57 #include <iostream>
58 #include <map>
59 #include <utility>
60 
62 
63 // -------------------------------------------------------------------------------------------------
64 
65 namespace fv3jedi {
66 
67  // -----------------------------------------------------------------------------------------------
68 
69  FieldsMetadata::FieldsMetadata(const eckit::Configuration & confFull) {
70  // Local versions
71  std::string fieldIOName;
72  std::string fieldName;
73  std::string kind;
74  std::string levels_str;
75  std::string longName;
76  std::string space;
77  std::string staggerLoc;
78  bool tracer;
79  std::string units;
80  std::string io_file;
81 
82  // List of field sets
83  std::vector<eckit::LocalConfiguration> confFieldSets;
84  confFull.get("fieldsets", confFieldSets);
85  int confFieldSetsSize = confFieldSets.size();
86 
87  // Get number of vertical levels
88  const int nlev = confFull.getInt("npz");
89 
90  // Loop over sets of fields, i.e. each yaml file
91  for (int km = 0; km < confFieldSetsSize; ++km) {
92  // Create new config for each field set
93  eckit::PathName pathNameFieldSet(confFieldSets[km].getString("fieldset"));
94  const eckit::YAMLConfiguration confFieldSet(pathNameFieldSet);
95 
96  // List of fields
97  std::vector<eckit::LocalConfiguration> confFields;
98  confFieldSet.get("Fields", confFields);
99  int confFieldsSize = confFields.size();
100 
101  // Loop over fields
102  for (int jm = 0; jm < confFieldsSize; ++jm) {
103  // List of potential names, default is FieldName
104  fieldName = confFields[jm].getString("FieldName");
105 
106  std::vector<std::string> fieldIONames;
107  fieldIONames.push_back(fieldName);
108  fieldIONames = confFields[jm].getStringVector("FieldIONames", fieldIONames);
109 
110  int confFieldIONamesSize = fieldIONames.size();
111 
112  // Loop over potential field names
113  for (int im = 0; im < confFieldIONamesSize; ++im) {
114  // Insert new field
115  fieldIOName = fieldIONames[im];
116 
117  // Assertion that field not already in the map
118  if ( fields_.find(fieldIOName) != fields_.end() ) {
119  ABORT("FieldMetadata::FieldMetadata Field "+fieldIOName+" already in the map");
120  }
121 
122  fields_.insert(std::pair<std::string, FieldMetadata>(fieldIOName,
123  FieldMetadata(fieldIOName)));
124 
125  // Pointer to current
126  FieldMetadata& fieldmetadata = fields_.find(fieldIOName)->second;
127 
128  // Push other metadata
129  // -------------------
130 
131  kind = confFields[jm].getString("Kind", "double");
132  levels_str = confFields[jm].getString("Levels", "full");
133  longName = confFields[jm].getString("LongName", fieldName);
134  space = confFields[jm].getString("Space", "magnitude");
135  staggerLoc = confFields[jm].getString("StaggerLoc", "center");
136  tracer = confFields[jm].getBool("Tracer", false);
137  units = confFields[jm].getString("Units");
138  io_file = confFields[jm].getString("IOFile", "default");
139 
140  // Check for valid choices
141  fieldmetadata.checkKindValid(fieldIOName, kind);
142  fieldmetadata.checkSpaceValid(fieldIOName, space);
143  fieldmetadata.checkStaggerLocValid(fieldIOName, staggerLoc);
144  fieldmetadata.checkLevelValid(fieldIOName, levels_str);
145 
146  // Convert string levels to integer levels
147  int levels;
148 
149  if (levels_str == "full") {
150  levels = nlev;
151  } else if (levels_str == "half") {
152  levels = nlev + 1;
153  } else {
154  levels = std::stoi(levels_str);
155  }
156 
157  fieldmetadata.setFieldName(fieldName);
158  fieldmetadata.setKind(kind);
159  fieldmetadata.setLevels(levels);
160  fieldmetadata.setLongName(longName);
161  fieldmetadata.setSpace(space);
162  fieldmetadata.setStaggerLoc(staggerLoc);
163  fieldmetadata.setTracer(tracer);
164  fieldmetadata.setUnits(units);
165  fieldmetadata.setIOFile(io_file);
166  } // End loop over potential field names
167  } // End loop over fields
168  } // End loop over field sets
169 
170 
171  // Prints for debugging
172  // --------------------
173  std::map<std::string, FieldMetadata>::iterator itr;
174 
175  for (itr = fields_.begin(); itr != fields_.end(); ++itr) {
176  oops::Log::debug() << "Key: " << itr->first << "\nData: \n" << itr->second << std::endl;
177  }
178  }
179 
180  // -----------------------------------------------------------------------------------------------
181 
182  FieldMetadata FieldsMetadata::getField(const std::string & fieldIOName) const {
183  if ( fields_.find(fieldIOName) == fields_.end() ) {
184  ABORT("FieldMetadata::getField: Field "+fieldIOName+" not found in FieldsMetadata");
185  }
186  return fields_.find(fieldIOName)->second;
187  }
188 
189  // -----------------------------------------------------------------------------------------------
190 
191 } // namespace fv3jedi
192 
193 // -------------------------------------------------------------------------------------------------
fv3jedi::FieldMetadata::setUnits
void setUnits(std::string units)
Definition: FieldsMetadata.h:73
fv3jedi::FieldsMetadata::fields_
std::map< std::string, FieldMetadata > fields_
Definition: FieldsMetadata.h:166
fv3jedi::FieldMetadata::checkLevelValid
void checkLevelValid(const std::string fieldIOName, const std::string level) const
Definition: FieldsMetadata.h:110
fv3jedi::FieldMetadata::setTracer
void setTracer(bool tracer)
Definition: FieldsMetadata.h:69
FieldsMetadata.h
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::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::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
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::setKind
void setKind(std::string kind)
Definition: FieldsMetadata.h:49
fv3jedi::FieldMetadata::setFieldName
void setFieldName(std::string fieldName)
Definition: FieldsMetadata.h:45