1/* This is part of the netCDF package. Copyright 2005 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.
6
7   $Id: tst_dims.c,v 1.30 2010/05/25 13:53:04 ed Exp $
8*/
9#include <config.h>
10#include <nc_tests.h>
11#include "err_macros.h"
12
13#define FILE_NAME "tst_dims.nc"
14#define LAT_NAME "lat"
15#define LON_NAME "lon"
16#define LEVEL_NAME "level"
17#define TIME_NAME "time"
18#define DIM5_NAME "twilight_zone"
19#define LAT_LEN 1
20#define LON_LEN 2
21#define LEVEL_LEN 3
22#define TIME_LEN 4
23#define DIM5_LEN 5
24#define LAT_DIMID 0
25#define LON_DIMID 1
26#define LEVEL_DIMID 2
27#define TIME_DIMID 3
28#define LAT_VARID 0
29#define LON_VARID 1
30#define PRES_VARID 2
31#define ELEV_VARID 3
32#define HP_VARID 4
33#define PRES_NAME "pressure"
34#define ELEV_NAME "Elevation"
35#define HP_NAME "Number_of_Harry_Potter_Books"
36#define BUBBA "Bubba"
37
38#define MAX_DIMS 5
39
40int
41main(int argc, char **argv)
42{
43   printf("\n*** Testing netcdf-4 dimensions.\n");
44   printf("*** Testing that netcdf-4 dimids inq works on netcdf-3 file...");
45   {
46      int nciddimid;
47      int ndims_indimids_in[MAX_DIMS];
48
49      /* Create a netcdf-3 file with one dim. */
50      if (nc_create(FILE_NAME, 0, &ncid)) ERR;
51      if (nc_def_dim(ncidLAT_NAMELAT_LEN, &dimid)) ERR;
52      if (nc_close(ncid)) ERR;
53
54      /* Open the file and make sure nc_inq_dimids yeilds correct
55       * result. */
56      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
57      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
58      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
59      if (nc_inq_unlimdims(ncid, &ndims_indimids_in)) ERR;
60      if (ndims_in != 0) ERR;
61      if (nc_close(ncid)) ERR;
62   }
63
64   SUMMARIZE_ERR;
65   printf("*** Testing that netcdf-4 dimids inq works on more complex netcdf-3 file...");
66   {
67      int nciddimid;
68      int lon_dimid;
69      int ndims_indimids_in[MAX_DIMS];
70
71      /* Create a netcdf-3 file with three dim. */
72      if (nc_create(FILE_NAME, 0, &ncid)) ERR;
73      if (nc_def_dim(ncidLEVEL_NAMENC_UNLIMITED, &dimid)) ERR;
74      if (nc_def_dim(ncidLAT_NAMELAT_LEN, &dimid)) ERR;
75      if (nc_def_dim(ncidLON_NAMELON_LEN, &lon_dimid)) ERR;
76      if (nc_close(ncid)) ERR;
77
78      /* Open the file and make sure nc_inq_dimids yeilds correct
79       * result. */
80      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
81      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
82      if (ndims_in != 3 || dimids_in[0] != 0 || dimids_in[1] != 1 ||
83  dimids_in[2] != 2) ERR;
84      if (nc_inq_unlimdims(ncid, &ndims_indimids_in)) ERR;
85      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
86      if (nc_close(ncid)) ERR;
87   }
88   SUMMARIZE_ERR;
89   printf("*** Testing file with just one dimension...");
90   {
91      int nciddimid;
92      int ndims_indimids_in[MAX_DIMS];
93      size_t len_in;
94      char name_in[NC_MAX_NAME + 1];
95      int dimid_in;
96
97      /* Create a file with one dim and nothing else. */
98      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
99      if (nc_def_dim(ncidLAT_NAMELAT_LEN, &dimid)) ERR;
100
101      /* Check out what we've got. */
102      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
103      if (len_in != LAT_LEN || strcmp(name_inLAT_NAME)) ERR;
104      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
105      if (ndims_in != 1) ERR;
106      if (nc_inq_dimid(ncidLAT_NAME, &dimid_in)) ERR;
107      if (dimid_in != 0) ERR;
108      if (nc_inq_dimname(ncid, 0, name_in)) ERR;
109      if (strcmp(name_inLAT_NAME)) ERR;
110      if (nc_inq_dimlen(ncid, 0, &len_in)) ERR;
111      if (len_in != LAT_LENERR;
112      if (nc_inq_unlimdims(ncid, &ndims_indimids_in)) ERR;
113      if (ndims_in != 0) ERR;
114      if (nc_close(ncid)) ERR;
115
116      /* Reopen and check it out again. */
117      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
118      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
119      if (len_in != LAT_LEN || strcmp(name_inLAT_NAME)) ERR;
120      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
121      if (ndims_in != 1) ERR;
122      if (nc_inq_dimid(ncidLAT_NAME, &dimid_in)) ERR;
123      if (dimid_in != 0) ERR;
124      if (nc_inq_dimname(ncid, 0, name_in)) ERR;
125      if (strcmp(name_inLAT_NAME)) ERR;
126      if (nc_inq_dimlen(ncid, 0, &len_in)) ERR;
127      if (len_in != LAT_LENERR;
128      if (nc_inq_unlimdims(ncid, &ndims_indimids_in)) ERR;
129      if (ndims_in != 0) ERR;
130      if (nc_close(ncid)) ERR;
131   }
132   SUMMARIZE_ERR;
133   printf("*** Testing renaming of one dimension...");
134   {
135      int nciddimiddimid_in;
136      char name_in[NC_MAX_NAME + 1];
137      size_t len_in;
138      int ndims_indimids_in[MAX_DIMS];
139
140      /* Reopen the file with one dim, and change the name of the dim. */
141      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
142      if (nc_rename_dim(ncid, 0, BUBBA)) ERR;
143
144      /* Check out what we've got. */
145      dimid = 0;
146      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
147      if (len_in != LAT_LEN || strcmp(name_inBUBBA)) ERR;
148      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
149      if (ndims_in != 1) ERR;
150      if (dimids_in[0] != 0) ERR;
151      if (nc_inq_dimid(ncidBUBBA, &dimid_in)) ERR;
152      if (dimid_in != 0) ERR;
153      if (nc_inq_dimname(ncid, 0, name_in)) ERR;
154      if (strcmp(name_inBUBBA)) ERR;
155      if (nc_inq_dimlen(ncid, 0, &len_in)) ERR;
156      if (len_in != LAT_LENERR;
157      if (nc_close(ncid)) ERR;
158
159      /* Reopen and check out what we've got again. */
160      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
161      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
162      if (len_in != LAT_LEN || strcmp(name_inBUBBA)) ERR;
163      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
164      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
165      if (nc_inq_dimid(ncidBUBBA, &dimid_in)) ERR;
166      if (dimid_in != 0) ERR;
167      if (nc_inq_dimname(ncid, 0, name_in)) ERR;
168      if (strcmp(name_inBUBBA)) ERR;
169      if (nc_inq_dimlen(ncid, 0, &len_in)) ERR;
170      if (len_in != LAT_LENERR;
171      if (nc_close(ncid)) ERR;
172   }
173
174   SUMMARIZE_ERR;
175   printf("*** Testing renaming dimensions and vars...");
176   {
177#define FILE_NAME1 "foo1.nc"
178#define FILE_NAME2 "foo2.nc"
179#define FILE_NAME3 "foo3.nc"
180#define FILE_NAME4 "foo4.nc"
181#define DIM_NAME "lat_T42"
182#define VAR_NAME DIM_NAME
183#define DIM_NAME2 "lat"
184#define VAR_NAME2 DIM_NAME2
185#define RANK_lat_T42 1
186      int  ncidvariddimid;
187      int lat_T42_dim;
188      size_t lat_T42_len = 3;
189      int lat_T42_id;
190      int lat_T42_dims[RANK_lat_T42];
191      char name[NC_MAX_NAME + 1];
192
193    /* =========== */
194    /* Sub-test #1 */
195    /* =========== */
196      /* create file with dimension and associated coordinate variable */
197      if (nc_create(FILE_NAME1NC_CLOBBER|NC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
198      if (nc_def_dim(ncidDIM_NAMElat_T42_len, &lat_T42_dim)) ERR;
199      lat_T42_dims[0] = lat_T42_dim;
200      if (nc_def_var(ncidVAR_NAMENC_INTRANK_lat_T42lat_T42_dims, &lat_T42_id)) ERR;
201      if (nc_close(ncid)) ERR;
202
203
204      /* reopen file, rename coordinate dimension and then associated variable */
205      if (nc_open(FILE_NAME1NC_WRITE, &ncid)) ERR;
206      if (nc_inq_dimid(ncidDIM_NAME, &dimid)) ERR;
207      if (nc_inq_varid(ncidVAR_NAME, &varid)) ERR;
208      if (nc_rename_dim(nciddimidDIM_NAME2)) ERR;
209      if (nc_rename_var(ncidvaridVAR_NAME2)) ERR;
210      if (nc_close(ncid)) ERR;
211
212
213      /* reopen file, check coordinate dimension and associated variable names */
214      /* Should be just like they created the file with DIM_NAME2 & VAR_NAME2 to
215       *  begin with.
216       */
217      if (nc_open(FILE_NAME1NC_WRITE, &ncid)) ERR;
218      if (nc_inq_dimid(ncidDIM_NAME2, &dimid)) ERR;
219      if (nc_inq_varid(ncidVAR_NAME2, &varid)) ERR;
220      if (nc_inq_dimname(nciddimidname)) ERR;
221      if (strcmp(nameDIM_NAME2)) ERR;
222      if (nc_inq_varname(ncidvaridname)) ERR;
223      if (strcmp(nameVAR_NAME2)) ERR;
224      if (nc_close(ncid)) ERR;
225
226
227    /* =========== */
228    /* Sub-test #2 */
229    /* =========== */
230      /* create file with dimension and associated coordinate variable */
231      if (nc_create(FILE_NAME1NC_CLOBBER|NC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
232      if (nc_def_dim(ncidDIM_NAMElat_T42_len, &lat_T42_dim)) ERR;
233      lat_T42_dims[0] = lat_T42_dim;
234      if (nc_def_var(ncidVAR_NAMENC_INTRANK_lat_T42lat_T42_dims, &lat_T42_id)) ERR;
235      if (nc_close(ncid)) ERR;
236
237
238      /* reopen file, just rename coordinate dimension */
239      if (nc_open(FILE_NAME1NC_WRITE, &ncid)) ERR;
240      if (nc_inq_dimid(ncidDIM_NAME, &dimid)) ERR;
241      if (nc_rename_dim(nciddimidDIM_NAME2)) ERR;
242      if (nc_close(ncid)) ERR;
243
244
245      /* reopen file, check coordinate dimension and associated variable names */
246      /* Should be just like the file was created with DIM_NAME2 to begin with */
247      if (nc_open(FILE_NAME1NC_WRITE, &ncid)) ERR;
248      if (nc_inq_dimid(ncidDIM_NAME2, &dimid)) ERR;
249      if (nc_inq_varid(ncidVAR_NAME, &varid)) ERR;
250      if (nc_inq_dimname(nciddimidname)) ERR;
251      if (strcmp(nameDIM_NAME2)) ERR;
252      if (nc_inq_varname(ncidvaridname)) ERR;
253      if (strcmp(nameVAR_NAME)) ERR;
254      if (nc_close(ncid)) ERR;
255
256
257    /* =========== */
258    /* Sub-test #3 */
259    /* =========== */
260      /* create file with dimension and associated coordinate variable */
261      if (nc_create(FILE_NAME1NC_CLOBBER|NC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
262      if (nc_def_dim(ncidDIM_NAMElat_T42_len, &lat_T42_dim)) ERR;
263      lat_T42_dims[0] = lat_T42_dim;
264      if (nc_def_var(ncidVAR_NAMENC_INTRANK_lat_T42lat_T42_dims, &lat_T42_id)) ERR;
265      if (nc_close(ncid)) ERR;
266
267
268      /* reopen file, just rename variable */
269      if (nc_open(FILE_NAME1NC_WRITE, &ncid)) ERR;
270      if (nc_inq_varid(ncidVAR_NAME, &varid)) ERR;
271      if (nc_rename_var(ncidvaridVAR_NAME2)) ERR;
272      if (nc_close(ncid)) ERR;
273
274
275      /* reopen file, check coordinate dimension and associated variable names */
276      /* Should be just like the file was created with VAR_NAME2 to begin with */
277      if (nc_open(FILE_NAME1NC_WRITE, &ncid)) ERR;
278      if (nc_inq_dimid(ncidDIM_NAME, &dimid)) ERR;
279      if (nc_inq_varid(ncidVAR_NAME2, &varid)) ERR;
280      if (nc_inq_dimname(nciddimidname)) ERR;
281      if (strcmp(nameDIM_NAME)) ERR;
282      if (nc_inq_varname(ncidvaridname)) ERR;
283      if (strcmp(nameVAR_NAME2)) ERR;
284      if (nc_close(ncid)) ERR;
285
286
287    /* =========== */
288    /* Sub-test #4 */
289    /* =========== */
290      /* create file with dimension and associated coordinate variable */
291      if (nc_create(FILE_NAME1NC_CLOBBER|NC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
292      if (nc_def_dim(ncidDIM_NAMElat_T42_len, &lat_T42_dim)) ERR;
293      lat_T42_dims[0] = lat_T42_dim;
294      if (nc_def_var(ncidVAR_NAMENC_INTRANK_lat_T42lat_T42_dims, &lat_T42_id)) ERR;
295      if (nc_close(ncid)) ERR;
296
297
298      /* reopen file, rename associated variable and then coordinate dimension */
299      if (nc_open(FILE_NAME1NC_WRITE, &ncid)) ERR;
300      if (nc_inq_dimid(ncidDIM_NAME, &dimid)) ERR;
301      if (nc_inq_varid(ncidVAR_NAME, &varid)) ERR;
302      if (nc_rename_var(ncidvaridVAR_NAME2)) ERR;
303      if (nc_rename_dim(nciddimidDIM_NAME2)) ERR;
304      if (nc_close(ncid)) ERR;
305
306
307      /* reopen file, check coordinate dimension and associated variable names */
308      /* Should be just like they created the file with DIM_NAME2 & VAR_NAME2 to
309       *  begin with.
310       */
311      if (nc_open(FILE_NAME1NC_WRITE, &ncid)) ERR;
312      if (nc_inq_dimid(ncidDIM_NAME2, &dimid)) ERR;
313      if (nc_inq_varid(ncidVAR_NAME2, &varid)) ERR;
314      if (nc_inq_dimname(nciddimidname)) ERR;
315      if (strcmp(nameDIM_NAME2)) ERR;
316      if (nc_inq_varname(ncidvaridname)) ERR;
317      if (strcmp(nameVAR_NAME2)) ERR;
318      if (nc_close(ncid)) ERR;
319   }
320
321   SUMMARIZE_ERR;
322   printf("*** Testing file with just one unlimited dimension...");
323   {
324      int nciddimid;
325      int ndims_indimids_in[MAX_DIMS];
326      size_t len_in;
327      char name_in[NC_MAX_NAME + 1];
328      int unlimdimid_in;
329      int nunlimdims_in;
330
331      /* Create a file with one unlimied dim and nothing else. */
332      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
333      if (nc_def_dim(ncidLEVEL_NAMENC_UNLIMITED, &dimid)) ERR;
334
335      /* Check it out before the enddef. */
336      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
337      if (len_in != NC_UNLIMITED || strcmp(name_inLEVEL_NAME)) ERR;
338      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
339      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
340      if (nc_inq_unlimdim(ncid, &unlimdimid_in)) ERR;
341      if (unlimdimid_in != 0) ERR;
342      if (nc_inq_unlimdims(ncid, &nunlimdims_in, &unlimdimid_in)) ERR;
343      if (nunlimdims_in != 1 || unlimdimid_in != 0) ERR;
344
345      /* Automatically enddef and close. */
346      if (nc_close(ncid)) ERR;
347
348      /* Reopen and check it out. */
349      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
350      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
351      if (len_in != NC_UNLIMITED || strcmp(name_inLEVEL_NAME)) ERR;
352      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
353      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
354      if (nc_inq_unlimdim(ncid, &unlimdimid_in)) ERR;
355      if (unlimdimid_in != 0) ERR;
356      if (nc_inq_unlimdims(ncid, &nunlimdims_in, &unlimdimid_in)) ERR;
357      if (nunlimdims_in != 1 || unlimdimid_in != 0) ERR;
358      if (unlimdimid_in != 0) ERR;
359      if (nc_close(ncid)) ERR;
360   }
361
362   SUMMARIZE_ERR;
363#define ROMULUS "Romulus"
364#define REMUS "Remus"
365#define DIMS2 2
366   printf("*** Testing file with two unlimited dimensions...");
367   {
368      int nciddimid[DIMS2];
369      int ndims_indimids_in[DIMS2];
370      size_t len_in;
371      char name_in[NC_MAX_NAME + 1];
372      int unlimdimid_in[DIMS2];
373      int nunlimdims_in;
374
375      /* Create a file with two unlimited dims and nothing else. */
376      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
377      if (nc_def_dim(ncidREMUSNC_UNLIMITED, &dimid[0])) ERR;
378      if (nc_def_dim(ncidROMULUSNC_UNLIMITED, &dimid[1])) ERR;
379
380      /* Check it out before the enddef. */
381      if (nc_inq_dim(nciddimid[0], name_in, &len_in)) ERR;
382      if (len_in != NC_UNLIMITED || strcmp(name_inREMUS)) ERR;
383      if (nc_inq_dim(nciddimid[1], name_in, &len_in)) ERR;
384      if (len_in != NC_UNLIMITED || strcmp(name_inROMULUS)) ERR;
385      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
386      if (ndims_in != 2 || dimids_in[0] != 0 || dimids_in[1] != 1) ERR;
387      if (nc_inq_unlimdim(ncid, &unlimdimid_in[0])) ERR;
388      if (unlimdimid_in[0] != 0) ERR;
389      if (nc_inq_unlimdims(ncid, &nunlimdims_inunlimdimid_in)) ERR;
390      if (nunlimdims_in != 2 || unlimdimid_in[0] != 0 || unlimdimid_in[1] != 1) ERR;
391
392      /* Automatically enddef and close. */
393      if (nc_close(ncid)) ERR;
394
395      /* Reopen and check it out. */
396      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
397      if (nc_close(ncid)) ERR;
398   }
399
400   SUMMARIZE_ERR;
401   printf("*** Testing ordering of dimensions...");
402   {
403#define A_NAME "a"
404#define B_NAME "b"
405#define A_LEN 50
406#define B_LEN 92
407#define A_DIMID 1
408#define B_DIMID 0
409
410      int ncid;
411      int ndims_indimids_in[MAX_DIMS];
412      size_t len_in;
413      char name_in[NC_MAX_NAME + 1];
414      int dimid_adimid_b;
415
416      /* Create a file with two dims and nothing else. */
417      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
418      if (nc_def_dim(ncidB_NAMEB_LEN, &dimid_b)) ERR;
419      if (nc_def_dim(ncidA_NAMEA_LEN, &dimid_a)) ERR;
420      if (dimid_b != B_DIMID || dimid_a != A_DIMIDERR;
421
422      /* Check out what we've got. */
423      if (nc_inq_dim(nciddimid_aname_in, &len_in)) ERR;
424      if (len_in != A_LEN || strcmp(name_inA_NAME)) ERR;
425      if (nc_inq_dim(nciddimid_bname_in, &len_in)) ERR;
426      if (len_in != B_LEN || strcmp(name_inB_NAME)) ERR;
427      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
428      if (ndims_in != 2 || dimids_in[0] != 0 || dimids_in[1] != 1) ERR;
429
430      if (nc_close(ncid)) ERR;
431
432      /* Reopen and check it out again. */
433      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
434
435      if (nc_inq_dim(ncidB_DIMIDname_in, &len_in)) ERR;
436      if (len_in != B_LEN || strcmp(name_inB_NAME)) ERR;
437      if (nc_inq_dim(ncidA_DIMIDname_in, &len_in)) ERR;
438      if (len_in != A_LEN || strcmp(name_inA_NAME)) ERR;
439      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
440      if (ndims_in != 2 || dimids_in[0] != 0 ||
441   dimids_in[1] != 1) ERR;
442      if (nc_close(ncid)) ERR;
443   }
444
445   SUMMARIZE_ERR;
446   printf("*** Testing file with just one unlimited dimension and one var...");
447   {
448      int nciddimiddimids[MAX_DIMS];
449      int level_varid;
450      int natts_inndims_indimids_in[MAX_DIMS];
451      nc_type xtype_in;
452      size_t len_in;
453      char name_in[NC_MAX_NAME + 1];
454      int unlimdimid_in;
455      size_t start[MAX_DIMS], count[MAX_DIMS];
456      int varid_innvars_innunlimdims_in;
457      unsigned long long uint64_data[1] = {42};
458
459      /* Create a file with one unlimied dim and nothing else. */
460      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
461      if (nc_def_dim(ncidLEVEL_NAMENC_UNLIMITED, &dimid)) ERR;
462      if (dimid != 0) ERR;
463      dimids[0] = dimid;
464      if (nc_def_var(ncidLEVEL_NAMENC_UINT64, 1, dimids, &level_varid)) ERR;
465      if (level_varid != 0) ERR;
466
467      /* Check it out before enddef. */
468      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
469      if (len_in != 0 || strcmp(name_inLEVEL_NAME)) ERR;
470      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
471      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
472      if (nc_inq_unlimdim(ncid, &unlimdimid_in)) ERR;
473      if (unlimdimid_in != 0) ERR;
474      if (nc_inq_unlimdims(ncid, &nunlimdims_in, &unlimdimid_in)) ERR;
475      if (nunlimdims_in != 1 || unlimdimid_in != 0) ERR;
476      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
477      if (ndims_in != 1 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
478      if (nc_inq_varid(ncidLEVEL_NAME, &varid_in)) ERR;
479      if (varid_in != 0) ERR;
480      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
481      if (strcmp(name_inLEVEL_NAME) || xtype_in != NC_UINT64 || ndims_in != 1 ||
482   dimids_in[0] != 0 || natts_in != 0) ERR;
483      if (nc_inq_varname(ncid, 0, name_in)) ERR;
484      if (strcmp(name_inLEVEL_NAME)) ERR;
485
486      /* Now write one record of data to the var. */
487      start[0] = 0;
488      count[0] = 1;
489      if (nc_put_vara_ulonglong(ncid, 0, startcountuint64_data)) ERR;
490
491      /* Check dimension informaiton again. Now the length of this
492       * dimension should be one. */
493      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
494      if (len_in != 1 || strcmp(name_inLEVEL_NAME)) ERR;
495      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
496      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
497      if (nc_inq_dimlen(ncid, 0, &len_in)) ERR;
498      if (len_in != 1) ERR;
499      if (nc_inq_unlimdim(ncid, &unlimdimid_in)) ERR;
500      if (unlimdimid_in != 0) ERR;
501      if (nc_inq_unlimdims(ncid, &nunlimdims_in, &unlimdimid_in)) ERR;
502      if (nunlimdims_in != 1 || unlimdimid_in != 0) ERR;
503      if (unlimdimid_in != 0) ERR;
504      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
505      if (ndims_in != 1 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
506      if (nc_inq_varid(ncidLEVEL_NAME, &varid_in)) ERR;
507      if (varid_in != 0) ERR;
508      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
509      if (strcmp(name_inLEVEL_NAME) || xtype_in != NC_UINT64 || ndims_in != 1 ||
510   dimids_in[0] != 0 || natts_in != 0) ERR;
511      if (nc_inq_varname(ncid, 0, name_in)) ERR;
512      if (strcmp(name_inLEVEL_NAME)) ERR;
513
514      /* Close the file. */
515      if (nc_close(ncid)) ERR;
516
517      /* Check it out. */
518      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
519      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
520      if (len_in != 1 || strcmp(name_inLEVEL_NAME)) ERR;
521      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
522      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
523      if (nc_inq_unlimdim(ncid, &unlimdimid_in)) ERR;
524      if (unlimdimid_in != 0) ERR;
525      if (nc_inq_unlimdims(ncid, &nunlimdims_in, &unlimdimid_in)) ERR;
526      if (nunlimdims_in != 1 || unlimdimid_in != 0) ERR;
527      if (unlimdimid_in != 0) ERR;
528      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
529      if (ndims_in != 1 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
530      if (nc_inq_varid(ncidLEVEL_NAME, &varid_in)) ERR;
531      if (varid_in != 0) ERR;
532      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
533      if (strcmp(name_inLEVEL_NAME) || xtype_in != NC_UINT64 || ndims_in != 1 ||
534   dimids_in[0] != 0 || natts_in != 0) ERR;
535      if (nc_inq_varname(ncid, 0, name_in)) ERR;
536      if (strcmp(name_inLEVEL_NAME)) ERR;
537      if (nc_close(ncid)) ERR;
538   }
539
540   SUMMARIZE_ERR;
541   printf("*** Testing adding a coordinate var to file with dimension...");
542   {
543      int nciddimiddimids[MAX_DIMS];
544      int natts_inndims_indimids_in[MAX_DIMS];
545      nc_type xtype_in;
546      size_t len_in;
547      char name_in[NC_MAX_NAME + 1];
548      int unlimdimid_in;
549      int nvars_indim5_varid;
550
551      /* Create a file with one dim and nothing else. */
552      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
553      if (nc_def_dim(ncidDIM5_NAMEDIM5_LEN, &dimid)) ERR;
554
555      /* Check out what we've got. */
556      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
557      if (ndims_in != 1 || nvars_in != 0 || natts_in != 0 ||
558  unlimdimid_in != -1) ERR;
559      if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
560      if (len_in != DIM5_LEN || strcmp(name_inDIM5_NAME)) ERR;
561      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
562      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
563
564      if (nc_close(ncid)) ERR;
565
566      /* Reopen and check it out again. */
567      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
568      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
569      if (ndims_in != 1 || nvars_in != 0 || natts_in != 0 ||
570  unlimdimid_in != -1) ERR;
571      if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
572      if (len_in != DIM5_LEN || strcmp(name_inDIM5_NAME)) ERR;
573      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
574      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
575
576      /* Add a coordinate var for this dimension. */
577      dimids[0] = 0;
578      if (nc_def_var(ncidDIM5_NAMENC_FLOAT, 1, dimids, &dim5_varid)) ERR;
579
580      /* Check it out. */
581      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
582      if (ndims_in != 1 || nvars_in != 1 || natts_in != 0 ||
583  unlimdimid_in != -1) ERR;
584      if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
585      if (len_in != DIM5_LEN || strcmp(name_inDIM5_NAME)) ERR;
586      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
587      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
588      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
589      if (strcmp(name_inDIM5_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
590   dimids_in[0] != 0 || natts_in != 0) ERR;
591
592      if (nc_close(ncid)) ERR;
593
594      /* Reopen and check it out again. */
595      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
596      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
597      if (ndims_in != 1 || nvars_in != 1 || natts_in != 0 ||
598  unlimdimid_in != -1) ERR;
599      if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
600      if (len_in != DIM5_LEN || strcmp(name_inDIM5_NAME)) ERR;
601      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
602      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
603      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
604      if (strcmp(name_inDIM5_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
605   dimids_in[0] != 0 || natts_in != 0) ERR;
606
607      if (nc_close(ncid)) ERR;
608   }
609
610   SUMMARIZE_ERR;
611   printf("*** Testing adding a coordinate var to file with unlimited dimension...");
612   {
613      int nciddimiddimids[MAX_DIMS];
614      int natts_inndims_indimids_in[MAX_DIMS];
615      nc_type xtype_in;
616      size_t len_in;
617      char name_in[NC_MAX_NAME + 1];
618      int unlimdimid_in;
619      size_t start[MAX_DIMS], count[MAX_DIMS], index[MAX_DIMS];
620      unsigned short data[2] = {42, 24}, data_in[2];
621      int nvars_inhp_variddim5_varid;
622
623      /* Create a file with one dim and one var. This time make
624       * it an unlimited dim. */
625      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
626      if (nc_def_dim(ncidDIM5_NAMENC_UNLIMITED, &dimid)) ERR;
627      if (dimid != 0) ERR;
628      dimids[0] = dimid;
629      if (nc_def_var(ncidHP_NAMENC_USHORT, 1, dimids, &hp_varid)) ERR;
630      if (hp_varid != 0) ERR;
631
632      /* Check out what we've got. */
633      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
634      if (ndims_in != 1 || nvars_in != 1 || natts_in != 0 ||
635  unlimdimid_in != 0) ERR;
636      if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
637      if (len_in != 0 || strcmp(name_inDIM5_NAME)) ERR;
638      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
639      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
640      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
641      if (strcmp(name_inHP_NAME) || xtype_in != NC_USHORT || ndims_in != 1 ||
642   dimids_in[0] != 0 || natts_in != 0) ERR;
643
644      /* Add a record to the HP variable. */
645      start[0] = 0;
646      count[0] = 1;
647      if (nc_put_vara(ncidhp_varidstartcountdata)) ERR;
648
649      /* Check to ensure dimension grew. */
650      if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
651      if (len_in != 1 || strcmp(name_inDIM5_NAME)) ERR;
652
653      /* Reread the value just written. */
654      index[0] = 0;
655      if (nc_get_var1_ushort(ncidhp_varidindexdata_in)) ERR;
656      if (data_in[0] != data[0]) ERR;
657
658      if (nc_close(ncid)) ERR;
659
660      /* Reopen and check it out again. */
661      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
662      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
663      if (ndims_in != 1 || nvars_in != 1 || natts_in != 0 ||
664  unlimdimid_in != 0) ERR;
665      if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
666      if (len_in != 1 || strcmp(name_inDIM5_NAME)) ERR;
667      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
668      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
669
670      /* Add a coordinate var for this dimension. */
671      dimids[0] = 0;
672      if (nc_def_var(ncidDIM5_NAMENC_FLOAT, 1, dimids, &dim5_varid)) ERR;
673
674      /* Check it out. */
675      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
676      if (ndims_in != 1 || nvars_in != 2 || natts_in != 0 ||
677  unlimdimid_in != 0) ERR;
678      if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
679      if (len_in != 1 || strcmp(name_inDIM5_NAME)) ERR;
680      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
681      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
682      if (nc_inq_var(nciddim5_varidname_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
683      if (strcmp(name_inDIM5_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
684   dimids_in[0] != 0 || natts_in != 0) ERR;
685
686      if (nc_close(ncid)) ERR;
687
688      /* Reopen and check it out again. */
689      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
690      if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
691      if (ndims_in != 1 || nvars_in != 2 || natts_in != 0 ||
692  unlimdimid_in != 0) ERR;
693      if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
694      if (len_in != 1 || strcmp(name_inDIM5_NAME)) ERR;
695      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
696      if (ndims_in != 1 || dimids_in[0] != 0) ERR;
697      if (nc_inq_var(nciddim5_varidname_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR;
698      if (strcmp(name_inDIM5_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
699   dimids_in[0] != 0 || natts_in != 0) ERR;
700
701      if (nc_close(ncid)) ERR;
702   }
703
704   SUMMARIZE_ERR;
705   printf("*** Creating file with 1 data var, 2 dims, and 2 coord. vars...");
706
707   {
708      int nciddimids[MAX_DIMS];
709      int lat_dimidlon_dimidlat_varidlon_varid;
710      int pres_varid;
711      char name_in[NC_MAX_NAME + 1];
712      int natts_inndims_indimids_in[MAX_DIMS];
713      nc_type xtype_in;
714      size_t len_in;
715      float lat[LAT_LEN], lon[LON_LEN];
716      float lat_in[LAT_LEN], lon_in[LON_LEN];
717      double pres[LAT_LEN][LON_LEN], pres_in[LAT_LEN][LON_LEN];
718      int ij;
719
720      /* Lats and lons suitable for some South American data. */
721      for (lat[0] = 40.0, i = 1; i < LAT_LENi++)
722  lat[i] = lat[i - 1] + .5;
723      for (lon[0] = 20.0, i = 1; i < LON_LENi++)
724  lon[i] = lon[i - 1] + 1.5;
725
726      /* Some phoney 2D pressure data. */
727      for (i = 0; i < LAT_LENi++)
728  for (j = 0; j < LON_LENj++)
729     pres[i][j] = 1013.1 + j;
730
731      /* Create a file. */
732      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
733
734      /* Define lat and lon dimensions, with associated variables. */
735      if (nc_def_dim(ncidLAT_NAMELAT_LEN, &lat_dimid)) ERR;
736      dimids[0] = lat_dimid;
737      if (nc_def_var(ncidLAT_NAMENC_FLOAT, 1, dimids, &lat_varid)) ERR;
738      if (nc_def_dim(ncidLON_NAMELON_LEN, &lon_dimid)) ERR;
739      dimids[0] = lon_dimid;
740      if (nc_def_var(ncidLON_NAMENC_FLOAT, 1, dimids, &lon_varid)) ERR;
741
742      /* Define a 2D variable called pressure, with NC_DOUBLE on a lat
743       * lon grid. */
744      dimids[0] = lat_dimid;
745      dimids[1] = lon_dimid;
746      if (nc_def_var(ncidPRES_NAMENC_DOUBLE, 2, dimids, &pres_varid)) ERR;
747
748      /* Check our dimensions. */
749      if (nc_inq_dim(ncidlat_dimidname_in, &len_in)) ERR;
750      if (len_in != LAT_LEN || strcmp(name_inLAT_NAME)) ERR;
751      if (nc_inq_dim(ncidlon_dimidname_in, &len_in)) ERR;
752      if (len_in != LON_LEN || strcmp(name_inLON_NAME)) ERR;
753      if (nc_inq_var(ncidlat_varidname_in, &xtype_in, &ndims_in,
754      dimids_in, &natts_in)) ERR;
755      if (strcmp(name_inLAT_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
756   dimids_in[0] != lat_dimid || natts_in != 0) ERR;
757      if (nc_inq_var(ncidlon_varidname_in, &xtype_in, &ndims_in,
758      dimids_in, &natts_in)) ERR;
759      if (strcmp(name_inLON_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
760   dimids_in[0] != lon_dimid || natts_in != 0) ERR;
761
762      /* Check our data variable. */
763      if (nc_inq_var(ncidpres_varidname_in, &xtype_in, &ndims_in,
764      dimids_in, &natts_in)) ERR;
765      if (strcmp(name_inPRES_NAME) || xtype_in != NC_DOUBLE || ndims_in != 2 ||
766   dimids_in[0] != lat_dimid || dimids_in[1] != lon_dimid || natts_in != 0) ERR;
767
768      /* Write our latitude and longitude values. This writes all
769       * metadata to disk too. */
770      if (nc_put_var_float(ncidlat_varidlat)) ERR;
771      if (nc_put_var_float(ncidlon_varidlon)) ERR;
772
773      /* Write our 2D pressure values. */
774      if (nc_put_var_double(ncidpres_varid, (double *)pres)) ERR;
775
776      /* Check our latitude and longitude values. */
777      if (nc_get_var(ncidlat_varidlat_in)) ERR;
778      for (i = 0; i < LAT_LENi++)
779  if (lat[i] != lat_in[i]) ERR;
780      if (nc_get_var_float(ncidlon_varidlon_in)) ERR;
781      for (i = 0; i < LON_LENi++)
782  if (lon[i] != lon_in[i]) ERR;
783
784      /* Check our pressure values. */
785      if (nc_get_var_double(ncidpres_varid, (double *)pres_in)) ERR;
786      for (i = 0; i < LAT_LENi++)
787  for (j = 0; j < LON_LENj++)
788     if (pres[i][j] != pres_in[i][j]) ERR;
789
790      /* Close the file. */
791      if (nc_close(ncid)) ERR;
792
793      /* Reopen the file and check it out again. */
794      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
795
796      /* Check our dimensions. */
797      if (nc_inq_dim(ncidlat_dimidname_in, &len_in)) ERR;
798      if (len_in != LAT_LEN || strcmp(name_inLAT_NAME)) ERR;
799      if (nc_inq_dim(ncidlon_dimidname_in, &len_in)) ERR;
800      if (len_in != LON_LEN || strcmp(name_inLON_NAME)) ERR;
801      if (nc_inq_var(ncidlat_varidname_in, &xtype_in, &ndims_in,
802      dimids_in, &natts_in)) ERR;
803      if (strcmp(name_inLAT_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
804   dimids_in[0] != lat_dimid || natts_in != 0) ERR;
805      if (nc_inq_var(ncidlon_varidname_in, &xtype_in, &ndims_in,
806      dimids_in, &natts_in)) ERR;
807      if (strcmp(name_inLON_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
808   dimids_in[0] != lon_dimid || natts_in != 0) ERR;
809
810      /* Check our data variable. */
811      if (nc_inq_var(ncidpres_varidname_in, &xtype_in, &ndims_in,
812      dimids_in, &natts_in)) ERR;
813      if (strcmp(name_inPRES_NAME) || xtype_in != NC_DOUBLE || ndims_in != 2 ||
814   dimids_in[0] != lat_dimid || dimids_in[1] != lon_dimid || natts_in != 0) ERR;
815
816      /* Check our latitude and longitude values. */
817      if (nc_get_var(ncidlat_varidlat_in)) ERR;
818      for (i = 0; i < LAT_LENi++)
819  if (lat[i] != lat_in[i]) ERR;
820      if (nc_get_var_float(ncidlon_varidlon_in)) ERR;
821      for (i = 0; i < LON_LENi++)
822  if (lon[i] != lon_in[i]) ERR;
823
824      /* Check our pressure values. */
825      if (nc_get_var_double(ncidpres_varid, (double *)pres_in)) ERR;
826      for (i = 0; i < LAT_LENi++)
827  for (j = 0; j < LON_LENj++)
828     if (pres[i][j] != pres_in[i][j]) ERR;
829
830      if (nc_close(ncid)) ERR;
831   }
832
833   SUMMARIZE_ERR;
834   printf("*** Creating file with 3 data vars, 4 dims, and 2 coord. vars...");
835
836   {
837      int ncidlat_dimiddimids[MAX_DIMS];
838      int level_dimidtime_dimidelev_varid;
839      int lat_varidlon_dimidlon_varidpres_varidhp_varid;
840      double pres[LAT_LEN][LON_LEN][LEVEL_LEN][TIME_LEN];
841      double pres_in[LAT_LEN][LON_LEN][LEVEL_LEN][TIME_LEN];
842      unsigned short hp[LAT_LEN][LON_LEN][TIME_LEN];
843      unsigned short hp_in[LAT_LEN][LON_LEN][TIME_LEN];
844      unsigned long long elev[LAT_LEN][LON_LEN], elev_in[LAT_LEN][LON_LEN];
845      size_t start[4], count[4];
846      int nvarsndimsnattsunlimdimid;
847      int natts_inndims_indimids_in[MAX_DIMS];
848      nc_type xtype_in;
849      size_t len_in;
850      char name_in[NC_MAX_NAME + 1];
851      float lat[LAT_LEN], lon[LON_LEN];
852      float lat_in[LAT_LEN], lon_in[LON_LEN];
853      int ijkl;
854
855      /* Some phony 4D pressure data. */
856      for (i = 0; i < LAT_LENi++)
857  for (j = 0; j < LON_LENj++)
858     for (k = 0; k < LEVEL_LENk++)
859        for (l = 0; l <TIME_LENl++)
860   pres[i][j][k][l] = 1013.1 + j;
861
862      /* Some phony 3D hp data. */
863      for (i = 0; i < LAT_LENi++)
864  for (j = 0; j < LON_LENj++)
865     for (l = 0; l <TIME_LENl++)
866        hp[i][j][l] = 100 + l;
867
868      /* Some phony 2D elevaton data. */
869      for (i = 0; i < LAT_LENi++)
870  for (j = 0; j < LON_LENj++)
871     elev[i][j] = 1010101022223333ULL  + i + j;
872
873      /* Some phony 1D lats and lons. */
874      for (i = 0; i < LAT_LENi++)
875  lat[i] = i * 5.;
876      for (i = 0; i < LON_LENi++)
877  lon[i] = i * 5.;
878
879      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
880
881      /* Define lat, lon, level, and timestep dimensions, with
882       * associated coordinate variables for lat and lon only. Time is
883       * an unlimited dimension. */
884      if (nc_def_dim(ncidLAT_NAMELAT_LEN, &lat_dimid)) ERR;
885      if (lat_dimid != LAT_DIMIDERR;
886      dimids[0] = lat_dimid;
887      if (nc_def_var(ncidLAT_NAMENC_FLOAT, 1, dimids, &lat_varid)) ERR;
888      if (lat_varid != LAT_VARIDERR;
889      if (nc_def_dim(ncidLON_NAMELON_LEN, &lon_dimid)) ERR;
890      if (lon_dimid != LON_DIMIDERR;
891      dimids[0] = lon_dimid;
892      if (nc_def_var(ncidLON_NAMENC_FLOAT, 1, dimids, &lon_varid)) ERR;
893      if (lon_varid != LON_VARIDERR;
894      if (nc_def_dim(ncidLEVEL_NAMELEVEL_LEN, &level_dimid)) ERR;
895      if (level_dimid != LEVEL_DIMIDERR;
896      if (nc_def_dim(ncidTIME_NAMENC_UNLIMITED, &time_dimid)) ERR;
897      if (time_dimid != TIME_DIMIDERR;
898
899      /* Define a 4D NC_DOUBLE variable called pressure. */
900      dimids[0] = lat_dimid;
901      dimids[1] = lon_dimid;
902      dimids[2] = level_dimid;
903      dimids[3] = time_dimid;
904      if (nc_def_var(ncidPRES_NAMENC_DOUBLE, 4, dimids, &pres_varid)) ERR;
905      if (pres_varid != PRES_VARIDERR;
906
907      /* Define a 2D variable for surface elevation. Use NC_INT64
908       * because our units for this is Angstroms from Earth's
909       * Center. */
910      if (nc_def_var(ncidELEV_NAMENC_INT64, 2, dimids, &elev_varid)) ERR;
911      if (elev_varid != ELEV_VARIDERR;
912
913      /* Define a 3D NC_USHORT variable to store the number of Harry
914       * Potter books in this grid square at this time (ignore HP
915       * books in airplanes, dirigibles, hot air balloons, space
916       * capsules, hang-gliders, parachutes, and flying on brooms). */
917      dimids[2] = time_dimid;
918      if (nc_def_var(ncidHP_NAMENC_USHORT, 3, dimids, &hp_varid)) ERR;
919      if (hp_varid != HP_VARIDERR;
920
921      /* Did all our stuff make it into the internal metadata model
922       * intact? */
923      /* Check our dimensions. */
924      if (nc_inq_dim(ncidLAT_DIMIDname_in, &len_in)) ERR;
925      if (len_in != LAT_LEN || strcmp(name_inLAT_NAME)) ERR;
926      if (nc_inq_dim(ncidLON_DIMIDname_in, &len_in)) ERR;
927      if (len_in != LON_LEN || strcmp(name_inLON_NAME)) ERR;
928      if (nc_inq_dim(ncidLEVEL_DIMIDname_in, &len_in)) ERR;
929      if (len_in != LEVEL_LEN || strcmp(name_inLEVEL_NAME)) ERR;
930      if (nc_inq_dim(ncidTIME_DIMIDname_in, &len_in)) ERR;
931      if (len_in != 0 || strcmp(name_inTIME_NAME)) ERR;
932
933      /* Check our coordinate variables. */
934      if (nc_inq_var(ncidLAT_VARIDname_in, &xtype_in, &ndims_in,
935      dimids_in, &natts_in)) ERR;
936      if (strcmp(name_inLAT_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
937   dimids_in[0] != LAT_DIMID || natts_in != 0) ERR;
938      if (nc_inq_var(ncidLON_VARIDname_in, &xtype_in, &ndims_in,
939      dimids_in, &natts_in)) ERR;
940      if (strcmp(name_inLON_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
941   dimids_in[0] != LON_DIMID || natts_in != 0) ERR;
942
943      /* Check our data variables. */
944      if (nc_inq_var(ncidPRES_VARIDname_in, &xtype_in, &ndims_in,
945      dimids_in, &natts_in)) ERR;
946      if (strcmp(name_inPRES_NAME) || xtype_in != NC_DOUBLE || ndims_in != 4 ||
947   dimids_in[0] != LAT_DIMID || dimids_in[1] != LON_DIMID ||
948   dimids_in[2] != LEVEL_DIMID || dimids_in[3] != TIME_DIMID ||
949   natts_in != 0) ERR;
950      if (nc_inq_var(ncidELEV_VARIDname_in, &xtype_in, &ndims_in,
951      dimids_in, &natts_in)) ERR;
952      if (strcmp(name_inELEV_NAME) || xtype_in != NC_INT64 || ndims_in != 2 ||
953   dimids_in[0] != LAT_DIMID || dimids_in[1] != LON_DIMID ||
954   natts_in != 0) ERR;
955      if (nc_inq_var(ncidHP_VARIDname_in, &xtype_in, &ndims_in,
956      dimids_in, &natts_in)) ERR;
957      if (strcmp(name_inHP_NAME) || xtype_in != NC_USHORT || ndims_in != 3 ||
958   dimids_in[0] != LAT_DIMID || dimids_in[1] != LON_DIMID ||
959   dimids_in[2] != TIME_DIMID || natts_in != 0) ERR;
960
961      /* Write our latitude and longitude values. This writes all
962       * metadata to disk too. */
963      if (nc_put_var_float(ncidlat_varidlat)) ERR;
964      if (nc_put_var_float(ncidlon_varidlon)) ERR;
965
966      /* Write our 4D pressure, elevation, and hp data. But this
967       * should do nothing for pressure and hp, because these are
968       * record vars, and nc_put_var_* doesn't do anything to record
969       * vars, because it doesn't know how big the var is supposed to
970       * be. */
971      if (nc_put_var_double(ncidpres_varid, (double *)pres)) ERR;
972      if (nc_put_var_ulonglong(ncidelev_varid, (unsigned long long *)elev)) ERR;
973      if (nc_put_var_ushort(ncidhp_varid, (unsigned short *)hp)) ERR;
974
975      /* Check our latitude and longitude values. */
976      if (nc_get_var(ncidlat_varidlat_in)) ERR;
977      for (i = 0; i < LAT_LENi++)
978  if (lat[i] != lat_in[i]) ERR;
979      if (nc_get_var_float(ncidlon_varidlon_in)) ERR;
980      for (i = 0; i < LON_LENi++)
981  if (lon[i] != lon_in[i]) ERR;
982
983      /* Make sure our pressure and hp variables are still
984       * empty. get_var calls will return no error, but fetch no
985       * data. */
986      if (nc_inq_var(ncidpres_varidname_in, &xtype_in, &ndims_in,
987      dimids_in, &natts_in)) ERR;
988      if (nc_inq_dim(nciddimids_in[3], NULL, &len_in)) ERR;
989      if (len_in != 0) ERR;
990      memset(pres_in, 0, sizeof(pres_in));
991      if (nc_get_var_double(ncidpres_varid, (double *)pres_in)) ERR;
992
993      /* Check our pressure values. */
994      for (i = 0; i < LAT_LENi++)
995  for (j = 0; j < LON_LENj++)
996     for (k = 0; k < LEVEL_LENk++)
997        for (l = 0; l <TIME_LENl++)
998   if (0 != pres_in[i][j][k][l]) ERR;
999
1000      if (nc_inq_var(ncidhp_varidNULLNULL, &ndims_in,
1001      dimids_inNULL)) ERR;
1002      if (nc_inq_dim(nciddimids_in[2], NULL, &len_in)) ERR;
1003      if (len_in != 0) ERR;
1004      memset(hp_in, 0, sizeof(hp_in));
1005      if (nc_get_var_ushort(ncidhp_varid, (unsigned short *)hp_in)) ERR;
1006
1007      /* Check our hp values. */
1008      for (i = 0; i < LAT_LENi++)
1009  for (j = 0; j < LON_LENj++)
1010     for (l = 0; l <TIME_LENl++)
1011        if (0 != hp_in[i][j][l]) ERR;
1012
1013      /* Now use nc_put_vara to really write pressure and hp
1014       * data. Write TIME_LEN (4) records of each. */
1015      start[0] = start[1] = start[2] = start[3] = 0;
1016      count[0] = LAT_LEN;
1017      count[1] = LON_LEN;
1018      count[2] = LEVEL_LEN;
1019      count[3] = TIME_LEN;
1020      if (nc_put_vara(ncidpres_varidstartcount,
1021       (double *)pres)) ERR;
1022      count[2] = TIME_LEN;
1023      if (nc_put_vara(ncidhp_varidstartcount,
1024       (double *)hp)) ERR;
1025
1026      /* Check our pressure values. */
1027      if (nc_get_var_double(ncidpres_varid, (double *)pres_in)) ERR;
1028      for (i = 0; i < LAT_LENi++)
1029  for (j = 0; j < LON_LENj++)
1030     for (k = 0; k < LEVEL_LENk++)
1031        for (l = 0; l <TIME_LENl++)
1032   if (pres[i][j][k][l] != pres_in[i][j][k][l]) ERR;
1033
1034      /* Check our elevation values. */
1035      if (nc_get_var_ulonglong(ncidelev_varid, (unsigned long long *)elev_in)) ERR;
1036      for (i = 0; i < LAT_LENi++)
1037  for (j = 0; j < LON_LENj++)
1038     if (elev[i][j] != elev_in[i][j]) ERR;
1039
1040      /* Check our hp values. */
1041      if (nc_get_var_ushort(ncidhp_varid, (unsigned short *)hp_in)) ERR;
1042      for (i = 0; i < LAT_LENi++)
1043  for (j = 0; j < LON_LENj++)
1044     for (l = 0; l <TIME_LENl++)
1045        if (hp[i][j][l] != hp_in[i][j][l]) ERR;
1046
1047      /* Close the file. */
1048      if (nc_close(ncid)) ERR;
1049
1050      /* Reopen the file and check it out again. At the moment, we
1051       * can't count on the varids and dimids being the same. */
1052      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
1053      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
1054      if (ndims != 4 || nvars != 5 || natts != 0) ERR;
1055      if (nc_close(ncid)) ERR;
1056   }
1057
1058   SUMMARIZE_ERR;
1059   printf("*** Testing file with dims and only some coordinate vars...");
1060#define NDIMS_EX 4
1061#define NLAT 6
1062#define NLON 12
1063#define LAT_NAME_EX "latitude"
1064#define LON_NAME_EX "longitude"
1065#define NREC 2
1066#define REC_NAME "time"
1067#define LVL_NAME "level"
1068#define NLVL 2
1069
1070/* Names of things. */
1071#define PRES_NAME "pressure"
1072#define TEMP_NAME "temperature"
1073#define UNITS "units"
1074#define DEGREES_EAST "degrees_east"
1075#define DEGREES_NORTH "degrees_north"
1076
1077/* There are 4 vars, two for data, two for coordinate data. */
1078#define NVARS_EX 4
1079
1080/* These are used to construct some example data. */
1081#define SAMPLE_PRESSURE 900
1082#define SAMPLE_TEMP 9.0
1083#define START_LAT 25.0
1084#define START_LON -125.0
1085
1086/* For the units attributes. */
1087#define UNITS "units"
1088#define PRES_UNITS "hPa"
1089#define TEMP_UNITS "celsius"
1090#define LAT_UNITS "degrees_north"
1091#define LON_UNITS "degrees_east"
1092#define MAX_ATT_LEN 80
1093   {
1094      /* IDs for the netCDF file, dimensions, and variables. */
1095      int ncidlon_dimidlat_dimid;
1096      int lon_varid;
1097      int ndims_in;
1098      int dimid[NDIMS_EX];
1099      char dim_name_in[NDIMS_EX][NC_MAX_NAME];
1100      int i;
1101
1102      /* Create the file. */
1103      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
1104
1105      /* Define the dimensions. */
1106      if (nc_def_dim(ncidLAT_NAME_EXNLAT, &lat_dimid)) ERR;
1107      if (nc_def_dim(ncidLON_NAME_EXNLON, &lon_dimid)) ERR;
1108
1109      /* Define a coordinate var. */
1110      if (nc_def_var(ncidLON_NAME_EXNC_FLOAT, 1, &lon_dimid,
1111        &lon_varid)) ERR;
1112
1113      /* Close the file. */
1114      if (nc_close(ncid)) ERR;
1115
1116      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
1117
1118      /* Check dimensions. */
1119      ndims_in = 0;
1120      if (nc_inq_dimids(ncid, &ndims_indimid, 0)) ERR;
1121      if (ndims_in != 2) ERR;
1122      for (i = 0; i < 2; i++)
1123      {
1124  if (dimid[i] != iERR;
1125  if (nc_inq_dimname(ncididim_name_in[i])) ERR;
1126      }
1127      if (strcmp(dim_name_in[0], LAT_NAME_EX) ||
1128   strcmp(dim_name_in[1], LON_NAME_EX)) ERR;
1129
1130      /* Close the file. */
1131      if (nc_close(ncid)) ERR;
1132   }
1133   SUMMARIZE_ERR;
1134   printf("*** Testing file with just one very long dimension...");
1135   {
1136#define VERY_LONG_LEN (size_t)4500000000LL
1137      int nciddimid;
1138      int ndims_indimids_in[MAX_DIMS];
1139      size_t len_in;
1140      char name_in[NC_MAX_NAME + 1];
1141      int varid_in;
1142
1143      if (SIZEOF_SIZE_T == 8)
1144      {
1145  /* Create a file with one dim and nothing else. */
1146  if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
1147  if (nc_def_dim(ncidLAT_NAMEVERY_LONG_LEN, &dimid)) ERR;
1148
1149  /* Check it out. */
1150  if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
1151  if (len_in != ((SIZEOF_SIZE_T == 8) ? VERY_LONG_LEN : NC_MAX_UINT) ||
1152      strcmp(name_inLAT_NAME)) ERR;
1153  if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
1154  if (ndims_in != 1) ERR;
1155  if (nc_inq_dimid(ncidLAT_NAME, &varid_in)) ERR;
1156  if (varid_in != 0) ERR;
1157  if (nc_inq_dimname(ncid, 0, name_in)) ERR;
1158  if (strcmp(name_inLAT_NAME)) ERR;
1159  if (nc_inq_dimlen(ncid, 0, &len_in)) ERR;
1160  if (len_in != ((SIZEOF_SIZE_T == 8) ? VERY_LONG_LEN : NC_MAX_UINT)) ERR;
1161  if (nc_inq_unlimdims(ncid, &ndims_indimids_in)) ERR;
1162  if (ndims_in != 0) ERR;
1163  if (nc_close(ncid)) ERR;
1164
1165  /* Reopen and check it out again. */
1166  if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
1167  /* Check it out. */
1168  if (nc_inq_dim(nciddimidname_in, &len_in)) ERR;
1169  if (len_in != ((SIZEOF_SIZE_T == 8) ? VERY_LONG_LEN : NC_MAX_UINT) ||
1170      strcmp(name_inLAT_NAME)) ERR;
1171  if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
1172  if (ndims_in != 1) ERR;
1173  if (nc_inq_dimid(ncidLAT_NAME, &varid_in)) ERR;
1174  if (varid_in != 0) ERR;
1175  if (nc_inq_dimname(ncid, 0, name_in)) ERR;
1176  if (strcmp(name_inLAT_NAME)) ERR;
1177  if (nc_inq_dimlen(ncid, 0, &len_in)) ERR;
1178  if (len_in != ((SIZEOF_SIZE_T == 8) ? VERY_LONG_LEN : NC_MAX_UINT)) ERR;
1179  if (nc_inq_unlimdims(ncid, &ndims_indimids_in)) ERR;
1180  if (ndims_in != 0) ERR;
1181  if (nc_close(ncid)) ERR;
1182      }
1183   }
1184   SUMMARIZE_ERR;
1185   printf("*** Testing reference file with just one very long dimension...");
1186   {
1187#define REF_FILE_NAME "ref_tst_dims.nc"
1188      int nciddimid = 0;
1189      int ndims_indimids_in[MAX_DIMS];
1190      size_t len_in;
1191      char name_in[NC_MAX_NAME + 1];
1192      int varid_in;
1193      char file_in[NC_MAX_NAME + 1];
1194      int ret;
1195
1196      strcpy(file_in, "");
1197      if (getenv("srcdir"))
1198      {
1199  strcat(file_in, getenv("srcdir"));
1200  strcat(file_in, "/");
1201      }
1202      strcat(file_inREF_FILE_NAME);
1203
1204      /* Reopen and check it out again. */
1205      if (nc_open(file_inNC_NOWRITE, &ncid)) ERR;
1206
1207      /* Check it out. */
1208      ret = nc_inq_dim(nciddimidname_in, &len_in);
1209      if ((SIZEOF_SIZE_T >= 8 && ret) ||
1210   (SIZEOF_SIZE_T < 8 && ret != NC_EDIMSIZE)) ERR;
1211      if (SIZEOF_SIZE_T < 8)
1212      {
1213  if (len_in != NC_MAX_UINTERR;
1214      }
1215      else
1216      {
1217  if (len_in != VERY_LONG_LENERR;
1218      }
1219      if (strcmp(name_inLAT_NAME)) ERR;
1220      if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR;
1221      if (ndims_in != 1) ERR;
1222      if (nc_inq_dimid(ncidLAT_NAME, &varid_in)) ERR;
1223      if (varid_in != 0) ERR;
1224      if (nc_inq_unlimdims(ncid, &ndims_indimids_in)) ERR;
1225      if (ndims_in != 0) ERR;
1226      if (nc_close(ncid)) ERR;
1227   }
1228   SUMMARIZE_ERR;
1229   FINAL_RESULTS;
1230}


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