Skip to content

Commit e3ad0f8

Browse files
committed
implement satellite fields extraction
1 parent abfa2d8 commit e3ad0f8

File tree

2 files changed

+44
-16
lines changed

2 files changed

+44
-16
lines changed

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/SatelliteFields.java

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -102,17 +102,21 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
102102
final Array lonArray = readGeolocationVariable(satFieldsConfig, reader, satFieldsConfig.get_longitude_variable_name());
103103
final Array latArray = readGeolocationVariable(satFieldsConfig, reader, satFieldsConfig.get_latitude_variable_name());
104104

105-
// iterate over matchups
106-
// + convert geo-region to era-5 extract
107-
// + prepare interpolation context
105+
// prepare data
106+
// + calculate dimensions
107+
// - allocate target data arrays
108108
final int numMatches = NetCDFUtils.getDimensionLength(FiduceoConstants.MATCHUP_COUNT, reader);
109109
final int[] nwpShape = getNwpShape(satFieldsConfig, lonArray.getShape());
110-
nwpShape[0] = 1; // we read matchup layer by layer
111110
final int[] nwpOffset = getNwpOffset(lonArray.getShape(), nwpShape);
111+
final HashMap<String, Array> targetArrays = allocateTargetData(writer);
112112

113+
// iterate over matchups
114+
// + convert geo-region to era-5 extract
115+
// + prepare interpolation context
113116
final Index timeIndex = era5TimeArray.getIndex();
114117
for (int m = 0; m < numMatches; m++) {
115118
nwpOffset[0] = m;
119+
nwpShape[0] = 1; // we read matchups layer by layer
116120

117121
final Array lonLayer = lonArray.section(nwpOffset, nwpShape).reduce();
118122
final Array latLayer = latArray.section(nwpOffset, nwpShape).reduce();
@@ -139,10 +143,8 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
139143
final Array subset = readSubset(numLayers, layerRegion, variableKey, variable);
140144
final Index subsetIndex = subset.getIndex();
141145

142-
// final TemplateVariable templateVariable = variables.get(variableKey);
143-
// final Variable targetVariable = writer.findVariable(templateVariable.getName());
144-
// final Array targetArray = Array.factory(subset.getDataType(), subset.getShape());
145-
// final Index targetIndex = targetArray.getIndex();
146+
final Array targetArray = targetArrays.get(variableKey);
147+
final Index targetIndex = targetArray.getIndex();
146148

147149
final int rank = subset.getRank();
148150
if (rank == 2) {
@@ -165,8 +167,8 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
165167
final float c11 = subset.getFloat(subsetIndex);
166168

167169
final double interpolate = interpolator.interpolate(c00, c01, c10, c11);
168-
// targetIndex.set(y, x);
169-
// targetArray.setFloat(targetIndex, (float) interpolate);
170+
targetIndex.set(m, y, x);
171+
targetArray.setFloat(targetIndex, (float) interpolate);
170172
}
171173
}
172174
} else if (rank == 3) {
@@ -190,22 +192,38 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
190192
final float c11 = subset.getFloat(subsetIndex);
191193

192194
final double interpolate = interpolator.interpolate(c00, c01, c10, c11);
193-
// targetIndex.set(z, y, x);
194-
// targetArray.setFloat(targetIndex, (float) interpolate);
195+
targetIndex.set(m, z, y, x);
196+
targetArray.setFloat(targetIndex, (float) interpolate);
195197
}
196198
}
197199
}
198200
} else {
199201
throw new IllegalStateException("Unexpected variable rank: " + rank + " " + variableKey);
200202
}
201-
// writer.write(targetVariable, targetArray);
203+
204+
final TemplateVariable templateVariable = variables.get(variableKey);
205+
final Variable targetVariable = writer.findVariable(templateVariable.getName());
206+
writer.write(targetVariable, targetArray);
202207
}
203208
}
204209
} finally {
205210
variableCache.close();
206211
}
207212
}
208213

214+
private HashMap<String, Array> allocateTargetData(NetcdfFileWriter writer) {
215+
final HashMap<String, Array> targetArrays = new HashMap<>();
216+
final Set<Map.Entry<String, TemplateVariable>> entries = variables.entrySet();
217+
for (final Map.Entry<String, TemplateVariable> entry : entries) {
218+
final TemplateVariable templateVariable = entry.getValue();
219+
final Variable variable = writer.findVariable(templateVariable.getName());
220+
final Array targetArray = Array.factory(DataType.FLOAT, variable.getShape());
221+
targetArrays.put(entry.getKey(), targetArray);
222+
}
223+
224+
return targetArrays;
225+
}
226+
209227
private Array readSubset(int numLayers, Rectangle era5RasterPosition, String variableKey, Variable variable) throws IOException, InvalidRangeException {
210228
final int rank = variable.getRank();
211229
Array subset;
@@ -319,7 +337,7 @@ private void setDimensions(SatelliteFieldsConfiguration satFieldsConfig, NetcdfF
319337
dimension2d.add(xDim);
320338

321339
dimension3d = new ArrayList<>();
322-
dimension2d.add(matchupDim);
340+
dimension3d.add(matchupDim);
323341
dimension3d.add(zDim);
324342
dimension3d.add(yDim);
325343
dimension3d.add(xDim);

post-processing-tool/src/test/java/com/bc/fiduceo/post/PostProcessingToolIntegrationTest_Era5.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,27 @@ public void testAddEra5Variables() throws IOException, InvalidRangeException {
9090
//
9191
variable = NCTestUtils.getVariable("nwp_q", mmd);
9292
NCTestUtils.assertAttribute(variable, "units", "kg kg**-1");
93-
// NCTestUtils.assert3DValueDouble(2, 0, 0, 183.0, variable);
94-
// NCTestUtils.assert3DValueDouble(3, 0, 0, 177.0, variable);
93+
NCTestUtils.assert4DVariable(variable.getFullName(), 2, 0, 0, 0, 2.067875129796448E-6, mmd);
94+
NCTestUtils.assert4DVariable(variable.getFullName(), 2, 0, 10, 0, 4.002843979833415E-6, mmd);
95+
NCTestUtils.assert4DVariable(variable.getFullName(), 2, 0, 20, 0, 3.6158501188765513E-6, mmd);
9596

9697
variable = NCTestUtils.getVariable("nwp_lnsp", mmd);
9798
NCTestUtils.assertAttribute(variable, "long_name", "Logarithm of surface pressure");
99+
NCTestUtils.assert3DValueDouble(3, 1, 1, 11.514025688171387, variable);
100+
NCTestUtils.assert3DValueDouble(3, 2, 1, 11.513952255249023, variable);
101+
NCTestUtils.assert3DValueDouble(3, 3, 1, 11.513876914978027, variable);
98102

99103
variable = NCTestUtils.getVariable("nwp_v10", mmd);
100104
assertNull(variable.findAttribute("standard_name"));
105+
NCTestUtils.assert3DValueDouble(4, 2, 2, 3.7464919090270996, variable);
106+
NCTestUtils.assert3DValueDouble(4, 3, 2, 3.842674493789673, variable);
107+
NCTestUtils.assert3DValueDouble(4, 4, 2, 3.5886740684509277, variable);
101108

102109
variable = NCTestUtils.getVariable("nwp_sst", mmd);
103110
NCTestUtils.assertAttribute(variable, "_FillValue", "9.969209968386869E36");
111+
NCTestUtils.assert3DValueDouble(0, 3, 3, 271.46014404296875, variable);
112+
NCTestUtils.assert3DValueDouble(0, 4, 3, 271.46014404296875, variable);
113+
NCTestUtils.assert3DValueDouble(0, 5, 3, 271.46014404296875, variable);
104114

105115
variable = NCTestUtils.getVariable("era5-time", mmd);
106116
NCTestUtils.assertAttribute(variable, "units", "seconds since 1970-01-01");

0 commit comments

Comments
 (0)