Skip to content

Commit 7a97070

Browse files
committed
overlap reading for 2D data
1 parent a9a610a commit 7a97070

File tree

3 files changed

+104
-85
lines changed

3 files changed

+104
-85
lines changed

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

Lines changed: 60 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -25,91 +25,86 @@ class SatelliteFields {
2525
private Map<String, TemplateVariable> variables;
2626

2727
static Array readSubset(int numLayers, Rectangle era5RasterPosition, Variable variable) throws IOException, InvalidRangeException {
28-
Array subset = null;
28+
Array subset;
29+
2930
final int maxRequestedX = era5RasterPosition.x + era5RasterPosition.width;
3031
if (era5RasterPosition.x < 0 || maxRequestedX >= RASTER_WIDTH) {
31-
int xMin = 0;
32-
int xMax;
33-
int leftWidth;
34-
int rightWidth;
35-
if (era5RasterPosition.x < 0) {
36-
xMax = RASTER_WIDTH + era5RasterPosition.x; // notabene: rasterposition is negative tb 2021-01-13
37-
leftWidth = era5RasterPosition.width + era5RasterPosition.x;
38-
rightWidth = -era5RasterPosition.x;
39-
} else {
40-
xMax = era5RasterPosition.x;
41-
rightWidth = RASTER_WIDTH - era5RasterPosition.x;
42-
leftWidth = era5RasterPosition.width - rightWidth;
43-
}
44-
final Rectangle leftEraPos = new Rectangle(xMin, era5RasterPosition.y, leftWidth, era5RasterPosition.height);
45-
final Array leftSubset = readVariableData(numLayers, leftEraPos, variable);
46-
47-
final Rectangle rightEraPos = new Rectangle(xMax, era5RasterPosition.y, rightWidth, era5RasterPosition.height);
48-
final Array rightSubset = readVariableData(numLayers, rightEraPos, variable);
49-
50-
subset = mergeData(leftSubset, rightSubset, numLayers, era5RasterPosition, variable);
32+
subset = readVariableDataOverlapped(numLayers, era5RasterPosition, variable);
5133
} else {
5234
subset = readVariableData(numLayers, era5RasterPosition, variable);
5335
}
36+
5437
return NetCDFUtils.scaleIfNecessary(variable, subset);
5538
}
5639

40+
private static Array readVariableDataOverlapped(int numLayers, Rectangle era5RasterPosition, Variable variable) throws IOException, InvalidRangeException {
41+
Array subset;
42+
int xMin = 0;
43+
int xMax;
44+
int leftWidth;
45+
int rightWidth;
46+
if (era5RasterPosition.x < 0) {
47+
xMax = RASTER_WIDTH + era5RasterPosition.x; // notabene: rasterposition is negative tb 2021-01-13
48+
leftWidth = era5RasterPosition.width + era5RasterPosition.x;
49+
rightWidth = -era5RasterPosition.x;
50+
} else {
51+
xMax = era5RasterPosition.x;
52+
rightWidth = RASTER_WIDTH - era5RasterPosition.x;
53+
leftWidth = era5RasterPosition.width - rightWidth;
54+
}
55+
final Rectangle leftEraPos = new Rectangle(xMin, era5RasterPosition.y, leftWidth, era5RasterPosition.height);
56+
final Array leftSubset = readVariableData(numLayers, leftEraPos, variable);
57+
58+
final Rectangle rightEraPos = new Rectangle(xMax, era5RasterPosition.y, rightWidth, era5RasterPosition.height);
59+
final Array rightSubset = readVariableData(numLayers, rightEraPos, variable);
60+
61+
subset = mergeData(leftSubset, rightSubset, numLayers, era5RasterPosition, variable);
62+
return subset;
63+
}
64+
5765
static Array mergeData(Array leftSubset, Array rightSubset, int numLayers, Rectangle era5RasterPosition, Variable variable) {
5866
final int rank = variable.getRank();
5967
final Array mergedArray;
6068
if (rank == 4) {
6169
mergedArray = Array.factory(variable.getDataType(), new int[]{numLayers, era5RasterPosition.height, era5RasterPosition.width});
6270
} else {
6371
mergedArray = Array.factory(variable.getDataType(), new int[]{era5RasterPosition.height, era5RasterPosition.width});
64-
final Index targetIndex = mergedArray.getIndex();
6572
if (era5RasterPosition.x < 0) {
66-
Index srcIndex = leftSubset.getIndex();
67-
int srcX = 0;
68-
for (int x = 0; x < -era5RasterPosition.x; x++) {
69-
for (int y = 0; y < era5RasterPosition.height; y++) {
70-
targetIndex.set(y, x);
71-
srcIndex.set(y, srcX);
72-
mergedArray.setObject(targetIndex, leftSubset.getObject(srcIndex));
73-
}
74-
++srcX;
75-
}
76-
srcIndex = rightSubset.getIndex();
77-
srcX = 0;
78-
for (int x = -era5RasterPosition.x; x < era5RasterPosition.width; x++) {
79-
for (int y = 0; y < era5RasterPosition.height; y++) {
80-
targetIndex.set(y, x);
81-
srcIndex.set(y, srcX);
82-
mergedArray.setObject(targetIndex, rightSubset.getObject(srcIndex));
83-
}
84-
++srcX;
85-
}
73+
final int xMax = era5RasterPosition.width + era5RasterPosition.x;
74+
mergeArrays(leftSubset, rightSubset, era5RasterPosition, mergedArray, xMax);
8675
} else {
87-
Index srcIndex = rightSubset.getIndex();
88-
int srcX = 0;
89-
for (int x = 0; x < RASTER_WIDTH - era5RasterPosition.x; x++) {
90-
for (int y = 0; y < era5RasterPosition.height; y++) {
91-
targetIndex.set(y, x);
92-
srcIndex.set(y, srcX);
93-
mergedArray.setObject(targetIndex, rightSubset.getObject(srcIndex));
94-
}
95-
++srcX;
96-
}
97-
srcIndex = leftSubset.getIndex();
98-
srcX = 0;
99-
for (int x = RASTER_WIDTH - era5RasterPosition.x; x < era5RasterPosition.width; x++) {
100-
for (int y = 0; y < era5RasterPosition.height; y++) {
101-
targetIndex.set(y, x);
102-
srcIndex.set(y, srcX);
103-
mergedArray.setObject(targetIndex, leftSubset.getObject(srcIndex));
104-
}
105-
++srcX;
106-
}
76+
final int xMax = RASTER_WIDTH - era5RasterPosition.x;
77+
mergeArrays(rightSubset, leftSubset, era5RasterPosition, mergedArray, xMax);
10778
}
10879
}
10980

11081
return mergedArray;
11182
}
11283

84+
private static void mergeArrays(Array leftSubset, Array rightSubset, Rectangle era5RasterPosition, Array mergedArray, int xMax) {
85+
final Index targetIndex = mergedArray.getIndex();
86+
Index srcIndex = leftSubset.getIndex();
87+
int srcX = 0;
88+
for (int x = 0; x < xMax; x++) {
89+
for (int y = 0; y < era5RasterPosition.height; y++) {
90+
targetIndex.set(y, x);
91+
srcIndex.set(y, srcX);
92+
mergedArray.setObject(targetIndex, leftSubset.getObject(srcIndex));
93+
}
94+
++srcX;
95+
}
96+
srcIndex = rightSubset.getIndex();
97+
srcX = 0;
98+
for (int x = xMax; x < era5RasterPosition.width; x++) {
99+
for (int y = 0; y < era5RasterPosition.height; y++) {
100+
targetIndex.set(y, x);
101+
srcIndex.set(y, srcX);
102+
mergedArray.setObject(targetIndex, rightSubset.getObject(srcIndex));
103+
}
104+
++srcX;
105+
}
106+
}
107+
113108
private static Array readVariableData(int numLayers, Rectangle era5RasterPosition, Variable variable) throws IOException, InvalidRangeException {
114109
final int rank = variable.getRank();
115110
Array subset;
@@ -125,7 +120,9 @@ private static Array readVariableData(int numLayers, Rectangle era5RasterPositio
125120
throw new IOException("variable rank invalid: " + variable.getShortName());
126121
}
127122

128-
subset = subset.reduce();
123+
// remove the time dimension of length 1 tb 2021-01-14
124+
subset = subset.reduce(0);
125+
129126
return subset;
130127
}
131128

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

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -119,29 +119,29 @@ public void testSetGetDimensions_3D() {
119119

120120
@Test
121121
public void testMergeData_2D_left() {
122-
final Array left = Array.factory(DataType.INT, new int[]{3, 1});
123-
Index index = left.getIndex();
122+
final Array right = Array.factory(DataType.INT, new int[]{3, 1});
123+
Index index = right.getIndex();
124124
index.set(0, 0);
125-
left.setInt(index, 1);
125+
right.setInt(index, 1);
126126
index.set(1, 0);
127-
left.setInt(index, 2);
127+
right.setInt(index, 2);
128128
index.set(2, 0);
129-
left.setInt(index, 3);
129+
right.setInt(index, 3);
130130

131-
final Array right = Array.factory(DataType.INT, new int[]{3, 2});
132-
index = right.getIndex();
131+
final Array left = Array.factory(DataType.INT, new int[]{3, 2});
132+
index = left.getIndex();
133133
index.set(0, 0);
134-
right.setInt(index, 4);
134+
left.setInt(index, 4);
135135
index.set(0, 1);
136-
right.setInt(index, 5);
136+
left.setInt(index, 5);
137137
index.set(1, 0);
138-
right.setInt(index, 6);
138+
left.setInt(index, 6);
139139
index.set(1, 1);
140-
right.setInt(index, 7);
140+
left.setInt(index, 7);
141141
index.set(2, 0);
142-
right.setInt(index, 8);
142+
left.setInt(index, 8);
143143
index.set(2, 1);
144-
right.setInt(index, 9);
144+
left.setInt(index, 9);
145145

146146
final Variable variable = mock(Variable.class);
147147
when(variable.getRank()).thenReturn(3);
@@ -155,11 +155,11 @@ public void testMergeData_2D_left() {
155155

156156
index = merged.getIndex();
157157
index.set(0, 0);
158-
assertEquals(1, merged.getInt(index));
159-
index.set(0, 1);
160158
assertEquals(4, merged.getInt(index));
161-
index.set(0, 2);
159+
index.set(0, 1);
162160
assertEquals(5, merged.getInt(index));
161+
index.set(0, 2);
162+
assertEquals(1, merged.getInt(index));
163163

164164
verify(variable, times(1)).getRank();
165165
verify(variable, times(1)).getDataType();

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

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import com.bc.fiduceo.IOTestRunner;
55
import com.bc.fiduceo.TestUtil;
6-
import org.junit.Ignore;
76
import org.junit.Test;
87
import org.junit.runner.RunWith;
98
import ucar.ma2.Array;
@@ -71,8 +70,7 @@ public void testReadSubset_3D() throws IOException, InvalidRangeException {
7170
}
7271

7372
@Test
74-
@Ignore
75-
public void testReadSubset_2D_antiMeridianOverlap() throws IOException, InvalidRangeException {
73+
public void testReadSubset_2D_antiMeridianOverlap_right() throws IOException, InvalidRangeException {
7674
final File anMlFile = TestUtil.getTestDataFileAsserted("era-5/v1/an_ml/2008/06/02/ecmwf-era5_oper_an_ml_200806021000.lnsp.nc");
7775

7876
try (NetcdfFile netcdfFile = NetcdfFile.open(anMlFile.getAbsolutePath())) {
@@ -89,9 +87,33 @@ public void testReadSubset_2D_antiMeridianOverlap() throws IOException, InvalidR
8987
assertEquals(3, shape[0]);
9088
assertEquals(3, shape[1]);
9189

92-
assertEquals(11.503242492675781f, lnspArray.getFloat(0), 1e-8);
93-
assertEquals(11.503653526306152f, lnspArray.getFloat(1), 1e-8);
94-
assertEquals(11.505866050720215f, lnspArray.getFloat(2), 1e-8);
90+
assertEquals(11.529290199279785f, lnspArray.getFloat(0), 1e-8);
91+
assertEquals(11.529301643371582f, lnspArray.getFloat(1), 1e-8);
92+
assertEquals(11.529279708862305f, lnspArray.getFloat(2), 1e-8);
93+
}
94+
}
95+
96+
@Test
97+
public void testReadSubset_2D_antiMeridianOverlap_left() throws IOException, InvalidRangeException {
98+
final File anMlFile = TestUtil.getTestDataFileAsserted("era-5/v1/an_sfc/2000/05/28/ecmwf-era5_oper_an_sfc_200005281700.10u.nc");
99+
100+
try (NetcdfFile netcdfFile = NetcdfFile.open(anMlFile.getAbsolutePath())) {
101+
final Variable lnsp = netcdfFile.findVariable("u10");
102+
assertNotNull(lnsp);
103+
104+
final Rectangle era5Positions = new Rectangle(-1, 403, 3, 3);
105+
106+
final Array lnspArray = SatelliteFields.readSubset(1, era5Positions, lnsp);
107+
assertNotNull(lnspArray);
108+
109+
final int[] shape = lnspArray.getShape();
110+
assertEquals(2, shape.length);
111+
assertEquals(3, shape[0]);
112+
assertEquals(3, shape[1]);
113+
114+
assertEquals(-6.088078022003174f, lnspArray.getFloat(0), 1e-8);
115+
assertEquals(-5.904586315155029f, lnspArray.getFloat(1), 1e-8);
116+
assertEquals(-6.2205610275268555f, lnspArray.getFloat(2), 1e-8);
95117
}
96118
}
97119
}

0 commit comments

Comments
 (0)