package ucar.nc2; import java.io.IOException; import ucar.nc2.*; import ucar.ma2.*; import ucar.nc2.constants.CDM; public class TestLargeGeneration { /** * @param args * @throws InvalidRangeException * @throws IOException */ public static void main(String[] args) throws IOException, InvalidRangeException { String filename = "C:/temp/test3.nc"; long startAll = System.nanoTime(); NetcdfFileWriteable writeableFile = null; try { writeableFile = createLatLonTimeDataCube(filename); // The outer dimension has shape 1, since we will write one record // at a time, and one // record corresponds to one latitude ordinate ArrayFloat.D3 variableData = new ArrayFloat.D3(1, LON_LEN, TIME_LEN); // ArrayObject.D2 cellIdData = new // ArrayObject.D2(class(java.lang.String), latDim.getLength(), // lonDim.getLength()); // An array to record the latitude ordinate ucar.ma2.Array latData = ucar.ma2.Array.factory(DataType.FLOAT, new int[]{1}); // The origin to use to write the runoff record int[] origin = new int[]{0, 0, 0}; // lat, lon, time // The origin to use to write the latitude for each record int[] lat_origin = new int[]{0}; // for (int lat = 0; lat < 177; lat++) // latData.setFloat(latData.getIndex(), (float) (lat / 10.0)); for (int lat = 0; lat < LAT_LEN; lat++) { long start = System.nanoTime(); latData.setFloat(latData.getIndex(), (float) (lat / 10.0)); for (int lon = 0; lon < LON_LEN; lon++) { for (int time = 0; time < TIME_LEN; time++) { variableData.set(0, lon, time, (float) time); } } // write the data out for this record origin[0] = lat; lat_origin[0] = lat; writeableFile.write(variableName, origin, variableData); writeableFile.write(latVar, lat_origin, latData); writeableFile.flush(); long end = System.nanoTime(); System.out.printf("write lat= %d time=%f msecs %n", lat, (end-start) / 1000 / 1000.0); } } catch (Throwable t) { t.printStackTrace(); } finally { if (writeableFile != null) writeableFile.close(); } long endAll = System.nanoTime(); System.out.printf("total time=%f secs %n", (endAll-startAll) / 1000 / 1000.0/ 1000); } static String latVar = "lat"; static String lonVar = "lon"; static String timeVar = "time"; static String unitsAttName = "units"; static String axisAttName = "axis"; static String standardNameAttName = "standard_name"; static String longNameAttName = CDM.LONG_NAME; static float fillValue = -9999.0f; static String missingValueAttName = CDM.MISSING_VALUE; static String fillValueAttName = "_FillValue"; static String variableName = "testVar"; static int LON_LEN = 300; static int LAT_LEN = 300; static int TIME_LEN = 40000; static String units = "mm"; private static NetcdfFileWriteable createLatLonTimeDataCube(String filename) throws IOException, InvalidRangeException { NetcdfFileWriteable writeableFile = NetcdfFileWriteable.createNew(filename); writeableFile.setLargeFile(true); writeableFile.setFill(false); //writeableFile.setLength((long) 16 * 1000 * 1000 * 1000); // 16 gigs - prealloate // define dimensions Dimension timeDim = writeableFile.addDimension(timeVar, TIME_LEN); Dimension latDim = writeableFile.addUnlimitedDimension(latVar); Dimension lonDim = writeableFile.addDimension(lonVar, LON_LEN); // define Variables Dimension[] dim3 = new Dimension[]{latDim, lonDim, timeDim}; // order matters defineHeader(writeableFile, timeDim, latDim, lonDim, dim3); // create the file writeableFile.create(); System.out.printf("file=%s%n", writeableFile); // write out the non-record variables float[] longitudes = new float[LON_LEN]; int[] times = new int[TIME_LEN]; for (int i = 0; i < times.length; i++) { times[i] = i; } for (int i = 0; i < longitudes.length; i++) { longitudes[i] = (float) i; } writeableFile.write(lonVar, ucar.ma2.Array.factory(longitudes)); writeableFile.write(timeVar, ucar.ma2.Array.factory(times)); return writeableFile; } private static void defineHeader(NetcdfFileWriteable writeableFile, Dimension timeDim, Dimension latDim, Dimension lonDim, Dimension[] dim3) { Dimension[] spatialDim = new Dimension[]{latDim, lonDim}; writeableFile.addVariable(latVar, DataType.FLOAT, new Dimension[]{latDim}); writeableFile.addVariableAttribute(latVar, unitsAttName, "degrees_north"); writeableFile.addVariableAttribute(latVar, axisAttName, "Y"); writeableFile.addVariableAttribute(latVar, standardNameAttName, "latitude"); // could add bounds, but not familiar how it works writeableFile.addVariable(lonVar, DataType.FLOAT, new Dimension[]{lonDim}); writeableFile.addVariableAttribute(lonVar, unitsAttName, "degrees_east"); writeableFile.addVariableAttribute(lonVar, axisAttName, "X"); writeableFile.addVariableAttribute(lonVar, standardNameAttName, "longitude"); // could add bounds, but not familiar how it works writeableFile.addVariable(variableName, DataType.FLOAT, dim3); writeableFile.addVariableAttribute(variableName, longNameAttName, variableName); writeableFile.addVariableAttribute(variableName, unitsAttName, units); writeableFile.addVariableAttribute(variableName, missingValueAttName, new java.lang.Float(fillValue)); writeableFile.addVariableAttribute(variableName, fillValueAttName, new java.lang.Float(fillValue)); writeableFile.addVariable("cellId", DataType.STRING, spatialDim); writeableFile.addVariableAttribute("cellId", longNameAttName, "Cell ID"); writeableFile.addVariable(timeVar, DataType.INT, new Dimension[]{timeDim}); writeableFile.addVariableAttribute(timeVar, unitsAttName, "days since " + "1889-01-01"); writeableFile.addVariableAttribute(timeVar, axisAttName, "T"); writeableFile.addVariableAttribute(timeVar, standardNameAttName, timeVar); writeableFile.addVariableAttribute(timeVar, longNameAttName, timeVar); // writeableFile.setFill(true); // could add bounds, but not familiar how it works } }