@@ -36,6 +36,36 @@ static int toEra5TimeStamp(int utc1970Seconds) {
3636 return (int ) (utcCalendar .getTimeInMillis () / 1000L );
3737 }
3838
39+ static int [] getNwpOffset (int [] shape , int [] nwpShape ) {
40+ final int yOffset = shape [1 ] / 2 - nwpShape [1 ] / 2 ;
41+ final int xOffset = shape [2 ] / 2 - nwpShape [2 ] / 2 ;
42+ return new int []{0 , yOffset , xOffset };
43+ }
44+
45+ static int [] getNwpShape (SatelliteFieldsConfiguration satFieldsConfig , int [] shape ) {
46+ int xExtract = satFieldsConfig .get_x_dim ();
47+ int yExtract = satFieldsConfig .get_y_dim ();
48+ if (yExtract >= shape [1 ]) {
49+ yExtract = shape [1 ];
50+ }
51+ if (xExtract >= shape [2 ]) {
52+ xExtract = shape [2 ];
53+ }
54+ return new int []{shape [0 ], yExtract , xExtract };
55+ }
56+
57+ static Array convertToEra5TimeStamp (Array timeArray ) {
58+ final Array era5TimeArray = Array .factory (timeArray .getDataType (), timeArray .getShape ());
59+ final IndexIterator era5Iterator = era5TimeArray .getIndexIterator ();
60+ final IndexIterator indexIterator = timeArray .getIndexIterator ();
61+ while (indexIterator .hasNext () && era5Iterator .hasNext ()) {
62+ final int satelliteTime = indexIterator .getIntNext ();
63+ final int era5Time = toEra5TimeStamp (satelliteTime );
64+ era5Iterator .setIntNext (era5Time );
65+ }
66+ return era5TimeArray ;
67+ }
68+
3969 void prepare (SatelliteFieldsConfiguration satFieldsConfig , NetcdfFile reader , NetcdfFileWriter writer ) {
4070 setDimensions (satFieldsConfig , writer , reader );
4171
@@ -53,7 +83,7 @@ void prepare(SatelliteFieldsConfiguration satFieldsConfig, NetcdfFile reader, Ne
5383
5484 void compute (Configuration config , NetcdfFile reader , NetcdfFileWriter writer ) throws IOException , InvalidRangeException {
5585 final SatelliteFieldsConfiguration satFieldsConfig = config .getSatelliteFields ();
56- final ArchiveUtils archiveUtils = new ArchiveUtils (config .getNWPAuxDir ());
86+ final Era5Archive era5Archive = new Era5Archive (config .getNWPAuxDir ());
5787 // open input time variable
5888 // + read completely
5989 // + convert to ERA-5 time stamps
@@ -72,14 +102,15 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
72102 // + convert geo-region to era-5 extract
73103 // + prepare interpolation context
74104 final int numMatches = NetCDFUtils .getDimensionLength (FiduceoConstants .MATCHUP_COUNT , reader );
75- final int [] shape = lonArray .getShape ();
76- final int [] size = { 1 , shape [ 1 ], shape [ 2 ]} ;
105+ final int [] nwpShape = getNwpShape ( satFieldsConfig , lonArray .getShape () );
106+ final int [] nwpOffset = getNwpOffset ( lonArray . getShape (), nwpShape ) ;
77107
78108 final Index index = era5TimeArray .getIndex ();
79109 for (int m = 0 ; m < numMatches ; m ++) {
80- final int [] offsets = {m , 0 , 0 };
81- final Array lonLayer = lonArray .section (offsets , size );
82- final Array latLayer = latArray .section (offsets , size );
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 );
83114
84115 final GeoRect geoRegion = Era5PostProcessing .getGeoRegion (lonLayer , latLayer );
85116 final Rectangle era5RasterPosition = Era5PostProcessing .getEra5RasterPosition (geoRegion );
@@ -89,36 +120,26 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
89120 final int era5Time = era5TimeArray .getInt (index );
90121
91122 // iterate over variables
92- // - assemble variable file name
123+ // + assemble variable file name
93124 // - read variable data extract
94125 // - interpolate (2d, 3d per layer)
95126 // - store to target raster
96127 final Set <String > variableKeys = variables .keySet ();
97128 for (final String variableKey : variableKeys ) {
98- final String nwpFilePath = archiveUtils .get (variableKey , era5Time );
129+ final String nwpFilePath = era5Archive .get (variableKey , era5Time );
99130 }
100131 }
101132 }
102133
103134 private Array readGeolocationVariable (SatelliteFieldsConfiguration satFieldsConfig , NetcdfFile reader , String lonVarName ) throws IOException , InvalidRangeException {
104135 final Variable geoVariable = NetCDFUtils .getVariable (reader , lonVarName );
105136
106- int xExtract = satFieldsConfig .get_x_dim ();
107- int yExtract = satFieldsConfig .get_y_dim ();
108-
109137 final int [] shape = geoVariable .getShape ();
110- if (yExtract >= shape [1 ]) {
111- yExtract = shape [1 ];
112- }
113- if (xExtract >= shape [2 ]) {
114- xExtract = shape [2 ];
115- }
116138
117- final int yOffset = shape [1 ] / 2 - yExtract / 2 ;
118- final int xOffset = shape [2 ] / 2 - xExtract / 2 ;
119- final int [] offset = {0 , yOffset , xOffset };
139+ final int [] nwpShape = getNwpShape (satFieldsConfig , shape );
140+ final int [] offset = getNwpOffset (shape , nwpShape );
120141
121- Array rawData = geoVariable .read (offset , new int []{ shape [ 0 ], yExtract , xExtract } );
142+ Array rawData = geoVariable .read (offset , nwpShape );
122143
123144 final double scaleFactor = NetCDFUtils .getScaleFactor (geoVariable );
124145 final double addOffset = NetCDFUtils .getOffset (geoVariable );
@@ -129,18 +150,6 @@ private Array readGeolocationVariable(SatelliteFieldsConfiguration satFieldsConf
129150 return rawData ;
130151 }
131152
132- static Array convertToEra5TimeStamp (Array timeArray ) {
133- final Array era5TimeArray = Array .factory (timeArray .getDataType (), timeArray .getShape ());
134- final IndexIterator era5Iterator = era5TimeArray .getIndexIterator ();
135- final IndexIterator indexIterator = timeArray .getIndexIterator ();
136- while (indexIterator .hasNext () && era5Iterator .hasNext ()) {
137- final int satelliteTime = indexIterator .getIntNext ();
138- final int era5Time = toEra5TimeStamp (satelliteTime );
139- era5Iterator .setIntNext (era5Time );
140- }
141- return era5TimeArray ;
142- }
143-
144153 private Array readTimeArray (SatelliteFieldsConfiguration satFieldsConfig , NetcdfFile reader ) throws IOException , InvalidRangeException {
145154 final String timeVariableName = satFieldsConfig .get_time_variable_name ();
146155 final Variable timeVariable = NetCDFUtils .getVariable (reader , timeVariableName );
0 commit comments