Hi -
I'm getting a crash when calling nc_get_vara to read large amounts of
data. This is happening with netCDF4.1.2 and also the beta and
snapshot versions of 4.1.3 (netcdf-4.1.3-rc1-snapshot2011050612). I
configure netcdf with hdf 1.8.6, and with:
$ configure --prefix=/home/users/ansley/local/linux --disable-shared
--enable-dap --enable-dap-remote-tests --with-zlib=/usr/local
--enable-netcdf-4 --enable-ncgen4 --enable-largefile
Reading, say, 360x180x100 is successful but 360x180x600 fails, with a
crash inside buildcachenode34 in cache.c
(What cache is this? Are there settings I can make regarding caching?
What has happened to use of the .dodsrc file? I have a .dodsrc file but
it has caching turned off.)
I've attached a test program showing this, based on test_vara.c from
the tests in the ncdap_test/
thanks -Ansley
/* test_vara_big.c Crash on the call to nc_get_vara_float when the region is
large. */
/* netcdf4.1.2, netcdf4.1.3beta and snapshots
/* 5/11/2011 */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netcdf.h>
#define URL
"http://ferret.pmel.noaa.gov/thredds/dodsC/data/PMEL/COADS/coads_air.cdf"
#define VAR "AIR"
#define X 180
#define Y 90
#define T 1680
/* A second example showing the same behavior.
/* #define URL
"http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/coads/1degree/global/enh/air.mean.nc"
/*
/* #define VAR "air"
/*
/* #define X 360
/* #define Y 180
/* #define T 616 */
#define RANK 3
#define ERRCODE 2
#define ERR(e) {printf("Error: %s\n", nc_strerror(e)); exit(ERRCODE);}
#undef DEBUG
static float threeD[T][Y][X];
static dims[RANK] = {T,Y,X};
/* Define whole variable start/count */
static size_t start0[RANK] = {0,0,0};
static size_t count0[RANK] = {T,Y,X};
int
main()
{
int ncid, varid;
int retval,i;
size_t start[RANK];
size_t count[RANK];
memset((void*)threeD,0,sizeof(threeD));
if((retval = nc_open(URL, NC_NOWRITE, &ncid)))
ERR(retval);
if((retval = nc_inq_varid(ncid, VAR, &varid)))
ERR(retval);
/* test 1: Read the first 100 timesteps */
memcpy(start,start0,sizeof(start0));
memcpy(count,count0,sizeof(count0));
count[0] = 100;
printf("*** read 100 timesteps\n");
if((retval = nc_get_vara_float(ncid,varid,start,count,(float*)threeD)))
ERR(retval);
/* test 2: Read the whole variable */
memcpy(start,start0,sizeof(start0));
memcpy(count,count0,sizeof(count0));
printf("*** read entire variable\n");
if((retval = nc_get_vara_float(ncid,varid,start,count,(float*)threeD)))
ERR(retval);
if((retval = nc_close(ncid)))
ERR(retval);
return 0;
}