@@ -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 );
0 commit comments