1/*
2Report from Ansely Manke:
3I've attached a file with a short c program that
4demonstrates what I'm seeing. I don't know that we'd call
5this a constraint, so that was a misleading description.
6
7The thing I'm mimicking is a sequence where I read the 2-D
8coordinate variables, make some decisions about the size of
9a subset region, and then define index ranges and strides
10for reading other variables.  Reading the full variable
11happens correctly, but the read with strides winds up
12messing up the data.  Here it shows up returning some valid
13data and some zero's, but in other sequences of events it
14seems to be actually mis-ordered.
15
16I notice that the results are correct if the initial read of
17the variable uses counts that are size-1. So that might be a
18clue.  And the read is correct if I either close and reopen
19the dataset after reading the original full variable, or if
20I don't do that step of first reading the whole grid. It's
21also fine with NetCDF 4.2.1.1.
22
23-Ansley
24
25Problem was two-fold:
261. struct Getvara has the dsttype field as OC_Type rather than nc_type
272. the dap odometer code dapnew_segment was incorrectly
28   handling strides > 1: specifically, the stop position was incorrect.
29
30*/
31
32/* vars_whoi_test */
33/* acm 4/2013 */
34/* ansley.b.manke@noaa.gov */
35
36/* test nc_get_vars_float with calls similar to Ferret calls */
37
38
39/*linked with:
40
41cc vars_whoi_test.c -g -o vars_whoi_test_4211 /usr/local/netcdf_4211/lib/libnetcdf.a /usr/local/hdf5_189/lib/libhdf5_hl.a /usr/local/hdf5_189/lib/libhdf5.a /usr/local/lib/libz.a -L/usr/lib64 -lc -lm -lcurl
42cc vars_whoi_test.c -g -o vars_whoi_test /home/users/ansley/local/x86_nc43/lib/libnetcdf.a /usr/local/hdf5_189/lib/libhdf5_hl.a /usr/local/hdf5_189/lib/libhdf5.a /usr/local/lib/libz.a -L/usr/lib64 -lc -lm -lcurl
43
44Closing and reopening the dataset between the two reads fixes the
45incorrect data return
46
47Setting the count to one less in the full data read also fixes the
48incorrect data return
49*/
50
51#include<stdlib.h>
52#include<stdio.h>
53#include<string.h>
54#include "netcdf.h"
55#include "ncdispatch.h"
56
57#define VERBOSE 1
58
59/*
602014-07-01: (DMH) Changed the URL to use one from remotetest server.
61to remove dependence on an external server.
62*/
63
64/*
65static char* URL="http://geoport.whoi.edu/thredds/dodsC/coawst_4/use/fmrc/coawst_4_use_best.ncd";
66Float64 lon_rho[eta_rho = 336][xi_rho = 896];
67Float64 lat_rho[eta_rho = 336][xi_rho = 896];
68*/
69
70#define URL "%s/dodsC/testdods/rtofs.nc"
71#define VAR1 "Latitude"
72#define VAR2 "Longitude"
73#define XSIZE 850
74#define YSIZE 712
75
76static char url[1024];
77
78int
79main()
80{
81
82    int ncid;
83    int varid;
84    int i;
85    int ncstatus;
86    size_t start[5], count[5];
87    ptrdiff_t stride[5];
88    int pass = 1;
89    int nelems = XSIZE*YSIZE;
90    int idimndim;
91    float *dat = (float*)malloc(sizeof(float)*nelems);
92    float sdat[10];
93    char* svc;
94
95    /* Find Test Server */
96    svc = getenv("THREDDSTESTSERVER");
97    if(svc != NULL) {
98        const char* testserver[2];
99 testserver[0] = svc;
100 testserver[1] = NULL;
101        svc = NC_findtestserver("thredds",testserver);
102    } else 
103        svc = NC_findtestserver("thredds",NULL);
104
105    if(svc == NULL) {
106        fprintf(stderr,"Cannot locate test server\n");
107 exit(0);
108    }
109
110    strcpy(url,URL);
111    snprintf(url,sizeof(url),URL,svc);
112
113    for (idim=0; idim<5; idim++) {
114        start[idim] = 0;
115        count[idim] = 1;
116        stride[idim] = 1;
117    }
118
119    ndim=2;
120
121    printf(" \n");
122    printf("********************\n");
123    printf("open URL %s\n",url);
124    printf(" \n");
125
126    ncstatus = nc_open(urlNC_NOWRITE, &ncid);
127
128    if(ncstatus != NC_NOERR) {
129 fprintf(stderr,"Could not open: %s; server may be down; test ignored\n",url);
130 exit(0);
131    }
132
133    ncstatus = nc_inq_varid(ncidVAR1, &varid);
134
135    ndim=2;
136
137
138#ifdef VERBOSE
139    printf(" \n");
140    printf("********************\n");
141    printf("Read %s data w/o strides\n",VAR1);
142    printf(" \n");
143#endif
144
145    start[0] = 0;
146    start[1] = 0;
147    start[2] = 0;
148    start[3] = 0;
149
150    count[0] =  XSIZE;
151    count[1] =  YSIZE;
152
153    stride[0] = 1;
154    stride[1] = 1;
155
156#ifdef VERBOSE
157    for (idim=0; idim<ndimidim++)
158 printf("start[%1d]=%3lu count[%1d]=%3lu stride[%1d]=%3lu\n",
159 idim,start[idim],idim,count[idim],idim,stride[idim]);
160#endif
161
162    ncstatus = nc_get_vars_float (ncidvaridstartcountstride, (float*) dat);
163
164#ifdef VERBOSE
165    printf(" \n");
166    printf("********************\n");
167    printf("Print some of %s\n",VAR1);
168    printf(" \n");
169
170    for (i=0; i<10; i++)
171        printf("%s[%d] = %f\n",VAR1,i,dat[i]);
172    printf(" \n");
173
174
175    for (i=(nelems-11); i<(nelems-1); i++)
176        printf("%s[%d] = %f\n",VAR1,i,dat[i]);
177    printf(" \n");
178#endif
179
180    memset((void*)dat,0,sizeof(dat));
181
182    /* Read a second variable */
183
184    ncstatus = nc_inq_varid(ncidVAR2, &varid);
185
186    ndim=2;
187
188#ifdef VERBOSE
189    printf(" \n");
190    printf("********************\n");
191    printf("Read %s data w/o strides\n",VAR2);
192    printf(" \n");
193#endif
194
195    start[0] = 0;
196    start[1] = 0;
197    start[2] = 0;
198    start[3] = 0;
199
200    count[0] =  XSIZE;
201    count[1] =  YSIZE;
202
203    stride[0] = 1;
204    stride[1] = 1;
205
206#ifdef VERBOSE
207    for (idim=0; idim<ndimidim++)
208        printf("start[%d]=%3lu count[%d]=%3lu stride[%d]=%3lu\n",
209 idimstart[idim], idimcount[idim], idimstride[idim]);
210#endif
211
212    ncstatus = nc_get_vars_float (ncidvaridstartcountstride, (float*) dat);
213
214#ifdef VERBOSE
215    printf(" \n");
216    printf("********************\n");
217    printf("Print some of %s\n",VAR2);
218    printf(" \n");
219    for (i=0; i<10; i++)
220        printf("%s[%d] = %f\n",VAR2,i,dat[i]);
221    printf(" \n");
222
223    printf(" \n");
224    for (i=(nelems-11); i<(nelems-1); i++)
225        printf("%s[%d] = %f\n",VAR2,i,dat[i]);
226    printf(" \n");
227#endif
228
229    memset((void*)dat,0,sizeof(dat));
230
231    /* close and reopen the dataset, then the below read is correct */
232
233#ifdef VERBOSE
234    printf(" \n");
235    printf("********************\n");
236    printf("Close and reopen the dataset\n");
237#endif
238
239    ncstatus = nc_close (ncid);
240    ncstatus = nc_open(urlNC_NOWRITE, &ncid);
241
242    /*  ----------------------------------------------------- */
243    /* Read a subset of the data with strides */
244
245    ncstatus = nc_inq_varid(ncidVAR1, &varid);
246
247#ifdef VERBOSE
248    printf(" \n");
249    printf("********************\n");
250    printf("Read a subset of %s data with strides\n",VAR1);
251    printf(" \n");
252#endif
253
254    start[0] = 250;
255    start[1] = 704;
256
257    count[0] =  5;
258    count[1] =  2;
259
260    stride[0] = 2;
261    stride[1] = 4;
262
263#ifdef VERBOSE
264    for (idim=0; idim<ndimidim++)
265 printf("start[%1d]=%3lu count[%1d]=%3lu stride[%1d]=%3lu\n",
266 idim,start[idim],idim,count[idim],idim,stride[idim]);
267#endif
268
269    memset((void*)sdat,0,sizeof(sdat));
270    ncstatus = nc_get_vars_float (ncidvaridstartcountstride,  (float*) sdat);
271
272    printf("status = %d\n", ncstatus);
273
274    /* Verify that all read values are 50 <= n < 51 */
275    for (i=0; i<10; i++) {
276 if(sdat[i] <= 50.0 || sdat[i] > 51.0) {
277     printf("Out of range: %s[%d] = %f\n",VAR1i,sdat[i]);
278     pass = 0;
279 }
280    }
281
282#ifdef VERBOSE
283    printf(" \n");
284    printf("********************\n");
285    printf("Print  values read. They should all be 50.xxxx \n");
286    printf(" \n");
287
288    for (i=0; i<10; i++)
289        printf("%s[%d] = %f\n",VAR1,i,sdat[i]);
290#endif
291
292    ncstatus = nc_close (ncid);
293
294    if(!pass) {
295 printf("*** FAIL: %s value out of range.\n",VAR1);
296 exit(1);
297    }
298
299    printf("*** PASS\n");
300    free(dat);
301    exit(0);
302
303}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed