|
1 | 1 | /*
|
2 |
| - * Copyright (c) 1998-2018 John Caron and University Corporation for Atmospheric Research/Unidata |
| 2 | + * Copyright (c) 1998-2020 John Caron and University Corporation for Atmospheric Research/Unidata |
3 | 3 | * See LICENSE for license information.
|
4 | 4 | */
|
5 | 5 |
|
@@ -43,6 +43,11 @@ public ImmutableList<Parameter> getParameters() {
|
43 | 43 | return getLocalParameters();
|
44 | 44 | }
|
45 | 45 |
|
| 46 | + @Override |
| 47 | + public GribTables.Parameter getParameter(int discipline, int category, int number) { |
| 48 | + return localParams.get(makeParamId(discipline, category, number)); |
| 49 | + } |
| 50 | + |
46 | 51 | @Override
|
47 | 52 | public GribTables.Parameter getParameterRaw(int discipline, int category, int number) {
|
48 | 53 | return localParams.get(makeParamId(discipline, category, number));
|
@@ -117,8 +122,60 @@ public void lookForProblems(Formatter f) {
|
117 | 122 | initLocalTable(f);
|
118 | 123 | }
|
119 | 124 |
|
| 125 | + private static Grib2Parameter parseVersion4(String[] flds, Formatter f) { |
| 126 | + // V4: |
| 127 | + // Record, MasterTable, LocalTable, Discipline, Category, Parameter, WGrib2Name, NCLName, |
| 128 | + // FieldType, VerticalLevels, Units, |
| 129 | + String recordNumber = flds[0].trim(); |
| 130 | + int masterTableNumber = Integer.parseInt(flds[1].trim()); |
| 131 | + int localTableNumber = Integer.parseInt(flds[2].trim()); |
| 132 | + int disciplineNumber = Integer.parseInt(flds[3].trim()); |
| 133 | + int categoryNumber = Integer.parseInt(flds[4].trim()); |
| 134 | + int parameterNumber = Integer.parseInt(flds[5].trim()); |
| 135 | + |
| 136 | + String WGrib2Name = flds[6].trim(); |
| 137 | + String NCLName = flds[7].trim(); |
| 138 | + String FieldType = flds[8].trim(); // closest we have to a description in version 4 of the FSL table |
| 139 | + String VerticalLevels = flds[9].trim(); |
| 140 | + String Units = flds[10].trim(); |
| 141 | + if (f != null) { |
| 142 | + f.format("%3s %3d %3d %3d %3d %3d %-10s %-25s %-30s %-100s %-20s%n", recordNumber, masterTableNumber, |
| 143 | + localTableNumber, disciplineNumber, categoryNumber, parameterNumber, WGrib2Name, NCLName, FieldType, |
| 144 | + VerticalLevels, Units); |
| 145 | + } |
| 146 | + |
| 147 | + String name = !WGrib2Name.equals("var") ? WGrib2Name : FieldType; |
| 148 | + return new Grib2Parameter(disciplineNumber, categoryNumber, parameterNumber, name, Units, null, FieldType); |
| 149 | + } |
| 150 | + |
| 151 | + private static Grib2Parameter parsePre4(String[] flds, Formatter f) { |
| 152 | + // v1, v2: |
| 153 | + // RecordNumber, TableNumber, DisciplineNumber, CategoryNumber, ParameterNumber, WGrib2Name, NCLName, |
| 154 | + // FieldType, Description, Units, |
| 155 | + String recordNumber = flds[0].trim(); |
| 156 | + int tableNumber = Integer.parseInt(flds[1].trim()); |
| 157 | + int disciplineNumber = Integer.parseInt(flds[2].trim()); |
| 158 | + int categoryNumber = Integer.parseInt(flds[3].trim()); |
| 159 | + int parameterNumber = Integer.parseInt(flds[4].trim()); |
| 160 | + |
| 161 | + String WGrib2Name = flds[5].trim(); |
| 162 | + String NCLName = flds[6].trim(); |
| 163 | + String FieldType = flds[7].trim(); |
| 164 | + String Description = flds[8].trim(); |
| 165 | + String Units = flds[9].trim(); |
| 166 | + if (f != null) { |
| 167 | + f.format("%3s %3d %3d %3d %3d %-10s %-25s %-30s %-100s %-20s%n", recordNumber, tableNumber, disciplineNumber, |
| 168 | + categoryNumber, parameterNumber, WGrib2Name, NCLName, FieldType, Description, Units); |
| 169 | + } |
| 170 | + |
| 171 | + String name = !WGrib2Name.equals("var") ? WGrib2Name : FieldType; |
| 172 | + return new Grib2Parameter(disciplineNumber, categoryNumber, parameterNumber, name, Units, null, Description); |
| 173 | + } |
| 174 | + |
120 | 175 | private Map<Integer, Grib2Parameter> readCsv(String resourcePath, Formatter f) {
|
121 | 176 | boolean header = true;
|
| 177 | + int version = resourcePath.endsWith("hrrr4.csv") ? 4 : -1; |
| 178 | + |
122 | 179 | Map<Integer, Grib2Parameter> result = new HashMap<>(100);
|
123 | 180 |
|
124 | 181 | ClassLoader cl = getClass().getClassLoader();
|
@@ -146,39 +203,41 @@ private Map<Integer, Grib2Parameter> readCsv(String resourcePath, Formatter f) {
|
146 | 203 | if ((line.isEmpty()) || line.startsWith("#")) {
|
147 | 204 | continue;
|
148 | 205 | }
|
149 |
| - String[] flds = line.split(","); |
150 | 206 |
|
151 |
| - // RecordNumber, TableNumber, DisciplineNumber, CategoryNumber, ParameterNumber, WGrib2Name, NCLName, |
152 |
| - // FieldType, Description, Units, |
153 |
| - String recordNumber = flds[0].trim(); |
154 |
| - int tableNumber = Integer.parseInt(flds[1].trim()); |
155 |
| - int disciplineNumber = Integer.parseInt(flds[2].trim()); |
156 |
| - int categoryNumber = Integer.parseInt(flds[3].trim()); |
157 |
| - int parameterNumber = Integer.parseInt(flds[4].trim()); |
158 |
| - |
159 |
| - String WGrib2Name = flds[5].trim(); |
160 |
| - String NCLName = flds[6].trim(); |
161 |
| - String FieldType = flds[7].trim(); |
162 |
| - String Description = flds[8].trim(); |
163 |
| - String Units = flds[9].trim(); |
164 |
| - if (f != null) { |
165 |
| - f.format("%3s %3d %3d %3d %3d %-10s %-25s %-30s %-100s %-20s%n", recordNumber, tableNumber, |
166 |
| - disciplineNumber, categoryNumber, parameterNumber, WGrib2Name, NCLName, FieldType, Description, Units); |
| 207 | + String[] flds = line.split(","); |
| 208 | + // starting with version 4, the HRRR parameter table includes multiple tables: |
| 209 | + // HRRR 2-D Hourly |
| 210 | + // HRRR 2-D Sub-hrly |
| 211 | + // HRRR 3-D Native Level |
| 212 | + // HRRR 3-D Isobaric Level |
| 213 | + // |
| 214 | + // To make updating simple, the tables are concatenated in a single file, which leads to |
| 215 | + // the presence of multiple headers. This allows us to skip the internal headers of the csv "table". |
| 216 | + // Also, some of the subtables include garbage, like the CONUS 3-D Native Level Fields table, which has |
| 217 | + // things like: |
| 218 | + // 1-14 repeats for remaining 49 native sigma levels... |
| 219 | + // and this will allow us to skip those as well. |
| 220 | + if ((version >= 4) && (flds.length != 11) || line.startsWith("Record")) { |
| 221 | + continue; |
167 | 222 | }
|
168 | 223 |
|
169 |
| - String name = !WGrib2Name.equals("var") ? WGrib2Name : FieldType; |
170 |
| - Grib2Parameter s = |
171 |
| - new Grib2Parameter(disciplineNumber, categoryNumber, parameterNumber, name, Units, null, Description); |
172 |
| - // s.desc = Description; |
173 |
| - result.put(makeParamId(disciplineNumber, categoryNumber, parameterNumber), s); |
| 224 | + Grib2Parameter s = version == 4 ? parseVersion4(flds, f) : parsePre4(flds, f); |
| 225 | + |
| 226 | + result.put(makeParamId(s.getDiscipline(), s.getCategory(), s.getNumber()), s); |
174 | 227 | if (f != null) {
|
175 | 228 | f.format(" %s%n", s);
|
176 | 229 | }
|
177 |
| - if (categoryNumber > 191 || parameterNumber > 191) { |
| 230 | + if (s.getCategory() > 191 || s.getNumber() > 191) { |
178 | 231 | Grib2Parameter dup = names.get(s.getName());
|
179 | 232 | if (dup != null && f != null) {
|
180 | 233 | if (header) {
|
181 |
| - f.format("Problems in table %s %n", resourcePath); |
| 234 | + if (version >= 4) { |
| 235 | + // Duplicate entries are only potentially an issue in version 4 and above. |
| 236 | + // Need to examine them to know for sure. |
| 237 | + f.format("Potential problem in table %s %n", resourcePath); |
| 238 | + } else { |
| 239 | + f.format("Problems in table %s %n", resourcePath); |
| 240 | + } |
182 | 241 | }
|
183 | 242 | header = false;
|
184 | 243 | f.format(" DUPLICATE NAME %s and %s (%s)%n", s.getId(), dup.getId(), s.getName());
|
|
0 commit comments