|
18 | 18 |
|
19 | 19 | class SatelliteFields extends FieldsProcessor { |
20 | 20 |
|
21 | | - private static final int RASTER_WIDTH = 1440; |
22 | | - |
23 | 21 | private List<Dimension> dimension2d; |
24 | 22 | private List<Dimension> dimension3d; |
25 | 23 | private Map<String, TemplateVariable> variables; |
26 | 24 | private Era5Collection collection; |
27 | 25 |
|
28 | | - static Array readSubset(int numLayers, Rectangle era5RasterPosition, VariableCache.CacheEntry cacheEntry) throws IOException, InvalidRangeException { |
29 | | - Array subset; |
30 | | - |
31 | | - final int maxRequestedX = era5RasterPosition.x + era5RasterPosition.width - 1; |
32 | | - if (era5RasterPosition.x < 0 || maxRequestedX >= RASTER_WIDTH) { |
33 | | - subset = readVariableDataOverlapped(numLayers, era5RasterPosition, cacheEntry.array); |
34 | | - } else { |
35 | | - subset = readVariableData(numLayers, era5RasterPosition, cacheEntry.array); |
36 | | - } |
37 | | - |
38 | | - return NetCDFUtils.scaleIfNecessary(cacheEntry.variable, subset); |
39 | | - } |
40 | | - |
41 | | - private static Array readVariableDataOverlapped(int numLayers, Rectangle era5RasterPosition, Array array) throws IOException, InvalidRangeException { |
42 | | - Array subset; |
43 | | - int xMin = 0; |
44 | | - int xMax; |
45 | | - int leftWidth; |
46 | | - int rightWidth; |
47 | | - if (era5RasterPosition.x < 0) { |
48 | | - xMax = RASTER_WIDTH + era5RasterPosition.x; // notabene: rasterposition is negative tb 2021-01-13 |
49 | | - leftWidth = era5RasterPosition.width + era5RasterPosition.x; |
50 | | - rightWidth = -era5RasterPosition.x; |
51 | | - } else { |
52 | | - xMax = era5RasterPosition.x; |
53 | | - rightWidth = RASTER_WIDTH - era5RasterPosition.x; |
54 | | - leftWidth = era5RasterPosition.width - rightWidth; |
55 | | - } |
56 | | - final Rectangle leftEraPos = new Rectangle(xMin, era5RasterPosition.y, leftWidth, era5RasterPosition.height); |
57 | | - final Array leftSubset = readVariableData(numLayers, leftEraPos, array); |
58 | | - |
59 | | - final Rectangle rightEraPos = new Rectangle(xMax, era5RasterPosition.y, rightWidth, era5RasterPosition.height); |
60 | | - final Array rightSubset = readVariableData(numLayers, rightEraPos, array); |
61 | | - |
62 | | - subset = mergeData(leftSubset, rightSubset, numLayers, era5RasterPosition, array); |
63 | | - return subset; |
64 | | - } |
65 | | - |
66 | | - static Array mergeData(Array leftSubset, Array rightSubset, int numLayers, Rectangle era5RasterPosition, Array array) { |
67 | | - final int rank = array.getRank(); |
68 | | - final Array mergedArray; |
69 | | - if (rank == 4) { |
70 | | - mergedArray = Array.factory(array.getDataType(), new int[]{numLayers, era5RasterPosition.height, era5RasterPosition.width}); |
71 | | - if (era5RasterPosition.x < 0) { |
72 | | - final int xMax = era5RasterPosition.width + era5RasterPosition.x; |
73 | | - mergeArrays_3D(leftSubset, rightSubset, era5RasterPosition, mergedArray, xMax); |
74 | | - } else { |
75 | | - final int xMax = RASTER_WIDTH - era5RasterPosition.x; |
76 | | - mergeArrays_3D(rightSubset, leftSubset, era5RasterPosition, mergedArray, xMax); |
77 | | - } |
78 | | - } else { |
79 | | - mergedArray = Array.factory(array.getDataType(), new int[]{era5RasterPosition.height, era5RasterPosition.width}); |
80 | | - if (era5RasterPosition.x < 0) { |
81 | | - final int xMax = era5RasterPosition.width + era5RasterPosition.x; |
82 | | - mergeArrays(leftSubset, rightSubset, era5RasterPosition, mergedArray, xMax); |
83 | | - } else { |
84 | | - final int xMax = RASTER_WIDTH - era5RasterPosition.x; |
85 | | - mergeArrays(rightSubset, leftSubset, era5RasterPosition, mergedArray, xMax); |
86 | | - } |
87 | | - } |
88 | | - |
89 | | - return mergedArray; |
90 | | - } |
91 | | - |
92 | | - private static void mergeArrays(Array leftSubset, Array rightSubset, Rectangle era5RasterPosition, Array mergedArray, int xMax) { |
93 | | - final Index targetIndex = mergedArray.getIndex(); |
94 | | - Index srcIndex = leftSubset.getIndex(); |
95 | | - int srcX = 0; |
96 | | - for (int x = 0; x < xMax; x++) { |
97 | | - for (int y = 0; y < era5RasterPosition.height; y++) { |
98 | | - targetIndex.set(y, x); |
99 | | - srcIndex.set(y, srcX); |
100 | | - mergedArray.setObject(targetIndex, leftSubset.getObject(srcIndex)); |
101 | | - } |
102 | | - ++srcX; |
103 | | - } |
104 | | - srcIndex = rightSubset.getIndex(); |
105 | | - srcX = 0; |
106 | | - for (int x = xMax; x < era5RasterPosition.width; x++) { |
107 | | - for (int y = 0; y < era5RasterPosition.height; y++) { |
108 | | - targetIndex.set(y, x); |
109 | | - srcIndex.set(y, srcX); |
110 | | - mergedArray.setObject(targetIndex, rightSubset.getObject(srcIndex)); |
111 | | - } |
112 | | - ++srcX; |
113 | | - } |
114 | | - } |
115 | | - |
116 | | - private static void mergeArrays_3D(Array leftSubset, Array rightSubset, Rectangle era5RasterPosition, Array mergedArray, int xMax) { |
117 | | - final Index targetIndex = mergedArray.getIndex(); |
118 | | - Index srcIndex = leftSubset.getIndex(); |
119 | | - int srcX = 0; |
120 | | - final int numLayers = leftSubset.getShape()[0]; |
121 | | - for (int x = 0; x < xMax; x++) { |
122 | | - for (int y = 0; y < era5RasterPosition.height; y++) { |
123 | | - for (int z = 0; z < numLayers; z++) { |
124 | | - targetIndex.set(z, y, x); |
125 | | - srcIndex.set(z, y, srcX); |
126 | | - mergedArray.setObject(targetIndex, leftSubset.getObject(srcIndex)); |
127 | | - } |
128 | | - } |
129 | | - ++srcX; |
130 | | - } |
131 | | - srcIndex = rightSubset.getIndex(); |
132 | | - srcX = 0; |
133 | | - for (int x = xMax; x < era5RasterPosition.width; x++) { |
134 | | - for (int y = 0; y < era5RasterPosition.height; y++) { |
135 | | - for (int z = 0; z < numLayers; z++) { |
136 | | - targetIndex.set(z, y, x); |
137 | | - srcIndex.set(z, y, srcX); |
138 | | - mergedArray.setObject(targetIndex, rightSubset.getObject(srcIndex)); |
139 | | - } |
140 | | - } |
141 | | - ++srcX; |
142 | | - } |
143 | | - } |
144 | | - |
145 | | - private static Array readVariableData(int numLayers, Rectangle era5RasterPosition, Array array) throws IOException, InvalidRangeException { |
146 | | - final int rank = array.getRank(); |
147 | | - Array subset; |
148 | | - if (rank == 2) { |
149 | | - final int[] origin = new int[]{era5RasterPosition.y, era5RasterPosition.x}; |
150 | | - final int[] shape = new int[]{era5RasterPosition.height, era5RasterPosition.width}; |
151 | | - final int[] stride = new int[]{1, 1}; |
152 | | - subset = array.sectionNoReduce(origin, shape, stride); |
153 | | - } else if (rank == 3) { |
154 | | - final int[] origin = new int[]{0, era5RasterPosition.y, era5RasterPosition.x}; |
155 | | - final int[] shape = new int[]{numLayers, era5RasterPosition.height, era5RasterPosition.width}; |
156 | | - final int[] stride = new int[]{1, 1, 1}; |
157 | | - subset = array.sectionNoReduce(origin, shape, stride); |
158 | | - } else { |
159 | | - throw new IOException("variable rank invalid"); |
160 | | - } |
161 | | - |
162 | | - return subset; |
163 | | - } |
164 | | - |
165 | 26 | void prepare(SatelliteFieldsConfiguration satFieldsConfig, NetcdfFile reader, NetcdfFileWriter writer, Era5Collection collection) { |
166 | 27 | satFieldsConfig.verify(); |
167 | 28 | setDimensions(satFieldsConfig, writer, reader); |
|
0 commit comments