/* See ncd3dispatch.c for other version */ int NCD3_open(const char * path, int mode, int basepe, size_t *chunksizehintp, int useparallel, void* mpidata, NC_Dispatch* dispatch, NC** ncpp) { NCerror ncstat = NC_NOERR; OCerror ocstat = OC_NOERR; NC* drno = NULL; NCDAPCOMMON* dapcomm = NULL; const char* value; char* tmpname = NULL; if(!nc3dinitialized) nc3dinitialize(); if(path == NULL) return NC_EDAPURL; if(dispatch == NULL) PANIC("NC3D_open: no dispatch table"); /* Setup our NC and NCDAPCOMMON state*/ drno = (NC*)calloc(1,sizeof(NC)); if(drno == NULL) {ncstat = NC_ENOMEM; goto done;} /* compute an ncid */ ncstat = add_to_NCList(drno); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} dapcomm = (NCDAPCOMMON*)calloc(1,sizeof(NCDAPCOMMON)); if(dapcomm == NULL) {ncstat = NC_ENOMEM; goto done;} drno->dispatch = dispatch; drno->dispatchdata = dapcomm; dapcomm->controller = (NC*)drno; dapcomm->cdf.separator = "."; dapcomm->cdf.smallsizelimit = DFALTSMALLLIMIT; dapcomm->cdf.cache = createnccache(); #ifdef HAVE_GETRLIMIT { struct rlimit rl; if(getrlimit(RLIMIT_NOFILE, &rl) >= 0) { dapcomm->cdf.cache->cachecount = (size_t)(rl.rlim_cur / 2); } } #endif #ifdef OCCOMPILEBYDEFAULT /* set the compile flag by default */ dapcomm->oc.rawurltext = (char*)emalloc(strlen(path)+strlen("[compile]")+1); strcpy(dapcomm->oc.rawurltext,"[compile]"); strcat(dapcomm->oc.rawurltext, path); #else dapcomm->oc.rawurltext = strdup(path); #endif nc_uriparse(dapcomm->oc.rawurltext,&dapcomm->oc.url); /* parse the client parameters */ nc_uridecodeparams(dapcomm->oc.url); if(!constrainable34(dapcomm->oc.url)) SETFLAG(dapcomm->controls,NCF_UNCONSTRAINABLE); /* Use libsrc code for storing metadata */ tmpname = nulldup(PSEUDOFILE); /* Now, use the file to create the netcdf file */ if(sizeof(size_t) == sizeof(unsigned int)) ncstat = nc_create(tmpname,NC_CLOBBER,&drno->substrate); else ncstat = nc_create(tmpname,NC_CLOBBER|NC_64BIT_OFFSET,&drno->substrate); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* free the filename so it will automatically go away*/ unlink(tmpname); nullfree(tmpname); /* Avoid fill */ nc_set_fill(drno->substrate,NC_NOFILL,NULL); dapcomm->oc.dapconstraint = (DCEconstraint*)dcecreate(CES_CONSTRAINT); dapcomm->oc.dapconstraint->projections = nclistnew(); dapcomm->oc.dapconstraint->selections = nclistnew(); /* Parse constraints to make sure they are syntactically correct */ ncstat = parsedapconstraints(dapcomm,dapcomm->oc.url->constraint,dapcomm->oc.dapconstraint); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* Complain if we are unconstrainable but have constraints */ if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) { if(dapcomm->oc.url->constraint != NULL && strlen(dapcomm->oc.url->constraint) > 0) { nclog(NCLOGWARN,"Attempt to constrain an unconstrainable data source: %s", dapcomm->oc.url->constraint); } } /* Construct a url for oc minus any parameters */ dapcomm->oc.urltext = nc_uribuild(dapcomm->oc.url,NULL,NULL, (NC_URIALL ^ NC_URICONSTRAINTS)); /* Pass to OC */ ocstat = oc_open(dapcomm->oc.urltext,&dapcomm->oc.conn); if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;} nullfree(dapcomm->oc.urltext); /* clean up */ dapcomm->oc.urltext = NULL; /* process control client parameters */ applyclientparamcontrols3(dapcomm); /* Turn on logging; only do this after oc_open*/ if((value = paramvalue34(dapcomm,"log")) != NULL) { ncloginit(); ncsetlogging(1); nclogopen(value); oc_loginit(); oc_setlogging(1); oc_logopen(value); } /* fetch and build the (almost) unconstrained DDS for use as template */ ncstat = fetchtemplatemetadata3(dapcomm); if(ncstat != NC_NOERR) goto done; /* fetch and build the constrained DDS */ ncstat = fetchconstrainedmetadata3(dapcomm); if(ncstat != NC_NOERR) goto done; #ifdef DEBUG2 fprintf(stderr,"constrained dds: %s\n",dumptree(dapcomm->cdf.ddsroot)); #endif /* The following actions are (mostly) WRT to the constrained tree */ /* Accumulate useful nodes sets */ ncstat = computecdfnodesets3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Fix grids */ ncstat = fixgrids3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Locate and mark usable sequences */ ncstat = sequencecheck3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* suppress variables not in usable sequences */ ncstat = suppressunusablevars3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* apply client parameters */ ncstat = applyclientparams34(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Add (as needed) string dimensions*/ ncstat = addstringdims(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} if(nclistlength(dapcomm->cdf.seqnodes) > 0) { /* Build the sequence related dimensions */ ncstat = defseqdims(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} } /* Define the dimsetplus and dimsetall lists */ ncstat = definedimsets3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Re-compute the dimension names*/ ncstat = computecdfdimnames34(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Deal with zero size dimensions */ ncstat = fixzerodims3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} /* Attempt to use the DODS_EXTRA info to turn one of the dimensions into unlimited. Assume computecdfdimnames34 has already been called. */ ncstat = defrecorddim3(dapcomm); if(ncstat) {THROWCHK(ncstat); goto done;} if(dapcomm->cdf.recorddimname != NULL && nclistlength(dapcomm->cdf.seqnodes) > 0) { /*nclog(NCLOGWARN,"unlimited dimension specified, but sequences exist in DDS");*/ PANIC("unlimited dimension specified, but sequences exist in DDS"); } /* Re-compute the var names*/ ncstat = computecdfvarnames3(dapcomm,dapcomm->cdf.ddsroot,dapcomm->cdf.varnodes); if(ncstat) {THROWCHK(ncstat); goto done;} /* Transfer data from the unconstrained DDS data to the unconstrained DDS */ ncstat = dimimprint3(dapcomm); if(ncstat) goto done; /* Process the constraints to map to the constrained CDF tree */ /* (must follow fixgrids3 */ ncstat = mapconstraints3(dapcomm->oc.dapconstraint,dapcomm->cdf.ddsroot); if(ncstat != NC_NOERR) goto done; /* Canonicalize the constraint */ ncstat = fixprojections(dapcomm->oc.dapconstraint->projections); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* Fill in segment information */ ncstat = qualifyconstraints3(dapcomm->oc.dapconstraint); if(ncstat != NC_NOERR) goto done; /* using the modified constraint, rebuild the constraint string */ if(FLAGSET(dapcomm->controls,NCF_UNCONSTRAINABLE)) { /* ignore all constraints */ dapcomm->oc.urltext = nc_uribuild(dapcomm->oc.url,NULL,NULL,0); } else { char* constraintstring = buildconstraintstring3(dapcomm->oc.dapconstraint); nc_urisetconstraints(dapcomm->oc.url,constraintstring); nullfree(constraintstring); dapcomm->oc.urltext = nc_uribuild(dapcomm->oc.url,NULL,NULL,NC_URICONSTRAINTS); } #ifdef DEBUG fprintf(stderr,"ncdap3: final constraint: %s\n",dapcomm->oc.url->constraint); #endif /* Estimate the variable sizes */ estimatevarsizes3(dapcomm); /* Build the meta data */ ncstat = buildncstructures3(dapcomm); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* Do any necessary data prefetch */ if(FLAGSET(dapcomm->controls,NCF_PREFETCH)) { ncstat = prefetchdata3(dapcomm); if(ncstat != NC_NOERR) { del_from_NCList((NC*)drno); /* undefine here */ {THROWCHK(ncstat); goto done;} } } { /* Mark as no longer writable and no longer indef; requires breaking abstraction */ NC* nc; ncstat = NC_check_id(drno->substrate, &nc); /* Mark as no longer writeable */ fClr(nc->nciop->ioflags, NC_WRITE); /* Mark as no longer indef; (do NOT use nc_enddef until diskless is working)*/ fSet(nc->flags, NC_INDEF); } if(ncpp) *ncpp = (NC*)drno; return ncstat; done: if(drno != NULL) NCD3_abort(drno->ext_ncid); if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); return THROW(ncstat); }
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, ndim; float dat[20]; #ifdef DEBUG oc_loginit(); oc_setlogging(1); oc_logopen(NULL); #endif 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; } ndim=3; 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__); #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")); return fail; ncfail: printf("*** nc function failure: %d %s\n",err,nc_strerror(err)); return 1; }