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 inheritance.
6
7   $Id: tst_dims3.c,v 1.7 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
14int
15main(int argc, char **argv)
16{
17nc_set_log_level(0);
18   printf("\n*** Testing netcdf-4 dimensions even more.\n");
19   printf("*** testing netcdf-4 dimension inheritance...");
20   {
21#define FILE_NAME "tst_dims3.nc"
22#define RANK_time 1
23#define GRP_NAME  "G"
24#define GRP2_NAME "G2"
25#define TIME_NAME "time"
26#define VAR2_NAME "z"
27#define TIME_RANK 1
28#define NUM_TIMES 2
29#define LEV_NAME "level"
30#define VRT_NAME "vert_number"
31#define LEV_NUM  3
32#define LEV_RANK 1
33#define VRT_RANK 1
34#define VAR2_RANK 2
35#define NUM_VRT 3
36      int ncidgrpid;
37      int time_dimtime_dim_in;
38      int time_varz_var;
39      size_t len;
40      int time_data[NUM_TIMES] = {1, 2} ;
41      size_t time_startset[TIME_RANK] = {0} ;
42      size_t time_countset[TIME_RANK] = {NUM_TIMES} ;
43
44      /* Create file with unlimited dim and associated coordinate
45       * variable in root group, another variable that uses unlimited
46       * dim in subgroup. */
47      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
48      if (nc_def_grp(ncidGRP_NAME, &grpid)) ERR;
49      if (nc_def_dim(ncidTIME_NAMENC_UNLIMITED, &time_dim)) ERR;
50      if (nc_def_var(ncidTIME_NAMENC_INTTIME_RANK, &time_dim,
51      &time_var)) ERR;
52      if (nc_def_var(grpidVAR2_NAMENC_INTTIME_RANK, &time_dim,
53      &z_var)) ERR;
54      if (nc_enddef(ncid)) ERR;
55
56      /* Assign data to time variable, creating two times */
57      if (nc_put_vara(ncidtime_dimtime_startsettime_countset,
58       time_data)) ERR;
59
60      /* Check the dim len from the root group */
61      if (nc_inq_dimlen(ncidtime_dim, &len)) ERR;
62      if (len != NUM_TIMESERR;
63
64      /* Check the dim len from the sub group */
65      if (nc_inq_dimlen(grpidtime_dim, &len)) ERR;
66      if (len != NUM_TIMESERR;
67      if (nc_close(ncid)) ERR;
68
69      /* Now check how many times there are from the subgroup */
70      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
71      if (nc_inq_ncid(ncidGRP_NAME, &grpid)) ERR;
72      if (nc_inq_dimid(ncidTIME_NAME, &time_dim)) ERR;
73
74      /* Check the dim len from the root group */
75      if (nc_inq_dimlen(ncidtime_dim, &len)) ERR;
76      if (len != NUM_TIMESERR;
77
78      /* Check the dim len from the sub group */
79      if (nc_inq_dimlen(grpidtime_dim, &len)) ERR;
80      if (len != NUM_TIMESERR;
81
82      /* Find the dimension by name. */
83      if (nc_inq_dimid(grpidTIME_NAME, &time_dim_in)) ERR;
84      if (time_dim_in != time_dimERR;
85
86      if (nc_close(ncid)) ERR;
87   }
88   SUMMARIZE_ERR;
89   printf("*** testing a scalar coordinate dimension...");
90   {
91      int nciddimidvarid;
92      float data = 42.5;
93
94      /* Create a scalar coordinate dimension. The only reason that
95       * the user can ever possibly have for doing this is just
96       * because they like to make life difficult for poor, poor
97       * netCDF programmers, trapped in this horrible place, in a
98       * Rocky Mountain valley, drenched in sunlight, with a stream
99       * quietly gurgling, deer feeding on the grasses, and all those
100       * damn birds chirping! */
101      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR_RET;
102      if (nc_def_dim(ncid, "scalar", 0, &dimid)) ERR_RET;
103      if (nc_def_var(ncid, "scalar", NC_FLOAT, 0, &dimid, &varid)) ERR_RET;
104      if (nc_put_var_float(ncidvarid, &data)) ERR_RET;
105      if (nc_close(ncid))
106 ERR_RET;
107   }
108   SUMMARIZE_ERR;
109   printf("*** testing defining dimensions and coord variables in different orders in root group...");
110   {
111       int ncidgrpidgrp2id;
112       int time_dimidlev_dimidvrt_dimidg2lev_dimidg2vrt_dimid;
113       int time_dimid_inlev_dimid_invrt_dimid_ing2lev_dimid_ing2vrt_dimid_in;
114       int time_varidlev_varidgvar2_varidg2lev_varidg2vrt_varid;
115       int var2_dims[VAR2_RANK];
116      /* Create test for fix of bug that resulted in two dimensions
117       * having the same dimid, which violates the Pauli exclusion
118       * principle for dimensions. */
119      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR_RET;
120      if (nc_def_grp(ncidGRP_NAME, &grpid)) ERR;
121      if (nc_def_dim(ncidTIME_NAMENC_UNLIMITED, &time_dimid)) ERR_RET;
122      if (nc_def_dim(ncidLEV_NAMELEV_NUM, &lev_dimid)) ERR_RET;
123      var2_dims[0] = time_dimid;
124      var2_dims[1] = lev_dimid;
125      if (nc_def_var(grpidVAR2_NAMENC_FLOATVAR2_RANKvar2_dims, &gvar2_varid)) ERR;
126      /* define coord vars in opposite order of coord dims */
127      if (nc_def_var(ncidLEV_NAMENC_FLOATLEV_RANK, &lev_dimid, &lev_varid)) ERR;
128      if (nc_def_var(ncidTIME_NAMENC_FLOATTIME_RANK, &time_dimid, &time_varid)) ERR;
129
130      if (nc_def_grp(ncidGRP2_NAME, &grp2id)) ERR;
131      if (nc_def_dim(grp2idLEV_NAMELEV_NUM, &g2lev_dimid)) ERR_RET;
132      if (nc_def_dim(grp2idVRT_NAMENUM_VRT, &g2vrt_dimid)) ERR_RET;
133      if (nc_def_var(grp2idLEV_NAMENC_FLOATLEV_RANK, &g2lev_dimid, &g2lev_varid)) ERR;
134      if (nc_def_var(grp2idVRT_NAMENC_FLOATVRT_RANK, &g2vrt_dimid, &g2vrt_varid)) ERR;
135      if (nc_close(ncid)) ERR;
136
137      /* Re-open, in which dimids may get reassigned */
138      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
139      if (nc_inq_dimid(ncidTIME_NAME, &time_dimid_in)) ERR;
140      if (nc_inq_dimid(ncidLEV_NAME, &lev_dimid_in)) ERR;
141      if (nc_inq_ncid(ncidGRP2_NAME, &grp2id)) ERR;
142      if (nc_inq_dimid(grp2idLEV_NAME, &g2lev_dimid_in)) ERR;
143      if (nc_inq_dimid(grp2idVRT_NAME, &g2vrt_dimid_in)) ERR;
144      /* dimids must still all be distinct */
145      if (time_dimid_in == lev_dimid_in ||
146   time_dimid_in == g2lev_dimid_in ||
147   time_dimid_in == g2vrt_dimid_in ||
148   lev_dimid_in == g2lev_dimid_in ||
149   lev_dimid_in == g2vrt_dimid_in ||
150   g2lev_dimid_in == g2vrt_dimid_inERR;
151
152      if (nc_close(ncid))
153 ERR_RET;
154   }
155   SUMMARIZE_ERR;
156   printf("*** testing defining dimensions and coord variables in different orders in subgroup...");
157   {
158       int ncidgrpidgrp2id;
159       int time_dimidlev_dimidvrt_dimidg2lev_dimidg2vrt_dimid;
160       int time_dimid_inlev_dimid_invrt_dimid_ing2lev_dimid_ing2vrt_dimid_in;
161       int time_varidlev_varidgvar2_varidg2lev_varidg2vrt_varid;
162       int var2_dims[VAR2_RANK];
163      /* Create test for fix of bug inside a subgroup that results in two dimensions
164       * having the same dimid. */
165      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR_RET;
166      if (nc_def_grp(ncidGRP_NAME, &grpid)) ERR;
167      if (nc_def_dim(ncidTIME_NAMENC_UNLIMITED, &time_dimid)) ERR_RET;
168      if (nc_def_dim(ncidLEV_NAMELEV_NUM, &lev_dimid)) ERR_RET;
169      var2_dims[0] = time_dimid;
170      var2_dims[1] = lev_dimid;
171      if (nc_def_var(grpidVAR2_NAMENC_FLOATVAR2_RANKvar2_dims, &gvar2_varid)) ERR;
172      if (nc_def_var(ncidTIME_NAMENC_FLOATTIME_RANK, &time_dimid, &time_varid)) ERR;
173      if (nc_def_var(ncidLEV_NAMENC_FLOATLEV_RANK, &lev_dimid, &lev_varid)) ERR;
174
175      if (nc_def_grp(ncidGRP2_NAME, &grp2id)) ERR;
176      if (nc_def_dim(grp2idLEV_NAMELEV_NUM, &g2lev_dimid)) ERR_RET;
177      if (nc_def_dim(grp2idVRT_NAMENUM_VRT, &g2vrt_dimid)) ERR_RET;
178      /* define coord vars in opposite order of coord dims */
179      if (nc_def_var(grp2idVRT_NAMENC_FLOATVRT_RANK, &g2vrt_dimid, &g2vrt_varid)) ERR;
180      if (nc_def_var(grp2idLEV_NAMENC_FLOATLEV_RANK, &g2lev_dimid, &g2lev_varid)) ERR;
181      if (nc_close(ncid)) ERR;
182
183      /* Re-open, in which dimids may get reassigned */
184      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
185      if (nc_inq_dimid(ncidTIME_NAME, &time_dimid_in)) ERR;
186      if (nc_inq_dimid(ncidLEV_NAME, &lev_dimid_in)) ERR;
187      if (nc_inq_ncid(ncidGRP2_NAME, &grp2id)) ERR;
188      if (nc_inq_dimid(grp2idLEV_NAME, &g2lev_dimid_in)) ERR;
189      if (nc_inq_dimid(grp2idVRT_NAME, &g2vrt_dimid_in)) ERR;
190      /* dimids must still all be distinct */
191      if (time_dimid_in == lev_dimid_in ||
192   time_dimid_in == g2lev_dimid_in ||
193   time_dimid_in == g2vrt_dimid_in ||
194   lev_dimid_in == g2lev_dimid_in ||
195   lev_dimid_in == g2vrt_dimid_in ||
196   g2lev_dimid_in == g2vrt_dimid_inERR;
197
198      if (nc_close(ncid))
199 ERR_RET;
200   }
201   SUMMARIZE_ERR;
202   FINAL_RESULTS;
203}


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