- To: Java NetCDF <netcdf-java@xxxxxxxxxxxxxxxx>
- Subject: [netcdf-java] BUG: Rectilinear sub-grid miscalculates coord edges
- From: Christian Ward-Garrison <cwardgar@xxxxxxxx>
- Date: Tue, 04 May 2010 20:24:20 -0600
See test case below. foo.ncml defines a rectilinear, t-y-x, 4x4x4 grid
named "foo". fooSubGrid is the 2x2x2 "central" subset of fooGrid.
foo.ncml: <?xml version="1.0" encoding="UTF-8"?> <netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"> <dimension name="time" length="4" /> <dimension name="lat" length="4" /> <dimension name="lon" length="4" /> <dimension name="bnds" length="2" /> <variable name="time" shape="time" type="double"> <attribute name="units" type="String" value="days since 1850-01-01" /> <attribute name="calendar" type="String" value="standard" /> <attribute name="bounds" type="String" value="time_bnds" /> <values>15.5 45.0 74.5 105.0</values> </variable> <variable name="time_bnds" shape="time bnds" type="double"> <values>0.0 31.0 31.0 59.0 59.0 90.0 90.0 120.0</values> </variable> <variable name="lat" shape="lat" type="double"> <attribute name="units" type="String" value="degrees_north" /> <attribute name="bounds" type="String" value="lat_bnds" /> <values>-54 9 54 81</values> </variable> <variable name="lat_bnds" shape="lat bnds" type="double"> <values>-90 -18 -18 36 36 72 72 90</values> </variable> <variable name="lon" shape="lon" type="double"> <attribute name="units" type="String" value="degrees_east" /> <attribute name="bounds" type="String" value="lon_bnds" /> <values>18 72 162 288</values> </variable> <variable name="lon_bnds" shape="lon bnds" type="double"> <values>0 36 36 108 108 216 216 360</values> </variable> <variable name="foo" shape="time lat lon" type="float"> <values start="1.0" increment="1.0" /> </variable> </netcdf> Foo.java: public static void main(String[] args) throws IOException, InvalidRangeException { File fooNcmlFile = new File("foo.ncml"); NetcdfDataset fooDataset = NetcdfDataset.openDataset(fooNcmlFile.getAbsolutePath()); try { GridDataset fooGridDataset = new GridDataset(fooDataset); GridDatatype fooGrid = fooGridDataset.findGridDatatype("foo"); CoordinateAxis1D fooTimeAxis = fooGrid.getCoordinateSystem().getTimeAxis1D(); CoordinateAxis1D fooLatAxis = (CoordinateAxis1D) fooGrid.getCoordinateSystem().getYHorizAxis(); CoordinateAxis1D fooLonAxis = (CoordinateAxis1D) fooGrid.getCoordinateSystem().getXHorizAxis(); // Expected: [0.0, 31.0, 59.0, 90.0, 120.0] // Actual: [0.0, 31.0, 59.0, 90.0, 120.0] System.out.println(Arrays.toString(fooTimeAxis.getCoordEdges())); // Expected: [-90.0, -18.0, 36.0, 72.0, 90.0] // Actual: [-90.0, -18.0, 36.0, 72.0, 90.0] System.out.println(Arrays.toString(fooLatAxis.getCoordEdges())); // Expected: [0.0, 36.0, 108.0, 216.0, 360.0] // Actual: [0.0, 36.0, 108.0, 216.0, 360.0] System.out.println(Arrays.toString(fooLonAxis.getCoordEdges())); Range middleRange = new Range(1, 2); GridDatatype fooSubGrid = fooGrid.makeSubset(null, null, middleRange, null, middleRange, middleRange); CoordinateAxis1D fooSubTimeAxis = fooSubGrid.getCoordinateSystem().getTimeAxis1D(); CoordinateAxis1D fooSubLatAxis = (CoordinateAxis1D) fooSubGrid.getCoordinateSystem().getYHorizAxis(); CoordinateAxis1D fooSubLonAxis = (CoordinateAxis1D) fooSubGrid.getCoordinateSystem().getXHorizAxis(); // Expected: [31.0, 59.0, 90.0] // Actual: [30.25, 59.75, 89.25] System.out.println(Arrays.toString(fooSubTimeAxis.getCoordEdges())); // Expected: [-18.0, 36.0, 72.0] // Actual: [-13.5, 31.5, 76.5] System.out.println(Arrays.toString(fooSubLatAxis.getCoordEdges())); // Expected: [36.0, 108.0, 216.0] // Actual: [27.0, 117.0, 207.0] System.out.println(Arrays.toString(fooSubLonAxis.getCoordEdges())); } finally { fooDataset.close(); } }
- Follow-Ups: