@@ -24,20 +24,20 @@ class SatelliteFields extends FieldsProcessor {
2424 private List <Dimension > dimension3d ;
2525 private Map <String , TemplateVariable > variables ;
2626
27- static Array readSubset (int numLayers , Rectangle era5RasterPosition , Variable variable ) throws IOException , InvalidRangeException {
27+ static Array readSubset (int numLayers , Rectangle era5RasterPosition , VariableCache . CacheEntry cacheEntry ) throws IOException , InvalidRangeException {
2828 Array subset ;
2929
3030 final int maxRequestedX = era5RasterPosition .x + era5RasterPosition .width - 1 ;
3131 if (era5RasterPosition .x < 0 || maxRequestedX >= RASTER_WIDTH ) {
32- subset = readVariableDataOverlapped (numLayers , era5RasterPosition , variable );
32+ subset = readVariableDataOverlapped (numLayers , era5RasterPosition , cacheEntry . array );
3333 } else {
34- subset = readVariableData (numLayers , era5RasterPosition , variable );
34+ subset = readVariableData (numLayers , era5RasterPosition , cacheEntry . array );
3535 }
3636
37- return NetCDFUtils .scaleIfNecessary (variable , subset );
37+ return NetCDFUtils .scaleIfNecessary (cacheEntry . variable , subset );
3838 }
3939
40- private static Array readVariableDataOverlapped (int numLayers , Rectangle era5RasterPosition , Variable variable ) throws IOException , InvalidRangeException {
40+ private static Array readVariableDataOverlapped (int numLayers , Rectangle era5RasterPosition , Array array ) throws IOException , InvalidRangeException {
4141 Array subset ;
4242 int xMin = 0 ;
4343 int xMax ;
@@ -53,20 +53,20 @@ private static Array readVariableDataOverlapped(int numLayers, Rectangle era5Ras
5353 leftWidth = era5RasterPosition .width - rightWidth ;
5454 }
5555 final Rectangle leftEraPos = new Rectangle (xMin , era5RasterPosition .y , leftWidth , era5RasterPosition .height );
56- final Array leftSubset = readVariableData (numLayers , leftEraPos , variable );
56+ final Array leftSubset = readVariableData (numLayers , leftEraPos , array );
5757
5858 final Rectangle rightEraPos = new Rectangle (xMax , era5RasterPosition .y , rightWidth , era5RasterPosition .height );
59- final Array rightSubset = readVariableData (numLayers , rightEraPos , variable );
59+ final Array rightSubset = readVariableData (numLayers , rightEraPos , array );
6060
61- subset = mergeData (leftSubset , rightSubset , numLayers , era5RasterPosition , variable );
61+ subset = mergeData (leftSubset , rightSubset , numLayers , era5RasterPosition , array );
6262 return subset ;
6363 }
6464
65- static Array mergeData (Array leftSubset , Array rightSubset , int numLayers , Rectangle era5RasterPosition , Variable variable ) {
66- final int rank = variable .getRank ();
65+ static Array mergeData (Array leftSubset , Array rightSubset , int numLayers , Rectangle era5RasterPosition , Array array ) {
66+ final int rank = array .getRank ();
6767 final Array mergedArray ;
6868 if (rank == 4 ) {
69- mergedArray = Array .factory (variable .getDataType (), new int []{numLayers , era5RasterPosition .height , era5RasterPosition .width });
69+ mergedArray = Array .factory (array .getDataType (), new int []{numLayers , era5RasterPosition .height , era5RasterPosition .width });
7070 if (era5RasterPosition .x < 0 ) {
7171 final int xMax = era5RasterPosition .width + era5RasterPosition .x ;
7272 mergeArrays_3D (leftSubset , rightSubset , era5RasterPosition , mergedArray , xMax );
@@ -75,7 +75,7 @@ static Array mergeData(Array leftSubset, Array rightSubset, int numLayers, Recta
7575 mergeArrays_3D (rightSubset , leftSubset , era5RasterPosition , mergedArray , xMax );
7676 }
7777 } else {
78- mergedArray = Array .factory (variable .getDataType (), new int []{era5RasterPosition .height , era5RasterPosition .width });
78+ mergedArray = Array .factory (array .getDataType (), new int []{era5RasterPosition .height , era5RasterPosition .width });
7979 if (era5RasterPosition .x < 0 ) {
8080 final int xMax = era5RasterPosition .width + era5RasterPosition .x ;
8181 mergeArrays (leftSubset , rightSubset , era5RasterPosition , mergedArray , xMax );
@@ -141,24 +141,23 @@ private static void mergeArrays_3D(Array leftSubset, Array rightSubset, Rectangl
141141 }
142142 }
143143
144- private static Array readVariableData (int numLayers , Rectangle era5RasterPosition , Variable variable ) throws IOException , InvalidRangeException {
145- final int rank = variable .getRank ();
144+ private static Array readVariableData (int numLayers , Rectangle era5RasterPosition , Array array ) throws IOException , InvalidRangeException {
145+ final int rank = array .getRank ();
146146 Array subset ;
147- if (rank == 3 ) {
147+ if (rank == 2 ) {
148+ final int [] origin = new int []{era5RasterPosition .y , era5RasterPosition .x };
149+ final int [] shape = new int []{era5RasterPosition .height , era5RasterPosition .width };
150+ final int [] stride = new int []{1 , 1 };
151+ subset = array .sectionNoReduce (origin , shape , stride );
152+ } else if (rank == 3 ) {
148153 final int [] origin = new int []{0 , era5RasterPosition .y , era5RasterPosition .x };
149- final int [] shape = new int []{1 , era5RasterPosition .height , era5RasterPosition .width };
150- subset = variable .read (origin , shape );
151- } else if (rank == 4 ) {
152- final int [] origin = new int []{0 , 0 , era5RasterPosition .y , era5RasterPosition .x };
153- final int [] shape = new int []{1 , numLayers , era5RasterPosition .height , era5RasterPosition .width };
154- subset = variable .read (origin , shape );
154+ final int [] shape = new int []{numLayers , era5RasterPosition .height , era5RasterPosition .width };
155+ final int [] stride = new int []{1 , 1 , 1 };
156+ subset = array .sectionNoReduce (origin , shape , stride );
155157 } else {
156- throw new IOException ("variable rank invalid: " + variable . getShortName () );
158+ throw new IOException ("variable rank invalid" );
157159 }
158160
159- // remove the time dimension of length 1 tb 2021-01-14
160- subset = subset .reduce (0 );
161-
162161 return subset ;
163162 }
164163
@@ -182,7 +181,7 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
182181 final SatelliteFieldsConfiguration satFieldsConfig = config .getSatelliteFields ();
183182 final int numLayers = satFieldsConfig .get_z_dim ();
184183 final Era5Archive era5Archive = new Era5Archive (config .getNWPAuxDir ());
185- final VariableCache variableCache = new VariableCache (era5Archive , 52 ); // 4 * 13 variables tb 2020-11-25
184+ final VariableCache variableCache = new VariableCache (era5Archive , 156 ); // 4 * 13 variables tb 2020-11-25
186185
187186 try {
188187 // open input time variable
@@ -240,8 +239,8 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
240239 // - store to target raster
241240 final Set <String > variableKeys = variables .keySet ();
242241 for (final String variableKey : variableKeys ) {
243- final Variable variable = variableCache .get (variableKey , era5Time );
244- final Array subset = readSubset (numLayers , layerRegion , variable );
242+ VariableCache . CacheEntry cacheEntry = variableCache .get (variableKey , era5Time );
243+ final Array subset = readSubset (numLayers , layerRegion , cacheEntry );
245244 final Index subsetIndex = subset .getIndex ();
246245
247246 final Array targetArray = targetArrays .get (variableKey );
0 commit comments