1/* This is part of the netCDF package. Copyright 2008 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use. See www.unidata.ucar.edu for more info.
4
5   Test netcdf-4 dimensions some more.
6
7   $Id: tst_dims2.c,v 1.17 2010/05/25 13:53:04 ed Exp $
8*/
9
10#include <config.h>
11#include <nc_tests.h>
12#include "err_macros.h"
13
14#define FILE_NAME "tst_dims2.nc"
15
16#define NDIMS1 1
17#define NDIMS2 2
18
19int
20main(int argc, char **argv)
21{
22   printf("\n*** Testing netcdf-4 dimensions some more.\n");
23   printf("*** Checking non-coordinate variable with same name as dimension...");
24   {
25#define CRAZY "crazy"
26#define NUTS "nuts"
27#define NUM_CRAZY 3
28#define NUM_NUTS 5
29      int nuts_dimidcrazy_dimiddimid_in;
30      int varidncid;
31      nc_type xtype_inxtype = NC_CHAR;
32      int ndims_innvars_innatts_inunlimdimid_in;
33      char name_in[NC_MAX_NAME + 1];
34
35      /* Create a file with 2 dims and one var. The var is named the
36       * same as one of the dimensions, but uses the other dimension,
37       * and thus is not a netCDF coordinate variable. */
38      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
39      if (nc_def_dim(ncidCRAZYNUM_CRAZY, &crazy_dimid)) ERR;
40      if (nc_def_dim(ncidNUTSNUM_NUTS, &nuts_dimid)) ERR;
41      if (nc_def_var(ncidCRAZYxtypeNDIMS1, &nuts_dimid, &varid)) ERR;
42
43      /* Check out the file. */
44      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
45      if (ndims_in != 2 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != -1) ERR;
46      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, &dimid_in, &natts_in)) ERR;
47      if (strcmp(name_inCRAZY) || xtype_in != xtype || ndims_in != NDIMS1 ||
48          natts_in != 0 || dimid_in != nuts_dimidERR;
49
50      if (nc_close(ncid)) ERR;
51
52      /* Reopen and check the file. */
53      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
54
55      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
56      if (ndims_in != 2 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != -1) ERR;
57      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, &dimid_in, &natts_in)) ERR;
58      if (strcmp(name_inCRAZY) || xtype_in != xtype || ndims_in != NDIMS1 ||
59          natts_in != 0 || dimid_in != nuts_dimidERR;
60
61      if (nc_close(ncid)) ERR;
62
63   }
64   SUMMARIZE_ERR;
65   printf("*** Checking 2D coordinate variable with user-provided code...");
66   {
67      /* This test is from user Dipl.-Ing. Christian Schlamkow,
68       * University of Rostock, Coastal Engineering Group. Thanks
69       * Christian! Next time I'm in Rostock I'll come by and buy you
70       * a beer. ;-) */
71#define TL 15
72      int ncid;
73      int time_dim;
74      int tl_dim;
75      int time_dimids[NDIMS2];
76      int time_id;
77      size_t time_index[NDIMS2];
78      size_t time_count[NDIMS2];
79      const char ttext[TL + 1]="20051224.150000";
80      char ttext_in[TL + 1];
81      int ndims_innvars_innatts_inunlimdimid_indimids_in[NDIMS2];
82      nc_type xtype_in;
83      char name_in[NC_MAX_NAME + 1];
84      int i;
85
86      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
87
88      /*create dimensions*/
89      if (nc_def_dim(ncid, "time", NC_UNLIMITED, &time_dim)) ERR;
90      if (nc_def_dim(ncid, "tl", TL, &tl_dim)) ERR;
91
92      /*create variables*/
93      time_dimids[0]=time_dim;
94      time_dimids[1]=tl_dim;
95      if (nc_def_var(ncid, "time", NC_CHARNDIMS2time_dimids, &time_id)) ERR;
96
97      /*close dataset*/
98      if (nc_close(ncid)) ERR;
99
100      /*reopen dataset*/
101      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
102
103      /*get dimensions and variable ids*/
104      if (nc_inq_varid(ncid, "time", &time_id)) ERR;
105
106      /*fill in data*/
107      time_index[0] = 0;
108      time_index[1] = 0;
109      time_count[0] = 1;
110      time_count[1] = TL; /* Note we are not writing NULL char. */
111      if (nc_put_vara_text(ncidtime_idtime_indextime_countttext)) ERR;
112
113      /*close dataset*/
114      if (nc_close(ncid)) ERR;
115
116      /* Reopen and check everything. */
117      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
118      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
119      if (ndims_in != NDIMS2 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
120      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
121      if (strcmp(name_in, "time") || xtype_in != NC_CHAR || ndims_in != NDIMS2 ||
122          natts_in != 0) ERR;
123      for (i = 0; i < NDIMS2i++)
124  if (time_dimids[i] != dimids_in[i]) ERR;
125      if (nc_get_vara_text(ncidtime_idtime_indextime_countttext_in)) ERR;
126      ttext_in[TL] = 0; /* Add a NULL so strcmp will work. */
127      if (strcmp(ttextttext_in)) ERR;
128      if (nc_close(ncid)) ERR;
129   }
130   SUMMARIZE_ERR;
131   printf("*** Checking 2D coordinate variable with user-provided code some more...");
132   {
133      /* This test is from user Dipl.-Ing. Christian Schlamkow,
134       * University of Rostock, Coastal Engineering Group. Thanks
135       * Christian! Next time I'm in Rostock I'll come by and buy you
136       * a beer. ;-) */
137#define TL 15
138#define NDIMS2 2
139#define NUM_TIMES 16
140      int ncid;
141      int time_dim;
142      int tl_dim;
143      int time_dimids[NDIMS2];
144      int time_id;
145      size_t time_index[NDIMS2];
146      size_t time_count[NDIMS2];
147      const char ttext[TL + 1]="20051224.150000";
148      char ttext_in[TL + 1];
149      int ndims_innvars_innatts_inunlimdimid_indimids_in[NDIMS2];
150      nc_type xtype_in;
151      char name_in[NC_MAX_NAME + 1];
152      int i;
153
154      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
155
156      /*create dimensions*/
157      if (nc_def_dim(ncid, "time", NC_UNLIMITED, &time_dim)) ERR;
158      if (nc_def_dim(ncid, "tl", TL, &tl_dim)) ERR;
159
160      /*create variables*/
161      time_dimids[0]=time_dim;
162      time_dimids[1]=tl_dim;
163      if (nc_def_var(ncid, "time", NC_CHARNDIMS2time_dimids, &time_id)) ERR;
164
165      /*close dataset*/
166      if (nc_close(ncid)) ERR;
167
168      /*reopen dataset*/
169      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
170
171      /*get dimensions and variable ids*/
172      if (nc_inq_varid(ncid, "time", &time_id)) ERR;
173
174      time_index[1] = 0;
175      time_count[0] = 1;
176      time_count[1] = TL;
177      for (time_index[0] = 0; time_index[0] < NUM_TIMEStime_index[0]++)
178  if(nc_put_vara_text(ncidtime_idtime_indextime_countttext)) ERR;
179
180      /*close dataset*/
181      if (nc_close(ncid)) ERR;
182
183      /* Reopen and check everything. */
184      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
185      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
186      if (ndims_in != NDIMS2 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
187      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
188      if (strcmp(name_in, "time") || xtype_in != NC_CHAR || ndims_in != NDIMS2 ||
189          natts_in != 0) ERR;
190      for (i = 0; i < NDIMS2i++)
191  if (time_dimids[i] != dimids_in[i]) ERR;
192      time_index[0] = 0;
193      if (nc_get_vara_text(ncidtime_idtime_indextime_countttext_in)) ERR;
194      ttext_in[TL] = 0; /* Add a NULL so strcmp will work. */
195      if (strcmp(ttextttext_in)) ERR;
196      if (nc_close(ncid)) ERR;
197
198      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
199      if (nc_close(ncid)) ERR;
200   }
201   SUMMARIZE_ERR;
202   printf("*** Checking 2D coordinate variable...");
203   {
204#define TIME "time"
205#define LEN "len"
206#define NDIMS 2
207      int dimids[NDIMS], dimids_in[NDIMS];
208      int varidncid;
209      nc_type xtype_inxtype = NC_CHAR;
210      int ndims_innvars_innatts_inunlimdimid_in;
211      char name_in[NC_MAX_NAME + 1];
212      int i;
213
214      /* Create a file with a 2D time coordinate var, with one of the
215       * dimensions being the length of the time string. */
216      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
217      if (nc_def_dim(ncid, TIME, NC_UNLIMITED, &dimids[0])) ERR;
218      if (nc_def_dim(ncidLEN, 20, &dimids[1])) ERR;
219      if (nc_def_var(ncid, TIME, xtype, 2, dimids, &varid)) ERR;
220
221      /* Check out the file. */
222      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
223      if (ndims_in != 2 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
224      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
225      if (strcmp(name_in, TIME) || xtype_in != xtype || ndims_in != NDIMS ||
226          natts_in != 0) ERR;
227      for (i = 0; i < NDIMSi++)
228  if (dimids[i] != dimids_in[i]) ERR;
229
230      if (nc_close(ncid)) ERR;
231
232      /* Recheck the file. */
233      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
234      if (ndims_in != 2 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
235      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
236      if (strcmp(name_in, TIME) || xtype_in != xtype || ndims_in != NDIMS ||
237          natts_in != 0) ERR;
238      for (i = 0; i < NDIMSi++)
239  if (dimids[i] != dimids_in[i]) ERR;
240      if (nc_close(ncid)) ERR;
241   }
242   SUMMARIZE_ERR;
243   printf("*** Checking multiple unlimited dimensions...");
244   {
245#define NDIMS 2
246#define MAX_VALUES 3
247
248      int dimids[NDIMS], varidncid;
249      double value[MAX_VALUES];
250      size_t time_lenbeam_lenstart[NDIMS] = {0, 0}, count[NDIMS] = {1, MAX_VALUES};
251      int i;
252
253      /* Initialize some phony data. */
254      for (i = 0; i < MAX_VALUESi++)
255  value[i] = MAX_VALUES - i;
256
257      /* Create a file with 2 unlimited dims, and one var that uses
258       * both of them. */
259      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
260      if (nc_def_dim(ncid, "time", NC_UNLIMITED, &dimids[0])) ERR;
261      if (nc_def_dim(ncid, "beam", NC_UNLIMITED, &dimids[1])) ERR;
262      if (nc_def_var(ncid, "depth", NC_DOUBLENDIMSdimids, &varid)) ERR;
263
264      /* Check the lengths of these dimensions. */
265      if (nc_inq_dimlen(nciddimids[0], &time_len)) ERR;
266      if (time_lenERR;
267      if (nc_inq_dimlen(nciddimids[1], &beam_len)) ERR;
268      if (beam_lenERR;
269
270      /* Write some data, check dim lengths. */
271      if (nc_put_vara_double(ncidvaridstartcountvalue)) ERR;
272      if (nc_inq_dimlen(nciddimids[0], &time_len)) ERR;
273      if (time_len != 1) ERR;
274      if (nc_inq_dimlen(nciddimids[1], &beam_len)) ERR;
275      if (beam_len != MAX_VALUESERR;
276
277      /* Add some more data, check dim lengths again. */
278      start[0] = 1;
279      if (nc_put_vara_double(ncidvaridstartcountvalue)) ERR;
280      if (nc_inq_dimlen(nciddimids[0], &time_len)) ERR;
281      if (time_len != 2) ERR;
282      if (nc_inq_dimlen(nciddimids[1], &beam_len)) ERR;
283      if (beam_len != MAX_VALUESERR;
284
285      if (nc_close(ncid)) ERR;
286   }
287   SUMMARIZE_ERR;
288   printf("*** Checking multiple unlimited dimensions with more complex 2D test...");
289   {
290#define MAX(x,y) ((x)>(y)?(x):(y))
291      int dimids[2];
292      int varidncidtimeDimIDbeamDimID;
293      int ij;
294      int value[2000];
295      size_t time_recsbeam_recs; /* count of records in each dimension */
296      size_t time_lenbeam_len; /* actual dimension lengths in each dimension */
297      size_t start[] = {0, 0};
298      size_t count[] = {1, 1};
299
300      for (i = 0; i < 2000; i++)
301  value[i] = 2000 - i;
302
303      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
304
305      /* Define 2 unlimited dimensions */
306      if (nc_def_dim(ncid, "time", NC_UNLIMITED, &timeDimID)) ERR;
307      if (nc_def_dim(ncid, "beam", NC_UNLIMITED, &beamDimID)) ERR;
308
309      dimids[0] = timeDimID;
310      dimids[1] = beamDimID;
311
312      if (nc_def_var(ncid, "depth", NC_DOUBLE, 2, dimids, &varid)) ERR;
313
314      if (nc_enddef(ncid)) ERR;
315
316      time_recs = 0;
317      beam_recs = 0;
318      for (j = 0; j < 100; j++)
319      {
320  if (j > 500)
321     count[1] = j;
322  else
323     count[1] = 1000-j;
324
325  if (nc_put_vara_int(ncidvaridstartcountvalue)) ERR;
326  time_recs = MAX(time_recsstart[0] + count[0]);
327  beam_recs = MAX(beam_recsstart[1] + count[1]);
328  if (nc_inq_dimlen(ncidtimeDimID, &time_len)) ERR;
329  if (time_len != time_recsERR;
330  if (nc_inq_dimlen(ncidbeamDimID, &beam_len)) ERR;
331  if (beam_len != beam_recsERR;
332  start[0]++;
333      }
334
335      if (nc_close(ncid)) ERR;
336
337      /* Check the file. */
338      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
339      if (nc_close(ncid)) ERR;
340
341   }
342   SUMMARIZE_ERR;
343   printf("*** Checking 2D coordinate variable some more...");
344   {
345#define TIME "time"
346#define LEN "len"
347#define NDIMS 2
348#define NUM_RECS 15
349#define TL 15
350      int dimids[NDIMS], dimids_in[NDIMS];
351      int varidncid;
352      nc_type xtype_inxtype = NC_CHAR;
353      int ndims_innvars_innatts_inunlimdimid_in;
354      char name_in[NC_MAX_NAME + 1];
355      size_t index[NDIMS], count[NDIMS], len_in;
356      const char ttext[TL + 1]="20051224.150000";
357      int i;
358
359      /* Create a file with a 2D time coordinate var, with one of the
360       * dimensions being the length of the time string. */
361      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
362      if (nc_def_dim(ncid, TIME, NC_UNLIMITED, &dimids[0])) ERR;
363      if (nc_def_dim(ncidLENTL, &dimids[1])) ERR;
364      if (nc_def_var(ncid, TIME, xtype, 2, dimids, &varid)) ERR;
365
366      /* Check out the file. */
367      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
368      if (ndims_in != 2 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
369      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
370      if (strcmp(name_in, TIME) || xtype_in != xtype || ndims_in != NDIMS ||
371          natts_in != 0) ERR;
372      for (i = 0; i < NDIMSi++)
373  if (dimids[i] != dimids_in[i]) ERR;
374
375      /* Write some time values. */
376      index[0] = 0;
377      index[1] = 0;
378      count[0] = 1;
379      count[1] = TL; /* Note we are not writing NULL char. */
380      if (nc_put_vara_text(ncidvaridindexcountttext)) ERR;
381
382      if (nc_close(ncid)) ERR;
383
384      /* Reopen and check the file. */
385      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
386      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
387      if (ndims_in != 2 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
388      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
389      if (strcmp(name_in, TIME) || xtype_in != xtype || ndims_in != NDIMS ||
390          natts_in != 0) ERR;
391      for (i = 0; i < NDIMSi++)
392  if (dimids[i] != dimids_in[i]) ERR;
393      if (nc_inq_dim(nciddimids[0], name_in, &len_in)) ERR;
394      if (strcmp(name_in, TIME) || len_in != 1) ERR;
395      if (nc_close(ncid)) ERR;
396
397      /* Reopen and write some more time values. */
398      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
399
400      /* Write some more time values. */
401      index[1] = 0;
402      count[0] = 1;
403      count[1] = TL; /* Note we are not writing NULL char. */
404      for (index[0] = 1; index[0] < NUM_RECSindex[0]++)
405  if (nc_put_vara_text(ncidvaridindexcountttext)) ERR;
406
407      /* Check things again. */
408      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
409      if (ndims_in != 2 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
410      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
411      if (strcmp(name_in, TIME) || xtype_in != xtype || ndims_in != NDIMS ||
412          natts_in != 0) ERR;
413      for (i = 0; i < NDIMSi++)
414  if (dimids[i] != dimids_in[i]) ERR;
415      if (nc_inq_dim(nciddimids[0], name_in, &len_in)) ERR;
416      if (strcmp(name_in, TIME) || len_in != NUM_RECSERR;
417      if (nc_close(ncid)) ERR;
418
419   }
420   SUMMARIZE_ERR;
421   FINAL_RESULTS;
422}


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