Skip to content

Commit e109626

Browse files
author
haileyajohnson
authored
Merge pull request #601 from lesserwhirls/gribTables
GRIB table updates
2 parents 9c19f40 + b7f296c commit e109626

32 files changed

+1166
-193
lines changed

cdm-test/src/test/java/ucar/nc2/grib/TestGribCreationOptions.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,16 @@ public void testTimeUnitOption() throws Exception {
4444
* olderThan="5 min"/>
4545
*
4646
* <tdm rewrite="test" rescan="0 0/15 * * * ? *"/>
47-
* <gribConfig>
47+
* <gribConfig>TestRotatedPole
4848
* <option name="timeUnit" value="1 minute" />
4949
* </gribConfig>
5050
* </featureCollection>
5151
*/
5252

5353
String dataset = TestDir.cdmUnitTestDir + "gribCollections/hrrr/DewpointTempFromGsdHrrrrConus3surface.grib2";
5454
try (NetcdfDataset ds = NetcdfDatasets.openDataset(dataset)) {
55-
Variable v = ds.findVariable("Dewpoint_temperature_height_above_ground");
56-
Assert.assertNotNull("Dewpoint_temperature_height_above_ground", v);
55+
Variable v = ds.findVariable("DPT_height_above_ground");
56+
Assert.assertNotNull("DPT_height_above_ground", v);
5757
Dimension d = v.getDimension(0);
5858
Assert.assertEquals(57, d.getLength());
5959
}

cdm/s3/src/test/java/thredds/inventory/s3/TestMFileS3.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void bucketAndKeyGcs() throws IOException {
105105

106106
@Test
107107
public void bucketAndKeyOsdc() throws IOException {
108-
long lastModified = 1603308465000L;
108+
long lastModified = 1611593614000L;
109109
checkWithBucketAndKey(OSDC_G16_S3_OBJECT_1, OSDC_G16_OBJECT_KEY_1, null, lastModified);
110110
checkWithBucketAndKey(OSDC_G16_S3_OBJECT_1 + DELIMITER_FRAGMENT, G16_NAME_1, "/", lastModified);
111111
}

grib/src/main/java/ucar/nc2/grib/grib2/table/FslHrrrLocalTables.java

+84-25
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
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
33
* See LICENSE for license information.
44
*/
55

@@ -43,6 +43,11 @@ public ImmutableList<Parameter> getParameters() {
4343
return getLocalParameters();
4444
}
4545

46+
@Override
47+
public GribTables.Parameter getParameter(int discipline, int category, int number) {
48+
return localParams.get(makeParamId(discipline, category, number));
49+
}
50+
4651
@Override
4752
public GribTables.Parameter getParameterRaw(int discipline, int category, int number) {
4853
return localParams.get(makeParamId(discipline, category, number));
@@ -117,8 +122,60 @@ public void lookForProblems(Formatter f) {
117122
initLocalTable(f);
118123
}
119124

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+
120175
private Map<Integer, Grib2Parameter> readCsv(String resourcePath, Formatter f) {
121176
boolean header = true;
177+
int version = resourcePath.endsWith("hrrr4.csv") ? 4 : -1;
178+
122179
Map<Integer, Grib2Parameter> result = new HashMap<>(100);
123180

124181
ClassLoader cl = getClass().getClassLoader();
@@ -146,39 +203,41 @@ private Map<Integer, Grib2Parameter> readCsv(String resourcePath, Formatter f) {
146203
if ((line.isEmpty()) || line.startsWith("#")) {
147204
continue;
148205
}
149-
String[] flds = line.split(",");
150206

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;
167222
}
168223

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);
174227
if (f != null) {
175228
f.format(" %s%n", s);
176229
}
177-
if (categoryNumber > 191 || parameterNumber > 191) {
230+
if (s.getCategory() > 191 || s.getNumber() > 191) {
178231
Grib2Parameter dup = names.get(s.getName());
179232
if (dup != null && f != null) {
180233
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+
}
182241
}
183242
header = false;
184243
f.format(" DUPLICATE NAME %s and %s (%s)%n", s.getId(), dup.getId(), s.getName());

0 commit comments

Comments
 (0)