@@ -83,54 +83,87 @@ void prepare(SatelliteFieldsConfiguration satFieldsConfig, NetcdfFile reader, Ne
8383
8484 void compute (Configuration config , NetcdfFile reader , NetcdfFileWriter writer ) throws IOException , InvalidRangeException {
8585 final SatelliteFieldsConfiguration satFieldsConfig = config .getSatelliteFields ();
86+ // @todo 2 tb/tb ensure valid range 2020-11-25
87+ final int numLayers = satFieldsConfig .get_z_dim ();
8688 final Era5Archive era5Archive = new Era5Archive (config .getNWPAuxDir ());
87- // open input time variable
88- // + read completely
89- // + convert to ERA-5 time stamps
90- // + write to MMD
91- final Array timeArray = readTimeArray (satFieldsConfig , reader );
92- final Array era5TimeArray = convertToEra5TimeStamp (timeArray );
93- writer .write (satFieldsConfig .get_nwp_time_variable_name (), era5TimeArray );
94-
95- // open longitude and latitude input variables
96- // + read completely or specified x/y subset
97- // + scale if necessary
98- final Array lonArray = readGeolocationVariable (satFieldsConfig , reader , satFieldsConfig .get_longitude_variable_name ());
99- final Array latArray = readGeolocationVariable (satFieldsConfig , reader , satFieldsConfig .get_latitude_variable_name ());
100-
101- // iterate over matchups
102- // + convert geo-region to era-5 extract
103- // + prepare interpolation context
104- final int numMatches = NetCDFUtils .getDimensionLength (FiduceoConstants .MATCHUP_COUNT , reader );
105- final int [] nwpShape = getNwpShape (satFieldsConfig , lonArray .getShape ());
106- final int [] nwpOffset = getNwpOffset (lonArray .getShape (), nwpShape );
107-
108- final Index index = era5TimeArray .getIndex ();
109- for (int m = 0 ; m < numMatches ; m ++) {
110- nwpOffset [0 ] = m ;
111- nwpShape [0 ] = 1 ; // @todo 1 tb/tb adapt to 3d variables 2020-11-24
112- final Array lonLayer = lonArray .section (nwpOffset , nwpShape );
113- final Array latLayer = latArray .section (nwpOffset , nwpShape );
114-
115- final GeoRect geoRegion = Era5PostProcessing .getGeoRegion (lonLayer , latLayer );
116- final Rectangle era5RasterPosition = Era5PostProcessing .getEra5RasterPosition (geoRegion );
117- final InterpolationContext interpolationContext = Era5PostProcessing .getInterpolationContext (lonLayer , latLayer );
118-
119- index .set (m );
120- final int era5Time = era5TimeArray .getInt (index );
121-
122- // iterate over variables
123- // + assemble variable file name
124- // - read variable data extract
125- // - interpolate (2d, 3d per layer)
126- // - store to target raster
127- final Set <String > variableKeys = variables .keySet ();
128- for (final String variableKey : variableKeys ) {
129- final String nwpFilePath = era5Archive .get (variableKey , era5Time );
89+ final VariableCache variableCache = new VariableCache (era5Archive , 52 ); // 4 * 13 variables tb 2020-11-25
90+
91+ try {
92+ // open input time variable
93+ // + read completely
94+ // + convert to ERA-5 time stamps
95+ // + write to MMD
96+ final Array timeArray = readTimeArray (satFieldsConfig , reader );
97+ final Array era5TimeArray = convertToEra5TimeStamp (timeArray );
98+ writer .write (satFieldsConfig .get_nwp_time_variable_name (), era5TimeArray );
99+
100+ // open longitude and latitude input variables
101+ // + read completely or specified x/y subset
102+ // + scale if necessary
103+ final Array lonArray = readGeolocationVariable (satFieldsConfig , reader , satFieldsConfig .get_longitude_variable_name ());
104+ final Array latArray = readGeolocationVariable (satFieldsConfig , reader , satFieldsConfig .get_latitude_variable_name ());
105+
106+ // iterate over matchups
107+ // + convert geo-region to era-5 extract
108+ // + prepare interpolation context
109+ final int numMatches = NetCDFUtils .getDimensionLength (FiduceoConstants .MATCHUP_COUNT , reader );
110+ final int [] nwpShape = getNwpShape (satFieldsConfig , lonArray .getShape ());
111+ final int [] nwpOffset = getNwpOffset (lonArray .getShape (), nwpShape );
112+
113+ final Index index = era5TimeArray .getIndex ();
114+ for (int m = 0 ; m < numMatches ; m ++) {
115+ nwpOffset [0 ] = m ;
116+ nwpShape [0 ] = 1 ; // @todo 1 tb/tb adapt to 3d variables 2020-11-24
117+ final Array lonLayer = lonArray .section (nwpOffset , nwpShape ).reduce ();
118+ final Array latLayer = latArray .section (nwpOffset , nwpShape ).reduce ();
119+
120+ final GeoRect geoRegion = Era5PostProcessing .getGeoRegion (lonLayer , latLayer );
121+ final Rectangle era5RasterPosition = Era5PostProcessing .getEra5RasterPosition (geoRegion );
122+ final InterpolationContext interpolationContext = Era5PostProcessing .getInterpolationContext (lonLayer , latLayer );
123+
124+ index .set (m );
125+ final int era5Time = era5TimeArray .getInt (index );
126+
127+ // iterate over variables
128+ // + assemble variable file name
129+ // - read variable data extract
130+ // - interpolate (2d, 3d per layer)
131+ // - store to target raster
132+ final Set <String > variableKeys = variables .keySet ();
133+ for (final String variableKey : variableKeys ) {
134+ final Variable variable = variableCache .get (variableKey , era5Time );
135+ final Array subset = readSubset (numLayers , era5RasterPosition , variableKey , variable );
136+
137+ // @todo 1 tb/tb continue here 2020-11-25
138+ final BilinearInterpolator bilinearInterpolator = interpolationContext .get (0 , 0 );
139+ }
130140 }
141+ } finally {
142+ variableCache .close ();
131143 }
132144 }
133145
146+ private Array readSubset (int numLayers , Rectangle era5RasterPosition , String variableKey , Variable variable ) throws IOException , InvalidRangeException {
147+ final int rank = variable .getRank ();
148+ Array subset ;
149+ if (rank == 3 ) {
150+ final int [] origin = new int []{0 , era5RasterPosition .y , era5RasterPosition .x };
151+ final int [] shape = new int []{1 , era5RasterPosition .height , era5RasterPosition .width };
152+ subset = variable .read (origin , shape );
153+ subset = subset .reduce ();
154+ subset = NetCDFUtils .scaleIfNecessary (variable , subset );
155+ } else if (rank == 4 ) {
156+ final int [] origin = new int []{0 , 0 , era5RasterPosition .y , era5RasterPosition .x };
157+ final int [] shape = new int []{1 , numLayers , era5RasterPosition .height , era5RasterPosition .width };
158+ subset = variable .read (origin , shape );
159+ subset = subset .reduce ();
160+ subset = NetCDFUtils .scaleIfNecessary (variable , subset );
161+ } else {
162+ throw new IOException ("variable rank invalid: " + variableKey );
163+ }
164+ return subset ;
165+ }
166+
134167 private Array readGeolocationVariable (SatelliteFieldsConfiguration satFieldsConfig , NetcdfFile reader , String lonVarName ) throws IOException , InvalidRangeException {
135168 final Variable geoVariable = NetCDFUtils .getVariable (reader , lonVarName );
136169
0 commit comments