mirror of
https://github.com/Unidata/netcdf-c.git
synced 2025-02-11 16:40:36 +08:00
Some temporary files are being left in a tempdir (e.g. /tmp under *nix*). The situation is described tersely in netcdf-c/docs/auth.html#REDIR Basically, when a url is used that requires redirection, a physical cookiejar file is required to exist in the file system in order for this to work. Since it was difficult to figure out when redirection was being used (it was internal to libcurl) I needed to be prepared for that eventuality. The result was that I always created a cookiejar file if one was not specified in the rc file. This actually occurs in two places: one inside oc2 and one inside libdap4. The solution was two-fold: 1. do not use a cookiejar directory -- create cookiejar file directly 2. ensure that all cookiejar related files are reclaimed by nc_close(). Note that if nc_close (or nc_abort) is not called for whatever reason, then reclamation will not occur.
258 lines
6.3 KiB
C
258 lines
6.3 KiB
C
/* varm_test */
|
|
/* acm 9/15/09 */
|
|
/* ansley.b.manke@noaa.gov */
|
|
/* test nc_get_varm_float with calls similar to Ferret calls */
|
|
/* local file is correct results with stride: every second value */
|
|
/* remote url; incorrect results with stride
|
|
|
|
linked with:
|
|
cc varm_test.c -g -o varm_test /home/nstout/ansley/local/lib/libnetcdf.a -L/usr/lib64 -lc -lm -lcurl
|
|
|
|
netcdf.a from the daily snapshot
|
|
netcdf-4.1-beta2-snapshot2009091100
|
|
*/
|
|
|
|
/* This particular test seems to occasionally expose a server error*/
|
|
|
|
|
|
#include <config.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "netcdf.h"
|
|
#include "ncdispatch.h"
|
|
#include "nctestserver.h"
|
|
|
|
#undef STANDALONE
|
|
|
|
#undef DEBUG
|
|
|
|
#define TESTPATH "/dodsC/testdods/coads_climatology.nc"
|
|
#define VAR "SST"
|
|
|
|
static float expected_stride1[12] = {
|
|
29.430857,
|
|
29.403780,
|
|
29.325428,
|
|
29.578333,
|
|
29.660833,
|
|
29.378437,
|
|
29.151943,
|
|
29.109715,
|
|
29.114864,
|
|
29.550285,
|
|
29.542500,
|
|
29.500286
|
|
};
|
|
|
|
static float expected_stride2[6] = {
|
|
29.430857,
|
|
29.325428,
|
|
29.660833,
|
|
29.151943,
|
|
29.114864,
|
|
29.542500
|
|
};
|
|
|
|
static float expected_stride3[3] = {
|
|
29.430857,
|
|
29.378437,
|
|
29.542500
|
|
};
|
|
|
|
void
|
|
check(int status, char* file, int line)
|
|
{
|
|
if(status == 0) return;
|
|
fprintf(stderr,"error: %s at %s:%d\n",nc_strerror(status),file,line);
|
|
exit(1);
|
|
}
|
|
|
|
int
|
|
main()
|
|
{
|
|
|
|
int ncid;
|
|
int varid;
|
|
int i,fail;
|
|
int err;
|
|
size_t start[5], count[5];
|
|
ptrdiff_t stride[5], imap[5];
|
|
int idim;
|
|
float dat[20];
|
|
char url[4096];
|
|
char* svc;
|
|
#ifdef STANDALONE
|
|
int ndim;
|
|
#endif
|
|
|
|
#ifdef DEBUG
|
|
oc_loginit();
|
|
oc_setlogging(1);
|
|
oc_logopen(NULL);
|
|
#endif
|
|
|
|
/* Find Test Server */
|
|
svc = nc_findtestserver("thredds",0,REMOTETESTSERVERS);
|
|
|
|
if(svc == NULL) {
|
|
fprintf(stderr,"Cannot locate test server\n");
|
|
exit(0);
|
|
}
|
|
strcpy(url,svc);
|
|
strcat(url,TESTPATH);
|
|
|
|
printf("*** Test: varm on URL: %s\n",url);
|
|
|
|
check(err = nc_open(url, NC_NOWRITE, &ncid),__FILE__,__LINE__);
|
|
check(err = nc_inq_varid(ncid, VAR, &varid),__FILE__,__LINE__);
|
|
for (idim=0; idim<4; idim++) {
|
|
start[idim] = 0;
|
|
count[idim] = 1;
|
|
stride[idim] = 1;
|
|
imap[idim] = 1;
|
|
}
|
|
#ifdef STANDALONE
|
|
ndim=3;
|
|
#endif
|
|
|
|
printf("*** Testing: stride case 1\n");
|
|
start[1] = 44;
|
|
start[2] = 66;
|
|
count[0] = 12;
|
|
|
|
#ifdef STANDALONE
|
|
printf("start = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)start[i]);
|
|
printf("\n");
|
|
printf("count = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)count[i]);
|
|
printf("\n");
|
|
printf("stride = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)stride[i]);
|
|
printf("\n");
|
|
printf("map = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)imap[i]);
|
|
printf("\n");
|
|
|
|
err = nc_get_vars_float (ncid, varid, start, count, stride,
|
|
(float*) dat);
|
|
printf("vars: %s =",VAR);
|
|
for(i=0;i<12;i++) printf(" %f",dat[i]);
|
|
printf("\n");
|
|
#endif
|
|
|
|
check(err = nc_get_varm_float (ncid, varid, start, count, stride, imap,(float*) dat),__FILE__,__LINE__);
|
|
/* check(err = nc_get_vara_float (ncid, varid, start, count, (float*) dat),__FILE__,__LINE__); */
|
|
|
|
#ifdef STANDALONE
|
|
printf("varm: %s =",VAR);
|
|
for(i=0;i<12;i++) printf(" %f",dat[i]);
|
|
printf("\n");
|
|
#endif
|
|
fail=0;
|
|
for(i=0;i<12;i++) {
|
|
float delta = (dat[i] - expected_stride1[i]);
|
|
if(delta > 0.0005 || delta < -0.0005) {
|
|
fprintf(stderr,"*** Failure: unexpected value: delta=%g dat[%d]=%g expected[%d]=%g\n",
|
|
delta, i, dat[i], i, expected_stride1[i]);
|
|
fail = 1;
|
|
}
|
|
}
|
|
printf("*** %s: stride case 1\n",(fail?"Fail":"Pass"));
|
|
|
|
printf("*** Testing: stride case 2\n");
|
|
/* case with strides #1 where len % stride == 0 */
|
|
start[1] = 44;
|
|
start[2] = 66;
|
|
count[0] = 6;
|
|
stride[0] = 2;
|
|
|
|
#ifdef STANDALONE
|
|
printf("start = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)start[i]);
|
|
printf("\n");
|
|
printf("count = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)count[i]);
|
|
printf("\n");
|
|
printf("stride = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)stride[i]);
|
|
printf("\n");
|
|
printf("map = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)imap[i]);
|
|
printf("\n");
|
|
|
|
check(err = nc_get_vars_float(ncid, varid, start, count, stride,
|
|
(float*) dat),__FILE__,__LINE__);
|
|
printf("strided.vars: %s =",VAR);
|
|
for(i=0;i<6;i++) printf(" %f",dat[i]);
|
|
printf("\n");
|
|
#endif
|
|
check(err = nc_get_varm_float(ncid, varid, start, count, stride, imap,
|
|
(float*) dat),__FILE__,__LINE__);
|
|
#ifdef STANDALONE
|
|
printf("strided.varm: %s =",VAR);
|
|
for(i=0;i<6;i++) printf(" %f",dat[i]);
|
|
printf("\n");
|
|
#endif
|
|
fail=0;
|
|
for(i=0;i<6;i++) {
|
|
float delta = (dat[i] - expected_stride2[i]);
|
|
if(delta > 0.0005 || delta < -0.0005) {
|
|
fprintf(stderr,"*** Failure: unexpected value: delta=%g dat[%d]=%g expected[%d]=%g\n",
|
|
delta, i, dat[i], i, expected_stride2[i]);
|
|
fail=1;
|
|
}
|
|
}
|
|
printf("*** %s: stride case 2\n",(fail?"Fail":"Pass"));
|
|
|
|
/* case with strides #2: len % stride != 0 */
|
|
printf("*** Testing: stride case 3\n");
|
|
start[1] = 44;
|
|
start[2] = 66;
|
|
count[0] = 3;
|
|
stride[0] = 5;
|
|
|
|
#ifdef STANDALONE
|
|
printf("start = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)start[i]);
|
|
printf("\n");
|
|
printf("count = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)count[i]);
|
|
printf("\n");
|
|
printf("stride = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)stride[i]);
|
|
printf("\n");
|
|
printf("map = ");
|
|
for(i=0;i<ndim;i++) printf(" %d",(int)imap[i]);
|
|
printf("\n");
|
|
|
|
check(err = nc_get_vars_float(ncid, varid, start, count, stride,
|
|
(float*) dat),__FILE__,__LINE__);
|
|
printf("strided.vars: %s =",VAR);
|
|
for(i=0;i<3;i++) printf(" %f",dat[i]);
|
|
printf("\n");
|
|
#endif
|
|
check(err = nc_get_varm_float(ncid, varid, start, count, stride, imap,
|
|
(float*) dat),__FILE__,__LINE__);
|
|
#ifdef STANDALONE
|
|
printf("strided.varm: %s =",VAR);
|
|
for(i=0;i<3;i++) printf(" %f",dat[i]);
|
|
printf("\n");
|
|
#endif
|
|
fail=0;
|
|
for(i=0;i<3;i++) {
|
|
float delta = (dat[i] - expected_stride3[i]);
|
|
if(delta > 0.0005 || delta < -0.0005) {
|
|
fprintf(stderr,"*** Failure: stride case 2: unexpected value: delta=%g dat[%d]=%g expected[%d]=%g\n",
|
|
delta, i, dat[i], i, expected_stride3[i]);
|
|
fail=1;
|
|
}
|
|
}
|
|
printf("*** %s: stride case 3\n",(fail?"Fail":"Pass"));
|
|
|
|
nc_close(ncid);
|
|
return fail;
|
|
|
|
}
|