The NetcdfFileWriteable.write() signature says:
/** Write data to the named variable. Must not be in define mode.
* @param varName name of variable. IllegalArgumentException if variable name
does not exist.
* @param origin offset within the variable to start writing.
* @param values write this array; must be same type and rank as Variable
* @throws IOException
*/
public void write(String varName, int [] origin, Array values) throws
java.io.IOException, InvalidRangeException.
So the problem is it expects that the values array has same rank as variable.
If it doesnt, i dont think its possible (in general, not in the scalar case) to
figure out how to write the data. so i will leave it.
Ethan Davis wrote:
I just answered a netcdf-java question about not having to read all data
before writing netcdf. I put together some sample code to send them. My
first stab was using Arrays with rank 0 but got some out of bounds
problems. It does fine if I use an Array of rank 1. Looks like with a
rank 0 array the NetcdfFileWriteable.write() calls the
N3iosp.writeData() with a sectionList that is empty which then does a
get(0) on an empty list.
Probably a pretty quick fix but I haven't thought about it enough to
take a stab at it.
Here's my code:
public void testOne()
{
String fileName = "testWriteAlongUnlimited.nc";
NetcdfFileWriteable ncfile = NetcdfFileWriteable.createNew( fileName,
true );
Dimension timeDim = new Dimension( "time",
Dimension.UNLIMITED.getLength(), true, true, false );
ncfile.addDimension( null, timeDim );
Dimension [] dims = { timeDim};
ncfile.addVariable( "time", DataType.INT, dims );
ncfile.addVariable( "temp", DataType.FLOAT, dims );
ncfile.addVariable( "pres", DataType.FLOAT, dims );
try
{
ncfile.create();
}
catch ( IOException e )
{
assertTrue( "Failed to create file <" + fileName + ">: " +
e.getMessage(),
false);
}
ArrayInt.D0 timeArray = new ArrayInt.D0();
ArrayFloat.D0 tempArray = new ArrayFloat.D0();
ArrayFloat.D0 presArray = new ArrayFloat.D0();
for ( int i = 0; i < 10; i++ )
{
int[] origin = { i+1};
timeArray.set( i);
tempArray.set( i);
presArray.set( i);
try
{
ncfile.write( "time", origin, timeArray);
ncfile.write( "temp", origin, tempArray);
ncfile.write( "pres", origin, presArray);
}
catch ( IOException e )
{
assertTrue( "Failed to write file <" + fileName + "> at index= "
+ i + ": " + e.getMessage(),
false );
}
catch ( InvalidRangeException e )
{
assertTrue( "Bad range writing file <" + fileName + "> at index=
" + i + ": " + e.getMessage(),
false );
}
}
try
{
ncfile.flush();
ncfile.close();
}
catch ( IOException e )
{
assertTrue( "Failed to flush/close file <" + fileName + ">: " +
e.getMessage(),
false );
}
}