[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Searching for working example...
- Subject: Re: Searching for working example...
- Date: Mon, 01 Dec 2003 15:55:49 -0700
Hoeven, Maarten van der wrote:
Hi all,
I'm using the Java2-lib to create Netcdf-files. I got it working to the
extend that I can create the file (dimensions, variables) and write a
lot of data to it. All in one go. This is working perfectly.
However, I want to walk a slightly different road. That is, to create
only once an empty netcdf-file (only variables and dimensions stored in
it, hence the structure), and after that to write data to it every day.
To put in other words, to update the netcdf-file with daily data.
This must be possible, because I saw some Java1-lib working examples.
However, it must be working a bit different in version 2 of the
Java-lib, because I run into problems. The problems are that I am
messing around with the origin array; I cant get this working.
Like:
ncfile.write("tn", origin, ArrayAbstract.factory(tnArr));
where origin is an int[1]-array.
I understand I have to use origin, to make clear at what position in the
file the new data must be written. But I must be overlooking
something...
Does someone has a working Java-source for me (capable to use with
Netcdf for Java Version 2 (!)), in which an existing netcdf-file is
updated with new data?
Thanks,
Maarten
+-------------------------------
| Maarten van der Hoeven
| KNMI, De Bilt, The Netherlands
| +31-30-2206 402
| address@hidden
+-------------------------------
--------------------------------------------------------------
Zie ook/see also: http://www.knmi.nl/maildisclaimer.html
attached is an example of creating a file and then later writing to it.
let me know if this is adequate.
package ucar.nc2;
import junit.framework.*;
import ucar.ma2.*;
import ucar.nc2.*;
import java.io.IOException;
/**
* Simple example to create a new netCDF file corresponding to the following
* CDL:
* <pre>
* netcdf example {
* dimensions:
* lat = 3 ;
* lon = 4 ;
* time = UNLIMITED ;
* variables:
* int rh(time, lat, lon) ;
* rh:long_name="relative humidity" ;
* rh:units = "percent" ;
* double T(time, lat, lon) ;
* T:long_name="surface temperature" ;
* T:units = "degC" ;
* float lat(lat) ;
* lat:units = "degrees_north" ;
* float lon(lon) ;
* lon:units = "degrees_east" ;
* int time(time) ;
* time:units = "hours" ;
* // global attributes:
* :title = "Example Data" ;
* data:
* rh =
* 1, 2, 3, 4,
* 5, 6, 7, 8,
* 9, 10, 11, 12,
* 21, 22, 23, 24,
* 25, 26, 27, 28,
* 29, 30, 31, 32 ;
* T =
* 1, 2, 3, 4,
* 2, 4, 6, 8,
* 3, 6, 9, 12,
* 2.5, 5, 7.5, 10,
* 5, 10, 15, 20,
* 7.5, 15, 22.5, 30 ;
* lat = 41, 40, 39 ;
* lon = -109, -107, -105, -103 ;
* time = 6, 18 ;
* }
* </pre>
*
* @author: Russ Rew
* @author: John Caron
*/
public class TestCreate extends TestCase {
static String fileName = TestAll.topDir+"example.nc"; // default name of file
created
public TestCreate( String name) {
super(name);
}
public void testCreate() {
NetcdfFileWriteable ncfile = new NetcdfFileWriteable();
ncfile.setName(fileName);
// define dimensions
Dimension latDim = ncfile.addDimension("lat", 3);
Dimension lonDim = ncfile.addDimension("lon", 4);
Dimension timeDim = ncfile.addDimension("time", -1);
// define Variables
Dimension[] dim3 = new Dimension[3];
dim3[0] = timeDim;
dim3[1] = latDim;
dim3[2] = lonDim;
// int rh(time, lat, lon) ;
// rh:long_name="relative humidity" ;
// rh:units = "percent" ;
ncfile.addVariable("rh", int.class, dim3);
ncfile.addVariableAttribute("rh", "long_name", "relative humidity");
ncfile.addVariableAttribute("rh", "units", "percent");
// double T(time, lat, lon) ;
// T:long_name="surface temperature" ;
// T:units = "degC" ;
ncfile.addVariable("T", double.class, dim3);
ncfile.addVariableAttribute("T", "long_name", "surface temperature");
ncfile.addVariableAttribute("T", "units", "degC");
// float lat(lat) ;
// lat:units = "degrees_north" ;
ncfile.addVariable("lat", float.class, new Dimension[] {latDim});
ncfile.addVariableAttribute("lat", "units", "degrees_north");
// float lon(lon) ;
// lon:units = "degrees_east" ;
ncfile.addVariable("lon", float.class, new Dimension[] {lonDim});
ncfile.addVariableAttribute("lon", "units", "degrees_east");
// int time(time) ;
// time:units = "hours" ;
ncfile.addVariable("time", int.class, new Dimension[] {timeDim});
ncfile.addVariableAttribute("time", "units", "hours");
// :title = "Example Data" ;
ncfile.addGlobalAttribute("title", "Example Data");
// create the file
try {
ncfile.create();
} catch (IOException e) {
System.err.println("ERROR creating file");
assert(false);
}
//System.out.println( "ncfile = "+ ncfile);
// write the RH data one value at a time to an Array
int[][][] rhData = {{{ 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 12}},
{{21, 22, 23, 24}, {25, 26, 27, 28}, {29, 30, 31, 32}}};
ArrayInt rhA = new ArrayInt.D3(2, latDim.getLength(), lonDim.getLength());
int i,j,k;
Index ima = rhA.getIndex();
// write
for (i=0; i<2; i++)
for (j=0; j<latDim.getLength(); j++)
for (k=0; k<lonDim.getLength(); k++)
rhA.setInt(ima.set(i,j,k), rhData[i][j][k]);
// write rhData out to disk
try {
ncfile.write("rh", rhA);
} catch (IOException e) {
System.err.println("ERROR writing file");
assert(false);
}
/* Here's an ArrayAbstract approach to set the values of T all at once. */
double[][][] tData = {
{{ 1, 2, 3, 4}, {2, 4, 6, 8}, { 3, 6, 9, 12}},
{{2.5, 5, 7.5, 10}, {5, 10, 15, 20}, {7.5, 15, 22.5, 30}}
};
try {
ncfile.write("T", ArrayAbstract.factory(tData));
} catch (IOException e) {
System.err.println("ERROR writing file");
assert(false);
}
/* Store the rest of variable values */
try {
ncfile.write("lat", ArrayAbstract.factory(new float[] {41, 40, 39}));
ncfile.write("lon", ArrayAbstract.factory(new float[] {-109, -107, -105,
-103}));
ncfile.write("time", ArrayAbstract.factory(new int[] {6, 18}));
} catch (IOException e) {
System.err.println("ERROR writing file");
assert(false);
}
// all done
try {
ncfile.close();
} catch (IOException e) {
System.err.println("ERROR writing file");
assert(false);
}
System.out.println( "*****************Create Netcdf done");
}
public void testWriteExisting() {
NetcdfFileWriteable ncfile = null;
try {
ncfile = new NetcdfFileWriteable(fileName);
} catch (IOException e) {
System.err.println("ERROR opening file "+fileName);
assert(false);
}
// find dimensions
Dimension latDim = ncfile.findDimension("lat");
Dimension lonDim = ncfile.findDimension("lon");
Dimension timeDim = ncfile.findDimension("time");
// find Variables
Variable rh = ncfile.findVariable("rh");
// create the data values
ArrayInt rhA = new ArrayInt.D3(2, latDim.getLength(), lonDim.getLength());
Index ima = rhA.getIndex();
for (int i=0; i<2; i++)
for (int j=0; j<latDim.getLength(); j++)
for (int k=0; k<lonDim.getLength(); k++)
rhA.setInt(ima.set(i,j,k), (i+1)*(j+1)*(k+1));
// write rhData out to disk
int[] origin = new int[3];
origin[0] = timeDim.getLength(); // starts at the existing length
try {
ncfile.write("rh", origin, rhA);
} catch (IOException e) {
System.err.println("ERROR writing file");
assert(false);
}
// all done
try {
ncfile.close();
} catch (IOException e) {
System.err.println("ERROR writing file");
assert(false);
}
System.out.println( " testWriteExisting Netcdf done");
}
public void testReadExisting() {
NetcdfFile ncfile = null;
try {
ncfile = new NetcdfFile(fileName);
} catch (IOException e) {
System.err.println("ERROR opening file "+fileName);
assert(false);
}
// find dimensions
Dimension latDim = ncfile.findDimension("lat");
Dimension lonDim = ncfile.findDimension("lon");
Dimension timeDim = ncfile.findDimension("time");
assert timeDim.getLength() == 4;
// find Variables
Variable rh = ncfile.findVariable("rh");
assert rh.getRank() == 3;
assert rh.getDataType() == DataType.INT;
try {
ArrayInt.D3 rhA = (ArrayInt.D3) rh.read();
Index ima = rhA.getIndex();
for (int i = 2; i < 4; i++)
for (int j = 0; j < latDim.getLength(); j++)
for (int k = 0; k < lonDim.getLength(); k++)
assert rhA.getInt(ima.set(i, j, k)) == (i - 1) * (j + 1) * (k + 1);
} catch (IOException e) {
System.err.println("ERROR writing file");
assert(false);
}
// all done
try {
ncfile.close();
} catch (IOException e) {
System.err.println("ERROR writing file");
assert(false);
}
System.out.println( " testReadExisting Netcdf done");
}
}