The following document contains the results of PMD's CPD 4.2.2.
File | Line |
---|---|
au\csiro\netcdf\wron\MdbsyScenarioAConverter.java | 667 |
au\csiro\netcdf\wron\MdbsyScenarioCConverter.java | 688 |
.valueOf(variableFillValues[variableIndex])), new Attribute("grid_mapping", GRID_MAPPING)), dimensions, false /* isLargeFileSupport */, false/* fillValue */); } /** * Fills the coordinate variables, e.g. latitude, longitude, time. * * @param outputFileName * @param sortedLongitudes * @param sortedLatitudes * @param dates * @param timeRange * @param timeSize * @param blockLongRange * @param blockLongSize * @param blockLatRange * @param blockLatSize * @throws UnsupportedEncodingException * @throws IOException * @throws java.text.ParseException */ private void fillCoordinateVariables(String outputFileName, Set<String> sortedLongitudes, Set<String> sortedLatitudes, List<String> dates, String blockLatRange, String blockLongRange, String timeRange) throws UnsupportedEncodingException, IOException, java.text.ParseException { NcWriteVariable command = new NcWriteVariable(); // /////////////////////////////////////////////////////////////////////////////////////////// // fill longitude variable // create String of latitudes to populate the variable StringBuffer longitudeStringBuffer = new StringBuffer(); for (Iterator<String> iter = sortedLongitudes.iterator(); iter.hasNext();) { longitudeStringBuffer.append(iter.next()).append(System.getProperty("line.separator")); } // call command to actually perform fill the file command.execute(new File(outputFileName), LONG, blockLongRange, new ByteArrayInputStream(longitudeStringBuffer .toString().getBytes(ENCODING)), false); // /////////////////////////////////////////////////////////////////////////////////////////// // fill latitude variable // create String of latitudes to populate the variable StringBuffer latitudeStringBuffer = new StringBuffer(); for (Iterator<String> iter = sortedLatitudes.iterator(); iter.hasNext();) { latitudeStringBuffer.append(iter.next()).append(System.getProperty("line.separator")); } // call command to actually perform fill the file command.execute(new File(outputFileName), LAT, blockLatRange, new ByteArrayInputStream(latitudeStringBuffer .toString().getBytes(ENCODING)), false); // /////////////////////////////////////////////////////////////////////////////////////////// // fill time and time_bnds variables StringBuffer timeBoundsStringBuffer = new StringBuffer(); StringBuffer dateStringBuffer = new StringBuffer(); boolean first = true; for (String date : dates) { dateStringBuffer.append(date).append(System.getProperty("line.separator")); if (!first) { timeBoundsStringBuffer.append(date).append(System.getProperty("line.separator")); } timeBoundsStringBuffer.append(date).append(System.getProperty("line.separator")); first = false; } int dayAfterLastDay = Integer.parseInt(dates.get(dates.size()-1)) +1; String finalString = String.valueOf(dayAfterLastDay); timeBoundsStringBuffer.append(finalString).append(System.getProperty("line.separator")); // call command to actually perform fill the file command.execute(new File(outputFileName), TIME, timeRange, new ByteArrayInputStream(dateStringBuffer .toString().getBytes(ENCODING)), false); // call command to actually perform fill the file command.execute(new File(outputFileName), TIME_BOUNDS, timeRange+","+NV_RANGE, new ByteArrayInputStream( timeBoundsStringBuffer.toString().getBytes(ENCODING)), false); } /** * Populates the spatial variables with data * * @param outputFileName * The netCDF file to be updated * @param sortedCellData * The list of cell data in the same order as the spatial coordinates * @throws IOException * If the data cannot be read */ private void fillSpatialVariables(String outputFileName, List<CellData> sortedCellData) throws IOException { NcWriteVariable command = new NcWriteVariable(); Set<String> latitudes = getSortedLatitudes(sortedCellData); Set<String> longitudes = getSortedLongitudes(sortedCellData); String spatialRange = "0-" + (latitudes.size() - 1) + ",0-" + (longitudes.size() - 1); // /////////////////////////////////////////////////////////////////////////////////////////// // fill elevation variable // create String of elevations to populate the variable StringBuffer dataBuffer = fillSpatialDataBuffer(sortedCellData, latitudes, longitudes, CellDataVariable.ELEVATION, "-999.99"); // call command to actually perform fill the file command.execute(new File(outputFileName), ELEVATION, spatialRange, new ByteArrayInputStream(dataBuffer .toString().getBytes(ENCODING)), false); // /////////////////////////////////////////////////////////////////////////////////////////// // fill catchment id variable // create String of catchment ids to populate the variable dataBuffer = fillSpatialDataBuffer(sortedCellData, latitudes, longitudes, CellDataVariable.CATCHMENTID, "0"); // call command to actually perform fill the file command.execute(new File(outputFileName), CATCHMENT_ID, spatialRange, new ByteArrayInputStream(dataBuffer .toString().getBytes(ENCODING)), false); // /////////////////////////////////////////////////////////////////////////////////////////// // fill reporting region id variable // create String of reporting region ids to populate the variable dataBuffer = fillSpatialDataBuffer(sortedCellData, latitudes, longitudes, CellDataVariable.REPORTINGREGIONID, "0"); // call command to actually perform fill the file command.execute(new File(outputFileName), REPORTING_REGION, spatialRange, new ByteArrayInputStream(dataBuffer .toString().getBytes(ENCODING)), false); } /** * @param sortedCellData * @param latitudes * @param longitudes * @param varNum * @param fillValue * @return */ private StringBuffer fillSpatialDataBuffer(List<CellData> sortedCellData, Set<String> latitudes, Set<String> longitudes, CellDataVariable varNum, String fillValue) { StringBuffer dataBuffer = new StringBuffer(); int cellNum = 0; for (String latVal : latitudes) { for (String longVal : longitudes) { if (cellNum < sortedCellData.size()) { CellData cellData = sortedCellData.get(cellNum); if (cellData.latitude.equals(latVal) && cellData.longitude.equals(longVal)) { switch (varNum) { case ELEVATION: dataBuffer.append(cellData.elevation); break; case CATCHMENTID: dataBuffer.append(cellData.catchmentId); break; case REPORTINGREGIONID: dataBuffer.append(cellData.reportingRegionId); break; } cellNum++; } else { dataBuffer.append(fillValue); } } else { dataBuffer.append(fillValue); } dataBuffer.append(System.getProperty("line.separator")); } } return dataBuffer; } /** * Populate the data variable with fill values. Used to ensure cells within * the rectangular bounds but for which we have no data are set to the fill value. * * @param varIndex The variable being filled * @param sortedLongitudes The longitudes to fill. * @param sortedLatitudes The latitudes to fill * @param dates The dates to fill * @param dimensionOrdering The order of the dimensions in the files * @throws IOException If the data cannot be written */ private void fillDataForLatitude(String filename, int varIndex, Set<String> sortedLongitudes, Set<String> sortedLatitudes, List<String> dates, List<String> dimensionOrdering) throws IOException { StringBuffer fillBlock = new StringBuffer(); String fillLine = variableFillValues[varIndex] + "\n"; for (int i = 0; i < dates.size(); i++) { fillBlock.append(fillLine); } NcWriteVariable writeVarCmd = new NcWriteVariable(); for (String latitude : sortedLatitudes) { for (String longitude : sortedLongitudes) { String fillRange = this.constructFillRange(dimensionOrdering, latitude, longitude, dates.size()); writeVarCmd.execute(new File(filename), variableNames[varIndex], fillRange, new ByteArrayInputStream(fillBlock.toString().getBytes(ENCODING)), false); } } } /** * Fills the variables with data for a particular latitude. * * @param variableFileNames The filenames for this latitude for each of the variables * @param triples The details of the cells that occur in this latitude * @param dimensionOrdering The order of the dimensions in the files * @throws IOException If the data cannot be written */ private void fillDataByLatitudeVariables(String[] variableFileNames, List<CellData> triples, List<String> dimensionOrdering) throws IOException { NcWriteVariable command = new NcWriteVariable(); int counter = 0; for (CellData triple : triples) { if (++counter % 1000 == 0) { LOG.warn(" Num files processed: " + counter); } String csvFileName = triple.getCellId(); String latitude = triple.getLatitude(); String longitude = triple.getLongitude(); String fillRange = this.constructFillRange(dimensionOrdering, latitude, longitude, TIME_SIZE); try { StringBuffer[] valuesStringBuffer = new StringBuffer[numVariables]; for (int i = 0; i < valuesStringBuffer.length; i++) { valuesStringBuffer[i] = new StringBuffer(); } Scanner s = null; try { s = new Scanner(new BufferedReader(new FileReader(INPUT_CSV_DIRECTORY + csvFileName + ".csv"))) .useDelimiter(Pattern.compile("[\n,]")); // remove header line for (int i = 0; i < NUM_CSV_COLUMNS; i++) { s.next(); } while (s.hasNext()) { s.next(); // date column for (int i = 0; i < numVariables; i++) { valuesStringBuffer[i].append(s.next()); // Last variable will already have newline at its end. if (i < numVariables - 1) { valuesStringBuffer[i].append(System.getProperty("line.separator")); } } } } finally { if (s != null) { s.close(); } } try { for (int i = 0; i < numVariables; i++) { command.execute(new File(variableFileNames[i]), variableNames[i], fillRange, new ByteArrayInputStream(valuesStringBuffer[i].toString().getBytes(ENCODING)), false); } } catch (IllegalArgumentException iae) { LOG.error(iae); LOG.error("fillRange (date, lat, long): " + fillRange); } } catch (FileNotFoundException fnfe) { LOG.info(fnfe.getMessage()); //System.out.println(fnfe.getMessage()); } } } /** * @param dimensionOrdering * @param latitude * @param longitude * @param dates * @return */ private String constructFillRange(List<String> dimensionOrdering, String latitude, String longitude, int dateSize) { String time_range = "0-" + String.valueOf(dateSize - 1); String latitude_range = "lookup(" + latitude + ")-lookup(" + latitude + ")"; String longitude_range = "lookup(" + longitude + ")-lookup(" + longitude + ")"; String fillRange = new String(); for (Iterator<String> iter = dimensionOrdering.iterator(); iter.hasNext();) { String dimension = iter.next(); if (dimension.equals(TIME)) { fillRange += time_range; } else if (dimension.equals(LAT)) { fillRange += latitude_range; } else if (dimension.equals(LONG)) { fillRange += longitude_range; } if (iter.hasNext()) fillRange += ","; } return fillRange; } /** * Groups triples, i.e. <cellId,longitude,latitude> (a row in the WRON lookup file) by degrees of latitude. * * @param locationLookupValues * @return */ private Map<String, List<CellData>> getTriplesGroupedByLatitude(String[][] locationLookupValues) { Map<String, List<CellData>> triplesGroupedByLatitude = new HashMap<String, List<CellData>>(); for (int i = 0; i < locationLookupValues.length; i++) { String cellId = locationLookupValues[i][CELL_ID_COLUMN_INDEX]; String longitude = locationLookupValues[i][LONG_COLUMN_INDEX]; String latitude = locationLookupValues[i][LAT_COLUMN_INDEX]; String elevation = locationLookupValues[i][ELEVATION_COLUMN_INDEX]; String catchmentId = locationLookupValues[i][CATCHMENT_ID_COLUMN_INDEX]; String reportingRegionId = locationLookupValues[i][REPORTING_REGION_ID_COLUMN_INDEX]; String latitudeDegree = String.valueOf(Float.valueOf(latitude).intValue()); List<CellData> triplesInLatitude = triplesGroupedByLatitude.get(latitudeDegree); if (triplesInLatitude == null) { triplesInLatitude = new ArrayList<CellData>(); triplesGroupedByLatitude.put(latitudeDegree, triplesInLatitude); } final CellData cellData = new CellData(cellId, longitude, latitude); cellData.elevation = elevation; cellData.catchmentId = catchmentId; cellData.reportingRegionId = reportingRegionId; triplesInLatitude.add(cellData); } // check that we have actually grouped all rows by latitude int count = 0; for (Iterator<String> iter = triplesGroupedByLatitude.keySet().iterator(); iter.hasNext();) { count += triplesGroupedByLatitude.get(iter.next()).size(); } if (count != locationLookupValues.length) { LOG.error("latitudes where not grouped by latitude correctly"); System.exit(-1); } return triplesGroupedByLatitude; } /** * Groups dates, e.g. 1895-01-01 by decade. * * @param dates * @return */ public Map<Integer, List<String>> getDatesByDecade(List<String> dates) { Map<Integer, List<String>> datesGroupedByDecade = new HashMap<Integer, List<String>>(); for (String date : dates) { int year = Integer.valueOf(date.substring(0, 4)); int decade = year / 10; List<String> datesInDecade = datesGroupedByDecade.get(decade); if (datesInDecade == null) { datesInDecade = new ArrayList<String>(); datesGroupedByDecade.put(decade, datesInDecade); } datesInDecade.add(date); } // check that we have actually grouped all rows by latitude int count = 0; for (Iterator<Integer> iter = datesGroupedByDecade.keySet().iterator(); iter.hasNext();) { count += datesGroupedByDecade.get(iter.next()).size(); } if (count != dates.size()) { LOG.error("dates where not grouped decade correctly"); System.exit(-1); } return datesGroupedByDecade; } /** * Loads all triples, i.e. <cellId,longitude,latitude> (a row in the WRON lookup file). * * @param locationLookupValues * @return */ private List<CellData> getAllTriples(String[][] locationLookupValues) { List<CellData> allTriples = new ArrayList<CellData>(); for (int i = 0; i < locationLookupValues.length; i++) { String cellId = locationLookupValues[i][CELL_ID_COLUMN_INDEX]; String longitude = locationLookupValues[i][LONG_COLUMN_INDEX]; String latitude = locationLookupValues[i][LAT_COLUMN_INDEX]; String elevation = locationLookupValues[i][ELEVATION_COLUMN_INDEX]; String catchmentId = locationLookupValues[i][CATCHMENT_ID_COLUMN_INDEX]; String reportingRegionId = locationLookupValues[i][REPORTING_REGION_ID_COLUMN_INDEX]; CellData cellData = new CellData(cellId, longitude, latitude); cellData.elevation = elevation; cellData.catchmentId = catchmentId; cellData.reportingRegionId = reportingRegionId; allTriples.add(cellData); } // check that we have actually grouped all rows by latitude if (allTriples.size() != locationLookupValues.length) { LOG.error("lookup values where not read correctly"); System.exit(-1); } return allTriples; } /** * Parses the WRON lookup file into an row-by-column string matrix. * * @throws IOException */ private String[][] readLookupFile() throws IOException { RandomAccessFile raf = new RandomAccessFile(new File(LOCATION_LOOKUP_FILE), "r"); raf.readLine();// abandon the first line since it is a header line. List<String[]> lineList = new ArrayList<String[]>(); String line = raf.readLine(); while (line != null) { String[] cols = new CSVTokenizer(line).getAllColumns(); lineList.add(cols); line = raf.readLine(); } raf.close(); String[][] lineCols = lineList.toArray(new String[][]{}); return lineCols; } /** * Transpose a matrix, e.g. [a][b] -> [b][a] * * @param gridValues * @return */ private String[][] transpose(String[][] gridValues) { String[][] transposed = new String[gridValues[0].length][gridValues.length]; for (int rows = 0; rows < gridValues.length; rows++) { for (int cols = 0; cols < gridValues[0].length; cols++) { transposed[cols][rows] = gridValues[rows][cols]; } } return transposed; } /** * Retrieve an ordered set containing all the latitude values from a list of triples. * * @param triples * @return */ private Set<String> getSortedLatitudes(List<CellData> triples) { Set<String> latitudes = new TreeSet<String>(); for (CellData triple : triples) { latitudes.add(triple.getLatitude()); // if (latitudes.size() >= LAT_SIZE) // { // break; // } } return latitudes; } /** * Retrieve an ordered set containing all the longitude values from a list of triples. * * @param triples * @return */ private Set<String> getSortedLongitudes(List<CellData> triples) { Set<String> longitudes = new TreeSet<String>(); for (CellData triple : triples) { longitudes.add(triple.getLongitude()); // if (longitudes.size() >= LONG_SIZE) // { // break; // } } return longitudes; } /** * @return * @throws IOException */ private List<String> getDates() throws IOException { List<String> dates = new ArrayList<String>(); RandomAccessFile raf = null; try { // open any csv file from scenario C directory and read in the date dimension File dir = new File(INPUT_CSV_DIRECTORY); String[] children = dir.list(); if (children != null && children.length > 0) { raf = new RandomAccessFile(new File(INPUT_CSV_DIRECTORY + children[0]), "r"); raf.readLine();// abandon the first line since it is a header line. List<String[]> lineList = new ArrayList<String[]>(); String line = raf.readLine(); while (line != null) { String[] cols = new CSVTokenizer(line).getAllColumns(); lineList.add(cols); line = raf.readLine(); } String[][] lineCols = lineList.toArray(new String[][]{}); dates = Arrays.asList(transpose(lineCols)[DATE_COLUMN_INDEX]); // get the date column } } finally { if (raf != null) raf.close(); } return dates; } /** * Convert the date values into a newline delimited string of days since a given epoc. * * @param dates * @return * @throws IOException * @throws java.text.ParseException */ private List<String> getDatesAsDaysSinceEpoc(List<String> dates) throws IOException, java.text.ParseException { return daysSinceSinceEpocAsString(dates, isoDateTimeFormat.dateOnlyFormat(EPOC_DATE_STRING)); } /** * Convert a string array representing dates to a list of strings representing the number of days since since a * given epoc. * * @param dates * @param epoc * @return * @throws java.text.ParseException */ private List<String> daysSinceSinceEpocAsString(List<String> dates, Date epoc) throws java.text.ParseException { List<String> convertedDates = new ArrayList<String>(); for (String date : dates) { Date currentDate = isoDateTimeFormat.dateOnlyFormat(date); convertedDates.add(String.valueOf(daysBetween(epoc, currentDate))); } return convertedDates; } /** * @param d1 * the initial date. * @param d2 * the later date. * @return (d2 - d1) in days */ public int daysBetween(Date d1, Date d2) { return (int) ((d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24)); } private String generateLatitudeFilename(String latitudeDegree, String variable) { String filename = OUTPUT_NETCDF_DIRECTORY + COLLECTION + "." + SCENARIO + "."; if (MODEL_NAMES[FILE_NAME_MODEL_NAME].length() > 0) |
File | Line |
---|---|
au\csiro\netcdf\wron\MdbsyScenarioAConverter.java | 306 |
au\csiro\netcdf\wron\MdbsyScenarioCConverter.java | 334 |
MdbsyScenarioCConverter converter = new MdbsyScenarioCConverter(); if (doSplitByDecade) { long start = System.currentTimeMillis(); converter.splitByDecade(startingLatitude, endingLatitude); long end = System.currentTimeMillis() - start; LOG.warn("Split by decade in: " + end + " ms."); } if (doSplitByLatitude) { long start = System.currentTimeMillis(); converter.splitByLatitude(startingLatitude, endingLatitude); long end = System.currentTimeMillis() - start; LOG.warn("Split by latitude in: " + end + " ms."); } } catch (MissingOptionException moe) { LOG.error(moe.getMessage()); StringWriter sw = new StringWriter(); HelpFormatter formatter = new HelpFormatter(); formatter.setOptionComparator(new CommandLineOptionsComparator()); formatter.printHelp(new PrintWriter(sw), 80, "-", "header", options, 0, 1, "footer"); System.out.println(sw.toString()); } } /** * Splits a directory of WRON csv files into corresponding netCDF files that are grouped by degrees of latitude. * * @throws Exception */ public void splitByLatitude(String startingLatitude, String endingLatitude) throws Exception { // group each row in lookup file according to latitude Map<String, List<CellData>> triplesGroupedByLatitude = this.getTriplesGroupedByLatitude(this.readLookupFile()); // sort by latitude Set<String> latitudeKeySet = triplesGroupedByLatitude.keySet(); Set<String> limitedLatitudes = convUtils.getLimitedLatitudes(latitudeKeySet, startingLatitude, endingLatitude); List<String> latitudeKeyList = new ArrayList<String>(limitedLatitudes); Collections.sort(latitudeKeyList, new Comparator<String>() { @Override public int compare(String o1, String o2) { return Integer.valueOf(o2).compareTo(Integer.valueOf(o1)); } }); // for each latitude create a netCDF file. for (String latitudeKey : latitudeKeyList) { LOG.warn("Started work on latitude: " + latitudeKey + "."); String latitudeDegree = latitudeKey; List<CellData> triples = triplesGroupedByLatitude.get(latitudeDegree); // get the values to fill the coordinate variables. Set<String> sortedLatitudes = this.getSortedLatitudes(triples); int blockLatSize = sortedLatitudes.size(); String blockLatRange = "0-" + String.valueOf(sortedLatitudes.size() - 1); Set<String> sortedLongitudes = this.getSortedLongitudes(triples); int blockLongSize = sortedLongitudes.size(); String blockLongRange = "0-" + String.valueOf(sortedLongitudes.size() - 1); // create file names String filenames[] = new String[numVariables]; List<String> dates = this.getDatesAsDaysSinceEpoc(this.getDates()); for (int i = 0; i < filenames.length; i++) { filenames[i] = this.generateLatitudeFilename(latitudeDegree, variableNames[i]); this.createVariableFile(filenames[i], Arrays.asList(LAT, LONG, TIME), i, TIME_SIZE, blockLatSize, blockLongSize); this.fillCoordinateVariables(filenames[i], sortedLongitudes, sortedLatitudes, dates, blockLatRange, blockLongRange, TIME_RANGE); this.fillSpatialVariables(filenames[i], triples); this.fillDataForLatitude(filenames[i], i, sortedLongitudes, sortedLatitudes, dates, Arrays.asList(LAT, LONG, TIME)); } // for each cellId csv file we read, we will have available the values for both rainFall and PVET, therefore // it makes sense to fill these variables at the same time. this.fillDataByLatitudeVariables(filenames, triples, Arrays.asList(LAT, LONG, TIME)); } } /** * Splits a directory of WRON csv files into corresponding netCDF files that are grouped by decade. * * @return * * @throws Exception */ public void splitByDecade(String startingLatitude, String endingLatitude) throws Exception { // get all rows in lookup file List<CellData> triples = this.getAllTriples(this.readLookupFile()); // get the values to fill the coordinate variables. Set<String> sortedLatitudes = this.getSortedLatitudes(triples); String blockLatRange = "0-" + String.valueOf(sortedLatitudes.size() - 1); Set<String> sortedLongitudes = this.getSortedLongitudes(triples); String blockLongRange = "0-" + String.valueOf(sortedLongitudes.size() - 1); String startingLongitude = new ArrayList<String>(sortedLongitudes).get(0); // groups dates by decade Map<Integer, List<String>> datesByDecade = this.getDatesByDecade(this.getDates()); // sort by decade Set<Integer> decadeKeySet = datesByDecade.keySet(); List<Integer> decadeKeyList = new ArrayList<Integer>(decadeKeySet); Collections.sort(decadeKeyList); Map<Integer, String[]> allFilenames = new HashMap<Integer, String[]>(); // for each decade create a netCDF file. int start = 0; int end = start; int filenameStart = 0; for (Integer decadeKey : decadeKeyList) { LOG.warn("Started work on decade: " + decadeKey + "0s."); System.gc(); LOG.warn(" Mem: " + getMemDisplay()); List<String> dates = datesByDecade.get(decadeKey); end = end + dates.size(); int blockTimeSize = dates.size(); String blockTimeRange = "0-" + String.valueOf(dates.size() - 1); // create file names String decadeStr = String.valueOf(decadeKey + "0"); String filenames[] = new String[numVariables]; dates = this.getDatesAsDaysSinceEpoc(dates); for (int i = 0; i < filenames.length; i++) { filenames[i] = this.generateDecadeFilename(decadeStr, variableNames[i]); if ("".equals(startingLatitude)) { this.createVariableFile(filenames[i], Arrays.asList(TIME, LAT, LONG), i, blockTimeSize, LAT_SIZE, LONG_SIZE); this.fillCoordinateVariables(filenames[i], sortedLongitudes, sortedLatitudes, dates, blockLatRange, blockLongRange, blockTimeRange); this.fillSpatialVariables(filenames[i], triples); } } allFilenames.put(decadeKey, filenames); filenameStart += numVariables; } LOG.warn(" Latitude limits : " + startingLatitude + " to " + endingLatitude + "."); int numBlocks = LAT_SIZE / ROW_CHUNK_SIZE + (LAT_SIZE % ROW_CHUNK_SIZE > 0 ? 1 : 0); Calendar baseCal = convUtils.getCalendar(new Date()); baseCal.clear(); baseCal.set(1895, 0, 1); |
File | Line |
---|---|
au\csiro\netcdf\wron\MdbsyScenarioAConverter.java | 539 |
au\csiro\netcdf\wron\MdbsyScenarioCConverter.java | 563 |
globalAttrs.add(ipccClimateModel); if (METADATA_FILE.length() > 0) { globalAttrs.addAll(NetCDFUtils.readAttributesFromStream(new FileInputStream(METADATA_FILE))); } NcDefineAttributes ncDefineAttr = new NcDefineAttributes(); ncDefineAttr.execute(outputFileName, globalAttrs, false /* isLargeFileSupport */); String dimensions = ""; for (String dimension : dimensionOrdering) { dimensions += dimension + " "; } this.defineVariable(outputFileName, dimensions, variableIndex); } /** * Define the dimensions for a WRON netCDF file, e.g. latitude, longitude, time. * * @param outputFileName * @throws IllegalArgumentException * @throws ParseException * @throws IOException */ private void defineDimensions(String outputFileName, List<String> dimensionOrdering, int blockTimeSize, int blockLatSize, int blockLongSize) throws IllegalArgumentException, ParseException, IOException { NcDefineDimension command = new NcDefineDimension(); for (String dimName : dimensionOrdering) { if (dimName.equals(TIME)) { command.execute(outputFileName, TIME, blockTimeSize, false /* isUnlimited */, false/* fillValue */); } else if (dimName.equals(LAT)) { command.execute(outputFileName, LAT, blockLatSize, false /* isUnlimited */, false/* fillValue */); } else if (dimName.equals(LONG)) { command.execute(outputFileName, LONG, blockLongSize, false /* isUnlimited */, false/* fillValue */); } } // Add NV as the final dimension command.execute(outputFileName, NV, NV_SIZE, false /* isUnlimited */, false/* fillValue */); } /** * Defines the coordinate variables for a WRON netCDF file, e.g. latitude, longitude, time. * * @param outputFileName * @throws IllegalArgumentException * @throws ParseException * @throws IOException */ private void defineCoordinateVariables(String outputFileName) throws IllegalArgumentException, ParseException, IOException { NcDefineVariable command = new NcDefineVariable(); command.execute(new File(outputFileName), LAT, DataType.FLOAT, Arrays.asList(new Attribute("units", LAT_UNITS), new Attribute("long_name", LAT_LONG_NAME), new Attribute("standard_name", LAT_STANDARD_NAME), new Attribute("axis", LAT_AXIS)), LAT, false /* isLargeFileSupport */, false/* fillValue */); command.execute(new File(outputFileName), LONG, DataType.FLOAT, Arrays.asList( new Attribute("long_name", LONG_LONG_NAME), new Attribute("units", LONG_UNITS), new Attribute("standard_name", LONG_STANDARD_NAME), new Attribute( "axis", LONG_AXIS)), LONG, false /* isLargeFileSupport */, false/* fillValue */); command.execute(new File(outputFileName), TIME, DataType.INT, Arrays.asList(new Attribute("units", TIME_UNITS), new Attribute("long_name", TIME_LONG_NAME), new Attribute("standard_name", TIME_STANDARD_NAME), new Attribute("axis", TIME_AXIS), new Attribute("calendar", TIME_CALENDAR), new Attribute("bounds", TIME_BOUNDS)), TIME, false /* isLargeFileSupport */, false/* fillValue */); command.execute(new File(outputFileName), TIME_BOUNDS, DataType.INT, new ArrayList<Attribute>(), TIME + " " + NV, false /* isLargeFileSupport */, false/* fillValue */); command.execute(new File(outputFileName), GRID_MAPPING, DataType.INT, Arrays.asList(new Attribute( "grid_mapping_name", CRS_GRID_MAPPING_NAME), new Attribute("longitude_of_prime_meridian", CRS_LONGITUDE_OF_PRIME_MERIDIAN), new Attribute("semi_major_axis", CRS_SEMI_MAJOR_AXIS), new Attribute("inverse_flattening", CRS_INVERSE_FLATTENING)), "", false /* isLargeFileSupport */, true/* fillValue */); } /** * Defines the spatial metadata variables for a WRON netCDF file, e.g. elevation, catchment id etc. * * @param outputFileName * The file to written to * @throws IOException * If the definitions cannot be written */ private void defineSpatialVariables(String outputFileName) throws IOException { NcDefineVariable command = new NcDefineVariable(); String spatialDim = LAT + " " + LONG; command.execute(new File(outputFileName), ELEVATION, DataType.FLOAT, Arrays.asList(new Attribute("units", ELEVATION_UNITS), new Attribute("standard_name", ELEVATION_STANDARD_NAME), new Attribute("long_name", ELEVATION_LONG_NAME), new Attribute("_FillValue", ELEVATION_MISSING_VALUE), new Attribute( "grid_mapping", GRID_MAPPING)), spatialDim, false /* isLargeFileSupport */, false/* fillValue */); command .execute(new File(outputFileName), CATCHMENT_ID, DataType.FLOAT, Arrays.asList(new Attribute( "long_name", CATCHMENT_ID_LONG_NAME), new Attribute("_FillValue", CATCHMENT_ID_MISSING_VALUE), new Attribute( "grid_mapping", GRID_MAPPING)), spatialDim, false /* isLargeFileSupport */, false/* fillValue */); command .execute(new File(outputFileName), REPORTING_REGION, DataType.FLOAT, Arrays.asList(new Attribute( "long_name", REPORTING_REGION_LONG_NAME), new Attribute("_FillValue", REPORTING_REGION_MISSING_VALUE), new Attribute( "grid_mapping", GRID_MAPPING)), spatialDim, false /* isLargeFileSupport */, false/* fillValue */); } /** * Defines the rainFall variable * * @param outputFileName * @throws IllegalArgumentException * @throws IOException * @throws ParseException */ private void defineVariable(String outputFileName, String dimensions, int variableIndex) throws IllegalArgumentException, IOException, ParseException { NcDefineVariable command = new NcDefineVariable(); command.execute(new File(outputFileName), variableNames[variableIndex], variableDataTypes[variableIndex], Arrays.asList(new Attribute("units", variableUnits[variableIndex]), new Attribute("long_name", variableLongNames[variableIndex]), new Attribute("missing_value", Float .valueOf(variableMissingValues[variableIndex])), new Attribute("_FillValue", Float .valueOf(variableFillValues[variableIndex])), new Attribute("grid_mapping", |
File | Line |
---|---|
au\csiro\netcdf\wron\MdbsyScenarioAConverter.java | 471 |
au\csiro\netcdf\wron\MdbsyScenarioCConverter.java | 493 |
baseCal.set(1895, 0, 1); Set<String> limitedLatitudes = convUtils.getLimitedLatitudes(sortedLatitudes, startingLatitude, endingLatitude); for (int blockNum = 0; blockNum < numBlocks; blockNum++) { LOG.warn(" Processing block : " + blockNum + "."); LOG.warn(" Mem: " + getMemDisplay()); // Grab the next set of latitudes to be read List<String> lats = convUtils.getLatitudeBlock(limitedLatitudes, blockNum, ROW_CHUNK_SIZE); if (lats.isEmpty()) { LOG.warn(" Skipping block as it is outside the latitude range."); } else { LOG.warn(" Processing latitudes : " + lats + "."); // Build a set of files covering those latitudes List<CellData> targetCells = convUtils.buildCsvFilenamesForLatitudes(lats, triples, INPUT_CSV_DIRECTORY, ".csv"); // Read all data from the file set LOG.warn(" Reading data from CSVs..."); Map<Integer, Map<String, LongitudeRange>> latData = convUtils.readDataByLatitudes(targetCells, lats, numVariables, TIME_SIZE, LONG_SIZE, variableFillValues, startingLongitude); // Write out the data in latitude blocks LOG.warn(" Writing data to netCDF..."); LOG.warn(" Mem: " + getMemDisplay()); convUtils.writeLatDataByDecade(latData, allFilenames, variableNames, baseCal.getTime()); LOG.warn(" Writing finished."); } } } public String getMemDisplay() { Runtime rt = Runtime.getRuntime(); NumberFormat numFmt = NumberFormat.getNumberInstance(); numFmt.setMaximumFractionDigits(0); StringBuffer sb = new StringBuffer(); sb.append(numFmt.format(rt.totalMemory() / 1024.0)); sb.append(" Kb total, "); sb.append(numFmt.format(rt.freeMemory() / 1024.0)); sb.append(" Kb free, "); sb.append(numFmt.format(rt.maxMemory() / 1024.0)); sb.append(" Kb max."); return sb.toString(); } /** * Defines a netCDF file for the rainFall variable, but does not fill the variables * * @param outputFileName * @throws Exception */ private void createVariableFile(String outputFileName, List<String> dimensionOrdering, int variableIndex, int blockTimeSize, int blockLatSize, int blockLongSize) throws Exception { this.defineDimensions(outputFileName, dimensionOrdering, blockTimeSize, blockLatSize, blockLongSize); this.defineCoordinateVariables(outputFileName); this.defineSpatialVariables(outputFileName); // Add attributes DateFormat utcDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); Attribute converter = new Attribute("History", utcDateTime.format(new Date()) + " Converted to netCDF by " + "$Id: MdbsyScenarioCConverter.java 84 2010-08-25 05:56:46Z robertbridle $"); |
File | Line |
---|---|
au\csiro\netcdf\wron\MdbsyScenarioAConverter.java | 145 |
au\csiro\netcdf\wron\MdbsyScenarioCConverter.java | 163 |
private static final String TIME_CALENDAR = "Gregorian"; private static final String TIME_AXIS = "T"; private static final String TIME_BOUNDS = "time_bnds"; // longitude constants private static final String LONG = "longitude"; private static final int LONG_COLUMN_INDEX = 1; private static final String LONG_RANGE = "0-296"; private static final int LONG_SIZE = 297; private static final String LONG_UNITS = "degrees_east"; private static final String LONG_STANDARD_NAME = "longitude"; private static final String LONG_AXIS = "X"; private static final String LONG_LONG_NAME = "longitude"; // latitude constants private static final String LAT = "latitude"; private static final int LAT_COLUMN_INDEX = 2; private static final String LAT_RANGE = "0-278"; private static final int LAT_SIZE = 279; private static final String LAT_UNITS = "degrees_north"; private static final String LAT_STANDARD_NAME = "latitude"; private static final String LAT_AXIS = "Y"; private static final String LAT_LONG_NAME = "latitude"; // num values constants private static final String NV = "nv"; private static final String NV_RANGE = "0-1"; private static final int NV_SIZE = 2; // elevation constants private static String ELEVATION = "elev"; private static int ELEVATION_COLUMN_INDEX = 3; private static final String ELEVATION_UNITS = "m"; private static final String ELEVATION_STANDARD_NAME = "altitude"; private static final String ELEVATION_LONG_NAME = "Elevation above sea level"; private static final float ELEVATION_MISSING_VALUE = -999.99f; // catchment id constants private static String CATCHMENT_ID = "catchmentId"; private static int CATCHMENT_ID_COLUMN_INDEX = 4; private static final String CATCHMENT_ID_LONG_NAME = "MDB Catchment Id"; private static final float CATCHMENT_ID_MISSING_VALUE = 0f; // reporting region id constants private static String REPORTING_REGION = "repRegionId"; private static int REPORTING_REGION_ID_COLUMN_INDEX = 5; private static String REPORTING_REGION_LONG_NAME = "MDB Reporting Region Id"; private static final float REPORTING_REGION_MISSING_VALUE = 0f; // crs constants private static String CRS_GRID_MAPPING_NAME = "latitude_longitude"; private static float CRS_LONGITUDE_OF_PRIME_MERIDIAN = 0.0f; private static float CRS_SEMI_MAJOR_AXIS = 6378137.0f; private static float CRS_INVERSE_FLATTENING = 298.257222101f; // cell id private static final int CELL_ID_COLUMN_INDEX = 0; // Other cell data // date conversion constants private static final String EPOC_DATE_STRING = "1895-01-01"; |
File | Line |
---|---|
au\csiro\netcdf\wron\MdbsyScenarioAConverter.java | 1332 |
au\csiro\netcdf\wron\MdbsyScenarioCConverter.java | 1353 |
filename += MODEL_NAMES[FILE_NAME_MODEL_NAME] + "."; } if (CASE.length() > 0) { filename += CASE + "."; } filename += "Decade-" + decadeStr + ".Var-" + variable + NETCDF_FILE_EXTENSION; return filename; } /** * Displays the contents of the in-memory data structure/ * * @param lookup */ @SuppressWarnings("unused") private void printLookupInMemory(Map<Integer, Map<String, LongitudeRange>> lookup) { for (Iterator<Integer> dateIter = lookup.keySet().iterator(); dateIter.hasNext();) { Integer dateKey = dateIter.next(); System.out.println(dateKey); for (Iterator<String> latIter = lookup.get(dateKey).keySet().iterator(); latIter.hasNext();) { String latitude = latIter.next(); System.out.println("\t" + latitude); LongitudeRange longitudeRange = lookup.get(dateKey).get(latitude); System.out.println("\t\t" + longitudeRange.getStartLongitudeRange() + "-" + longitudeRange.getEndLongitudeRange()); } } } public enum CellDataVariable { CELLID, LONGITUDE, LATITUDE, ELEVATION, CATCHMENTID, REPORTINGREGIONID } |
File | Line |
---|---|
au\csiro\netcdf\wron\MdbsyScenarioAConverter.java | 219 |
au\csiro\netcdf\wron\MdbsyScenarioCConverter.java | 237 |
private static final Logger LOG = Logger.getLogger(MdbsyScenarioCConverter.class.getName()); /** Conversion utilities */ private ConversionUtils convUtils = new ConversionUtils(); /** * @param args */ @SuppressWarnings("static-access") public static void main(String[] args) throws Exception { Options options = new Options(); try { Option inputDirectory = OptionBuilder.withArgName("dir").hasArg().withDescription( " 1: the directory containing the csv files for the scenario.").isRequired(true).withLongOpt( "inputDirectory").create("i"); Option lookupFile = OptionBuilder.withArgName("file").hasArg() .withDescription(" 2: the cellId lookup file.").isRequired(true).withLongOpt("lookupFile").create( "f"); Option outputDirectory = OptionBuilder.withArgName("dir").hasArg().withDescription( " 3: the output directory.").isRequired(true).withLongOpt("outputDirectory").create("o"); Option scenario = OptionBuilder.withArgName("text").hasArg().withDescription( " 4: the modelling scenario used to name the netCDF file.").isRequired(true).withLongOpt("scenario") .create("s"); Option model = OptionBuilder.withArgName("text").hasArg().withDescription( |
File | Line |
---|---|
au\csiro\netcdf\wron\MdbsyScenarioAConverter.java | 274 |
au\csiro\netcdf\wron\MdbsyScenarioCConverter.java | 302 |
options.addOption(modelCase); options.addOption(metadataFile); options.addOption(numRows); options.addOption(byDecade); options.addOption(byLatitude); options.addOption(startLat); options.addOption(endLat); // parse the command line arguments CommandLine parsedCommandLine = new BasicParser().parse(options, args); INPUT_CSV_DIRECTORY = (parsedCommandLine.hasOption("inputDirectory")) ? parsedCommandLine .getOptionValue("inputDirectory") : ""; LOCATION_LOOKUP_FILE = (parsedCommandLine.hasOption("lookupFile")) ? parsedCommandLine .getOptionValue("lookupFile") : ""; OUTPUT_NETCDF_DIRECTORY = (parsedCommandLine.hasOption("outputDirectory")) ? parsedCommandLine .getOptionValue("outputDirectory") : ""; SCENARIO = (parsedCommandLine.hasOption("scenario")) ? parsedCommandLine.getOptionValue("scenario") : ""; METADATA_FILE = (parsedCommandLine.hasOption("metadataFile")) ? parsedCommandLine .getOptionValue("metadataFile") : ""; |
File | Line |
---|---|
au\csiro\netcdf\NcWriteVariable.java | 586 |
au\csiro\netcdf\NcWriteVariable.java | 652 |
void readBinaryData(DataInputStream dataIn, Array buffer) throws IOException { Class cls = buffer.getElementType();// getClass(); boolean isFloat = cls.getName().equalsIgnoreCase("Float"); boolean isDouble = cls.getName().equalsIgnoreCase("Double"); boolean isLong = cls.getName().equalsIgnoreCase("Long"); boolean isInt = cls.getName().equalsIgnoreCase("Int"); boolean isChar = cls.getName().equalsIgnoreCase("Char"); boolean isByte = cls.getName().equalsIgnoreCase("Byte"); boolean isBoolean = cls.getName().equalsIgnoreCase("Boolean"); boolean isShort = cls.getName().equalsIgnoreCase("Short"); int i = 0; while (i < buffer.getSize()) { |