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   Create a test file with default fill values for variables of each type.
6
7   $Id: tst_fills.c,v 1.12 2009/03/17 01:22:42 ed Exp $
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <stdlib.h>
13#include <stdio.h>
14#include <netcdf.h>
15
16#define FILE_NAME "tst_fills.nc"
17
18int
19main(int argc, char **argv)
20{ /* create tst_classic_fills.nc */
21   printf("\n*** Testing fill values.\n");
22   printf("*** testing very simple scalar string var...");
23   {
24#define STRING_VAR_NAME "Petition_of_Right"
25#define NDIMS_STRING 1
26
27      int  ncidvarid;
28      int varid_in;
29      const char *data_out[NDIMS_STRING] = {
30  "Humbly show unto our Sovereign Lord the King, the Lords "
31  "Spiritual and Temporal, and Commons in Parliament assembles, "
32  "that whereas it is declared and enacted by a statute made in "
33  "the time of the reign of King Edward I, commonly called "
34  "Stratutum de Tellagio non Concedendo, that no tallage or "
35  "aid shall be laid or levied by the king or his heirs in this "
36  "realm, without the good will and assent of the archbishops, "
37  "bishops, earls, barons, knights, burgesses, and other the "
38  "freemen of the commonalty of this realm; and by authority "
39  "of parliament holden in the five-and-twentieth year of the "
40  "reign of King Edward III, it is declared and enacted, that "
41  "from thenceforth no person should be compelled to make any "
42  "loans to the king against his will, because such loans were "
43  "against reason and the franchise of the land; and by other "
44  "laws of this realm it is provided, that none should be charged "
45  "by any charge or imposition called a benevolence, nor by such "
46  "like charge; by which statutes before mentioned, and other the "
47  "good laws and statutes of this realm, your subjects have inherited "
48  "this freedom, that they should not be compelled to contribute "
49  "to any tax, tallage, aid, or other like charge not set by "
50  "common consent, in parliament."
51      };
52      char *data_in[NDIMS_STRING];
53      size_t index1[NDIMS_STRING] = {0};
54
55      /* Create file with a 1D string var. Set its fill value to the
56       * empty string. */
57      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
58      if (nc_def_var(ncidSTRING_VAR_NAMENC_STRING, 0, NULL, &varid)) ERR;
59
60      /* Check it out. */
61      if (nc_inq_varid(ncidSTRING_VAR_NAME, &varid_in)) ERR;
62      if (varid_in != varidERR;
63
64      /* Write string. */
65      if (nc_put_var1_string(ncidvarid_inindex1data_out)) ERR;
66
67      /* Get the string, check it, and free it. */
68      if (nc_get_var_string(ncidvarid_indata_in)) ERR;
69      if (strcmp(data_in[0], data_out[0])) ERR;
70      if (nc_free_string(1, data_in)) ERR;
71
72      /* Close the file. */
73      if (nc_close(ncid)) ERR;
74
75      /* Now re-open file, read data, and check values again. */
76      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
77
78      /* Get the string, check it, and free it. */
79      if (nc_get_var_string(ncidvarid_indata_in)) ERR;
80      if (strcmp(data_in[0], data_out[0])) ERR;
81      if (nc_free_string(1, data_in)) ERR;
82
83      /* Close the file. */
84      if (nc_close(ncid)) ERR;
85   }
86   SUMMARIZE_ERR;
87   printf("*** testing fill values of one var...");
88   {
89#define V1_NAME "v1"
90#define MAX_VALS 10
91      int  ncidvaridrec_iddims[2];
92      static int rec[1] = {1};
93      size_t start[2] = {0, 0};
94      size_t count[2] = {1, MAX_VALS};
95      char vals[MAX_VALS];
96      int i;
97
98      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
99
100      /* Define dimensions and two vars, a 1D coordinate var for
101       * unlimited dimension, and a 2D var which uses the unlimited
102       * dimension. */
103      if (nc_def_dim(ncid, "rec", NC_UNLIMITED, &dims[0])) ERR;
104      if (nc_def_dim(ncid, "len", MAX_VALS, &dims[1])) ERR;
105      if (nc_def_var(ncid, "rec", NC_INT, 1, dims, &rec_id)) ERR;
106      if (nc_def_var(ncidV1_NAMENC_CHAR, 2, dims, &varid)) ERR;
107
108      /* Extend record dimension by 1. */
109      if (nc_put_vara_int(ncidrec_idstartcountrec)) ERR;
110
111      /* Read the other variable; it must have only fill values. */
112      if (nc_get_vara_text(ncid, 1, startcountvals)) ERR;
113      for (i = 0; i < MAX_VALSi++)
114  if(vals[i] != NC_FILL_CHARERR;
115
116      if (nc_close(ncid)) ERR;
117
118      /* Now re-open file, read data, and check values again. */
119      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
120
121      /* Read the other variable; it must have only fill values. */
122      if (nc_get_vara_text(ncid, 1, startcountvals)) ERR;
123      for (i = 0; i < MAX_VALSi++)
124  if(vals[i] != NC_FILL_CHARERR;
125
126      if(nc_close(ncid)) ERR;
127   }
128   SUMMARIZE_ERR;
129   printf("*** testing fill values of lots of vars...");
130   {
131      int  ncid; /* netCDF id */
132
133#define NVALS 10 /* values per fixed-size variable or record */
134#define NFIXVARS 6 /* number of fixed-size vars, one of each type */
135#define NRECVARS 6 /* number of record vars, one of each type */
136#define RANK_REC 1
137#define RANK_FIXVARS 1
138#define RANK_RECVARS 2
139
140      /* dimension ids */
141      int rec_dim;
142      int len_dim;
143
144      /* dimension lengths */
145      size_t rec_len = NC_UNLIMITED;
146      size_t len_len = NVALS;
147
148      /* variable ids */
149      int rec_id;
150      int fixvar_ids[NFIXVARS];
151      int recvar_ids[NRECVARS];
152      int rec_dims[RANK_REC];
153      int fixvar_dims[RANK_FIXVARS];
154      int recvar_dims[RANK_RECVARS];
155      int fixvarrecvari;
156
157      char *fnames[] = {"c", "b", "s", "i", "f", "d"};
158      char *rnames[] = {"cr", "br", "sr", "ir", "fr", "dr"};
159      nc_type types[] = {NC_CHARNC_BYTENC_SHORTNC_INTNC_FLOATNC_DOUBLE};
160
161      /*if (nc_set_default_format(format + 1, NULL)) ERR;*/
162      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
163
164      /* define dimensions */
165      if (nc_def_dim(ncid, "rec", rec_len, &rec_dim)) ERR;
166      if (nc_def_dim(ncid, "len", len_len, &len_dim)) ERR;
167
168      rec_dims[0] = rec_dim;
169      if (nc_def_var(ncid, "rec", NC_INTRANK_RECrec_dims, &rec_id)) ERR;
170
171      /* define fixed and record variables of all 6 primitive types */
172      fixvar_dims[0] = len_dim;
173      for (fixvar = 0; fixvar < NFIXVARSfixvar++)
174  if (nc_def_var(ncidfnames[fixvar], types[fixvar], RANK_FIXVARS,
175 fixvar_dims, &fixvar_ids[fixvar])) ERR;
176
177      recvar_dims[0] = rec_dim;
178      recvar_dims[1] = len_dim;
179      for (recvar = 0; recvar < NRECVARSrecvar++)
180  if (nc_def_var(ncidrnames[recvar], types[recvar], RANK_RECVARS,
181 recvar_dims, &recvar_ids[recvar])) ERR;
182
183      /* leave define mode */
184      if (nc_enddef(ncid)) ERR;
185
186      { /* store rec */
187  static size_t rec_start[RANK_REC];
188  static size_t rec_count[RANK_REC];
189  static int rec[] = {1};
190  rec_len = 1; /* number of records of rec data */
191  rec_start[0] = 0;
192  rec_count[0] = rec_len;
193  if (nc_put_vara_int(ncidrec_idrec_startrec_countrec)) ERR;
194      }
195      if (nc_close(ncid)) ERR;
196
197      /* Now re-open file, read data, and check values */
198      if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
199
200      /* Check that fixed-size variables are full of fill values */
201      for (fixvar = 0; fixvar < NFIXVARSfixvar++) {
202  int varid;
203  nc_type type;
204
205  if (nc_inq_varid(ncidfnames[fixvar], &varid)) ERR;
206  if (nc_inq_vartype(ncidvarid, &type)) ERR;
207  switch(type) {
208     case NC_CHAR:
209     {
210        char vals[NVALS];
211        if (nc_get_var_text(ncidvaridvals)) ERR;
212        for (i = 0; i < NVALSi++)
213   if(vals[i] != NC_FILL_CHARERR;
214     }
215     break;
216     case NC_BYTE:
217     {
218        signed char vals[NVALS];
219        if (nc_get_var_schar(ncidvaridvals)) ERR;
220        for (i = 0; i < NVALSi++)
221   if(vals[i] != NC_FILL_BYTEERR;
222     }
223     break;
224     case NC_SHORT:
225     {
226        short vals[NVALS];
227        if (nc_get_var_short(ncidvaridvals)) ERR;
228        for (i = 0; i < NVALSi++)
229   if(vals[i] != NC_FILL_SHORTERR;
230     }
231     break;
232     case NC_INT:
233     {
234        int vals[NVALS];
235        if (nc_get_var_int(ncidvaridvals)) ERR;
236        for (i = 0; i < NVALSi++)
237   if(vals[i] != NC_FILL_INTERR;
238     }
239     break;
240     case NC_FLOAT:
241     {
242        float vals[NVALS];
243        if (nc_get_var_float(ncidvaridvals)) ERR;
244        for (i = 0; i < NVALSi++)
245   if(vals[i] != NC_FILL_FLOATERR;
246     }
247     break;
248     case NC_DOUBLE:
249     {
250        double vals[NVALS];
251        if (nc_get_var_double(ncidvaridvals)) ERR;
252        for (i = 0; i < NVALSi++)
253   if (vals[i] != NC_FILL_DOUBLEERR;
254     }
255     break;
256     default:
257        ERR;
258  }
259      }
260
261      /* Read record, check record variables have only fill values */
262      for (recvar = 0; recvar < NRECVARSrecvar++) {
263  int varid;
264  nc_type type;
265  size_t start[] = {0, 0};
266  size_t count[] = {1, NVALS};
267
268  if (nc_inq_varid(ncidrnames[recvar], &varid)) ERR;
269  if (nc_inq_vartype(ncidvarid, &type)) ERR;
270  switch(type) {
271     case NC_CHAR:
272     {
273        char vals[NVALS];
274        if (nc_get_vara_text(ncidvaridstartcountvals)) ERR;
275        for (i = 0; i < NVALSi++)
276   if(vals[i] != NC_FILL_CHARERR;
277     }
278     break;
279     case NC_BYTE:
280     {
281        signed char vals[NVALS];
282        if (nc_get_vara_schar(ncidvaridstartcountvals)) ERR;
283        for (i = 0; i < NVALSi++)
284   if(vals[i] != NC_FILL_BYTEERR;
285     }
286     break;
287     case NC_SHORT:
288     {
289        short vals[NVALS];
290        if (nc_get_vara_short(ncidvaridstartcountvals)) ERR;
291        for (i = 0; i < NVALSi++)
292   if(vals[i] != NC_FILL_SHORTERR;
293     }
294     break;
295     case NC_INT:
296     {
297        int vals[NVALS];
298        if (nc_get_vara_int(ncidvaridstartcountvals)) ERR;
299        for (i = 0; i < NVALSi++)
300   if(vals[i] != NC_FILL_INTERR;
301     }
302     break;
303     case NC_FLOAT:
304     {
305        float vals[NVALS];
306        if (nc_get_vara_float(ncidvaridstartcountvals)) ERR;
307        for (i = 0; i < NVALSi++)
308   if(vals[i] != NC_FILL_FLOATERR;
309     }
310     break;
311     case NC_DOUBLE:
312     {
313        double vals[NVALS];
314        if (nc_get_vara_double(ncidvaridstartcountvals)) ERR;
315        for (i = 0; i < NVALSi++)
316   if(vals[i] != NC_FILL_DOUBLEERR;
317     }
318     break;
319     default:
320        ERR;
321  }
322      }
323
324      if (nc_close(ncid)) ERR;
325   }
326   SUMMARIZE_ERR;
327   FINAL_RESULTS;
328}


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