11package com .bc .fiduceo .post .plugin .era5 ;
22
33import com .bc .fiduceo .FiduceoConstants ;
4- import com .bc .fiduceo .core .GeoRect ;
54import com .bc .fiduceo .reader .ReaderUtils ;
65import com .bc .fiduceo .util .NetCDFUtils ;
76import com .bc .fiduceo .util .TimeUtils ;
@@ -108,34 +107,98 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
108107 // + prepare interpolation context
109108 final int numMatches = NetCDFUtils .getDimensionLength (FiduceoConstants .MATCHUP_COUNT , reader );
110109 final int [] nwpShape = getNwpShape (satFieldsConfig , lonArray .getShape ());
110+ nwpShape [0 ] = 1 ; // we read matchup layer by layer
111111 final int [] nwpOffset = getNwpOffset (lonArray .getShape (), nwpShape );
112112
113- final Index index = era5TimeArray .getIndex ();
113+ final Index timeIndex = era5TimeArray .getIndex ();
114114 for (int m = 0 ; m < numMatches ; m ++) {
115115 nwpOffset [0 ] = m ;
116- nwpShape [ 0 ] = 1 ; // @todo 1 tb/tb adapt to 3d variables 2020-11-24
116+
117117 final Array lonLayer = lonArray .section (nwpOffset , nwpShape ).reduce ();
118118 final Array latLayer = latArray .section (nwpOffset , nwpShape ).reduce ();
119119
120- final GeoRect geoRegion = Era5PostProcessing .getGeoRegion (lonLayer , latLayer );
121- final Rectangle era5RasterPosition = Era5PostProcessing .getEra5RasterPosition (geoRegion );
120+ final int [] shape = lonLayer .getShape ();
121+ final int width = shape [1 ];
122+ final int height = shape [0 ];
123+
124+ //final Rectangle era5RasterPosition = Era5PostProcessing.getEra5RasterPosition(geoRegion);
122125 final InterpolationContext interpolationContext = Era5PostProcessing .getInterpolationContext (lonLayer , latLayer );
126+ final Rectangle layerRegion = interpolationContext .getEra5Region ();
123127
124- index .set (m );
125- final int era5Time = era5TimeArray .getInt (index );
128+ timeIndex .set (m );
129+ final int era5Time = era5TimeArray .getInt (timeIndex );
126130
127131 // iterate over variables
128132 // + assemble variable file name
129- // - read variable data extract
130- // - interpolate (2d, 3d per layer)
133+ // + read variable data extract
134+ // + interpolate (2d, 3d per layer)
131135 // - store to target raster
132136 final Set <String > variableKeys = variables .keySet ();
133137 for (final String variableKey : variableKeys ) {
134138 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+ final Array subset = readSubset (numLayers , layerRegion , variableKey , variable );
140+ final Index subsetIndex = subset .getIndex ();
141+
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+
147+ final int rank = subset .getRank ();
148+ if (rank == 2 ) {
149+ for (int y = 0 ; y < height ; y ++) {
150+ for (int x = 0 ; x < width ; x ++) {
151+ final BilinearInterpolator interpolator = interpolationContext .get (x , y );
152+ final int offsetX = interpolator .getXMin () - layerRegion .x ;
153+ final int offsetY = interpolator .getYMin () - layerRegion .y ;
154+
155+ subsetIndex .set (offsetY , offsetX );
156+ final float c00 = subset .getFloat (subsetIndex );
157+
158+ subsetIndex .set (offsetY , offsetX + 1 );
159+ final float c10 = subset .getFloat (subsetIndex );
160+
161+ subsetIndex .set (offsetY + 1 , offsetX );
162+ final float c01 = subset .getFloat (subsetIndex );
163+
164+ subsetIndex .set (offsetY + 1 , offsetX + 1 );
165+ final float c11 = subset .getFloat (subsetIndex );
166+
167+ final double interpolate = interpolator .interpolate (c00 , c01 , c10 , c11 );
168+ // targetIndex.set(y, x);
169+ // targetArray.setFloat(targetIndex, (float) interpolate);
170+ }
171+ }
172+ } else if (rank == 3 ) {
173+ for (int z = 0 ; z < numLayers ; z ++) {
174+ for (int y = 0 ; y < height ; y ++) {
175+ for (int x = 0 ; x < width ; x ++) {
176+ final BilinearInterpolator interpolator = interpolationContext .get (x , y );
177+ final int offsetX = interpolator .getXMin () - layerRegion .x ;
178+ final int offsetY = interpolator .getYMin () - layerRegion .y ;
179+
180+ subsetIndex .set (z , offsetY , offsetX );
181+ final float c00 = subset .getFloat (subsetIndex );
182+
183+ subsetIndex .set (z , offsetY , offsetX + 1 );
184+ final float c10 = subset .getFloat (subsetIndex );
185+
186+ subsetIndex .set (z , offsetY + 1 , offsetX );
187+ final float c01 = subset .getFloat (subsetIndex );
188+
189+ subsetIndex .set (z , offsetY + 1 , offsetX + 1 );
190+ final float c11 = subset .getFloat (subsetIndex );
191+
192+ final double interpolate = interpolator .interpolate (c00 , c01 , c10 , c11 );
193+ // targetIndex.set(z, y, x);
194+ // targetArray.setFloat(targetIndex, (float) interpolate);
195+ }
196+ }
197+ }
198+ } else {
199+ throw new IllegalStateException ("Unexpected variable rank: " + rank + " " + variableKey );
200+ }
201+ // writer.write(targetVariable, targetArray);
139202 }
140203 }
141204 } finally {
@@ -150,17 +213,16 @@ private Array readSubset(int numLayers, Rectangle era5RasterPosition, String var
150213 final int [] origin = new int []{0 , era5RasterPosition .y , era5RasterPosition .x };
151214 final int [] shape = new int []{1 , era5RasterPosition .height , era5RasterPosition .width };
152215 subset = variable .read (origin , shape );
153- subset = subset .reduce ();
154- subset = NetCDFUtils .scaleIfNecessary (variable , subset );
155216 } else if (rank == 4 ) {
156217 final int [] origin = new int []{0 , 0 , era5RasterPosition .y , era5RasterPosition .x };
157218 final int [] shape = new int []{1 , numLayers , era5RasterPosition .height , era5RasterPosition .width };
158219 subset = variable .read (origin , shape );
159- subset = subset .reduce ();
160- subset = NetCDFUtils .scaleIfNecessary (variable , subset );
161220 } else {
162221 throw new IOException ("variable rank invalid: " + variableKey );
163222 }
223+
224+ subset = subset .reduce ();
225+ subset = NetCDFUtils .scaleIfNecessary (variable , subset );
164226 return subset ;
165227 }
166228
0 commit comments