Skip to content

Commit 294d546

Browse files
committed
overlap reading for 3D data
1 parent 7a97070 commit 294d546

File tree

2 files changed

+149
-53
lines changed

2 files changed

+149
-53
lines changed

post-processing-tool/src/main/java/com/bc/fiduceo/post/plugin/era5/SatelliteFields.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,17 @@ static Array mergeData(Array leftSubset, Array rightSubset, int numLayers, Recta
6767
final Array mergedArray;
6868
if (rank == 4) {
6969
mergedArray = Array.factory(variable.getDataType(), new int[]{numLayers, era5RasterPosition.height, era5RasterPosition.width});
70+
if (era5RasterPosition.x < 0) {
71+
final int xMax = era5RasterPosition.width + era5RasterPosition.x;
72+
mergeArrays_3D(leftSubset, rightSubset, era5RasterPosition, mergedArray, xMax);
73+
} else {
74+
final int xMax = RASTER_WIDTH - era5RasterPosition.x;
75+
mergeArrays_3D(rightSubset, leftSubset, era5RasterPosition, mergedArray, xMax);
76+
}
7077
} else {
7178
mergedArray = Array.factory(variable.getDataType(), new int[]{era5RasterPosition.height, era5RasterPosition.width});
7279
if (era5RasterPosition.x < 0) {
73-
final int xMax = era5RasterPosition.width + era5RasterPosition.x;
80+
final int xMax = era5RasterPosition.width + era5RasterPosition.x;
7481
mergeArrays(leftSubset, rightSubset, era5RasterPosition, mergedArray, xMax);
7582
} else {
7683
final int xMax = RASTER_WIDTH - era5RasterPosition.x;
@@ -105,6 +112,35 @@ private static void mergeArrays(Array leftSubset, Array rightSubset, Rectangle e
105112
}
106113
}
107114

115+
private static void mergeArrays_3D(Array leftSubset, Array rightSubset, Rectangle era5RasterPosition, Array mergedArray, int xMax) {
116+
final Index targetIndex = mergedArray.getIndex();
117+
Index srcIndex = leftSubset.getIndex();
118+
int srcX = 0;
119+
final int numLayers = leftSubset.getShape()[0];
120+
for (int x = 0; x < xMax; x++) {
121+
for (int y = 0; y < era5RasterPosition.height; y++) {
122+
for (int z = 0; z < numLayers; z++) {
123+
targetIndex.set(z, y, x);
124+
srcIndex.set(z, y, srcX);
125+
mergedArray.setObject(targetIndex, leftSubset.getObject(srcIndex));
126+
}
127+
}
128+
++srcX;
129+
}
130+
srcIndex = rightSubset.getIndex();
131+
srcX = 0;
132+
for (int x = xMax; x < era5RasterPosition.width; x++) {
133+
for (int y = 0; y < era5RasterPosition.height; y++) {
134+
for (int z = 0; z < numLayers; z++) {
135+
targetIndex.set(z, y, x);
136+
srcIndex.set(z, y, srcX);
137+
mergedArray.setObject(targetIndex, rightSubset.getObject(srcIndex));
138+
}
139+
}
140+
++srcX;
141+
}
142+
}
143+
108144
private static Array readVariableData(int numLayers, Rectangle era5RasterPosition, Variable variable) throws IOException, InvalidRangeException {
109145
final int rank = variable.getRank();
110146
Array subset;

post-processing-tool/src/test/java/com/bc/fiduceo/post/plugin/era5/SatelliteFieldsTest.java

Lines changed: 112 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
import ucar.ma2.Array;
66
import ucar.ma2.DataType;
77
import ucar.ma2.Index;
8-
import ucar.nc2.*;
98
import ucar.nc2.Dimension;
9+
import ucar.nc2.NetcdfFile;
10+
import ucar.nc2.NetcdfFileWriter;
11+
import ucar.nc2.Variable;
1012

1113
import java.awt.*;
1214
import java.util.List;
1315
import java.util.Map;
1416

15-
import static org.junit.Assert.assertEquals;
16-
import static org.junit.Assert.assertFalse;
17-
import static org.junit.Assert.assertNull;
17+
import static org.junit.Assert.*;
1818
import static org.mockito.ArgumentMatchers.anyInt;
1919
import static org.mockito.ArgumentMatchers.anyString;
2020
import static org.mockito.Mockito.*;
@@ -119,29 +119,8 @@ public void testSetGetDimensions_3D() {
119119

120120
@Test
121121
public void testMergeData_2D_left() {
122-
final Array right = Array.factory(DataType.INT, new int[]{3, 1});
123-
Index index = right.getIndex();
124-
index.set(0, 0);
125-
right.setInt(index, 1);
126-
index.set(1, 0);
127-
right.setInt(index, 2);
128-
index.set(2, 0);
129-
right.setInt(index, 3);
130-
131-
final Array left = Array.factory(DataType.INT, new int[]{3, 2});
132-
index = left.getIndex();
133-
index.set(0, 0);
134-
left.setInt(index, 4);
135-
index.set(0, 1);
136-
left.setInt(index, 5);
137-
index.set(1, 0);
138-
left.setInt(index, 6);
139-
index.set(1, 1);
140-
left.setInt(index, 7);
141-
index.set(2, 0);
142-
left.setInt(index, 8);
143-
index.set(2, 1);
144-
left.setInt(index, 9);
122+
final Array right = createArray(3, 1, 1);
123+
final Array left = createArray(3, 2, 4);
145124

146125
final Variable variable = mock(Variable.class);
147126
when(variable.getRank()).thenReturn(3);
@@ -153,7 +132,7 @@ public void testMergeData_2D_left() {
153132
assertEquals(3, shape[0]);
154133
assertEquals(3, shape[1]);
155134

156-
index = merged.getIndex();
135+
final Index index = merged.getIndex();
157136
index.set(0, 0);
158137
assertEquals(4, merged.getInt(index));
159138
index.set(0, 1);
@@ -168,29 +147,8 @@ public void testMergeData_2D_left() {
168147

169148
@Test
170149
public void testMergeData_2D_right() {
171-
final Array left = Array.factory(DataType.INT, new int[]{3, 1});
172-
Index index = left.getIndex();
173-
index.set(0, 0);
174-
left.setInt(index, 6);
175-
index.set(1, 0);
176-
left.setInt(index, 7);
177-
index.set(2, 0);
178-
left.setInt(index, 8);
179-
180-
final Array right = Array.factory(DataType.INT, new int[]{3, 2});
181-
index = right.getIndex();
182-
index.set(0, 0);
183-
right.setInt(index, 0);
184-
index.set(0, 1);
185-
right.setInt(index, 1);
186-
index.set(1, 0);
187-
right.setInt(index, 2);
188-
index.set(1, 1);
189-
right.setInt(index, 3);
190-
index.set(2, 0);
191-
right.setInt(index, 4);
192-
index.set(2, 1);
193-
right.setInt(index, 5);
150+
final Array left = createArray(3, 1, 6);
151+
final Array right = createArray(3, 2, 0);
194152

195153
final Variable variable = mock(Variable.class);
196154
when(variable.getRank()).thenReturn(3);
@@ -202,7 +160,7 @@ public void testMergeData_2D_right() {
202160
assertEquals(3, shape[0]);
203161
assertEquals(3, shape[1]);
204162

205-
index = merged.getIndex();
163+
final Index index = merged.getIndex();
206164
index.set(0, 0);
207165
assertEquals(0, merged.getInt(index));
208166
index.set(0, 1);
@@ -215,6 +173,108 @@ public void testMergeData_2D_right() {
215173
verifyNoMoreInteractions(variable);
216174
}
217175

176+
@Test
177+
public void testMergeData_3D_left() {
178+
final Array right = createArray_3D(5, 3, 1, 1);
179+
final Array left = createArray_3D(5, 3, 2, 100);
180+
181+
final Variable variable = mock(Variable.class);
182+
when(variable.getRank()).thenReturn(4);
183+
when(variable.getDataType()).thenReturn(DataType.INT);
184+
185+
final Array merged = SatelliteFields.mergeData(left, right, 5, new Rectangle(-1, 100, 3, 3), variable);
186+
final int[] shape = merged.getShape();
187+
assertEquals(3, shape.length);
188+
assertEquals(5, shape[0]);
189+
assertEquals(3, shape[1]);
190+
assertEquals(3, shape[2]);
191+
192+
final Index index = merged.getIndex();
193+
index.set(0, 0, 0);
194+
assertEquals(100, merged.getInt(index));
195+
index.set(0, 0, 1);
196+
assertEquals(101, merged.getInt(index));
197+
index.set(0, 0, 2);
198+
assertEquals(1, merged.getInt(index));
199+
200+
index.set(1, 0, 0);
201+
assertEquals(106, merged.getInt(index));
202+
index.set(1, 0, 1);
203+
assertEquals(107, merged.getInt(index));
204+
index.set(1, 0, 2);
205+
assertEquals(4, merged.getInt(index));
206+
207+
verify(variable, times(1)).getRank();
208+
verify(variable, times(1)).getDataType();
209+
verifyNoMoreInteractions(variable);
210+
}
211+
212+
@Test
213+
public void testMergeData_3D_right() {
214+
final Array left = createArray_3D(6, 3, 1, 0);
215+
final Array right = createArray_3D(6, 3, 2, 100);
216+
217+
final Variable variable = mock(Variable.class);
218+
when(variable.getRank()).thenReturn(4);
219+
when(variable.getDataType()).thenReturn(DataType.INT);
220+
221+
final Array merged = SatelliteFields.mergeData(left, right, 6, new Rectangle(1438, 100, 3, 3), variable);
222+
final int[] shape = merged.getShape();
223+
assertEquals(3, shape.length);
224+
assertEquals(6, shape[0]);
225+
assertEquals(3, shape[1]);
226+
assertEquals(3, shape[1]);
227+
228+
final Index index = merged.getIndex();
229+
index.set(1, 0, 0);
230+
assertEquals(106, merged.getInt(index));
231+
index.set(1, 0, 1);
232+
assertEquals(107, merged.getInt(index));
233+
index.set(1, 0, 2);
234+
assertEquals(3, merged.getInt(index));
235+
236+
index.set(2, 0, 0);
237+
assertEquals(112, merged.getInt(index));
238+
index.set(2, 0, 1);
239+
assertEquals(113, merged.getInt(index));
240+
index.set(2, 0, 2);
241+
assertEquals(6, merged.getInt(index));
242+
243+
verify(variable, times(1)).getRank();
244+
verify(variable, times(1)).getDataType();
245+
verifyNoMoreInteractions(variable);
246+
}
247+
248+
private Array createArray(int height, int width, int start) {
249+
final Array array = Array.factory(DataType.INT, new int[]{height, width});
250+
Index index = array.getIndex();
251+
int value = start;
252+
for (int y = 0; y < height; y++) {
253+
for (int x = 0; x < width; x++) {
254+
index.set(y, x);
255+
array.setInt(index, value);
256+
++value;
257+
}
258+
}
259+
return array;
260+
}
261+
262+
private Array createArray_3D(int depth, int height, int width, int start) {
263+
final Array array = Array.factory(DataType.INT, new int[]{depth, height, width});
264+
Index index = array.getIndex();
265+
int value = start;
266+
for (int z = 0; z < depth; z++) {
267+
for (int y = 0; y < height; y++) {
268+
for (int x = 0; x < width; x++) {
269+
index.set(z, y, x);
270+
array.setInt(index, value);
271+
++value;
272+
}
273+
}
274+
}
275+
return array;
276+
}
277+
218278
private SatelliteFieldsConfiguration createConfig() {
219279
final SatelliteFieldsConfiguration config = new SatelliteFieldsConfiguration();
220280
config.set_x_dim(12);

0 commit comments

Comments
 (0)