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 netCDF-4 file with compression, chunking, endianness
6   settings to test ncdump "-s" option for displaying special
7   attributes.
8
9   $Id: tst_special_atts.c,v 1.12 2009/01/28 18:19:49 russ Exp $
10*/
11
12#include <nc_tests.h>
13#include "err_macros.h"
14#include <netcdf.h>
15
16#define FILE_NAME "tst_special_atts.nc"
17#define DIM1_NAME "dim1"
18#define DIM1_LEN  10
19#define DIM2_NAME "dim2"
20#define DIM2_LEN  20
21#define DIM3_NAME "dim3"
22#define DIM3_LEN  30
23#define VAR1_NAME "var1"
24#define VAR1_RANK 1
25#define VAR2_NAME "var2"
26#define VAR2_RANK 2
27#define VAR3_NAME "var3"
28#define VAR3_RANK 3
29#define VAR4_NAME "var4"
30#define VAR4_RANK 3
31#define CHUNK1 (DIM1_LEN/2 + 1)
32#define CHUNK2 (DIM2_LEN/3 + 1)
33#define CHUNK3 (DIM3_LEN/4 + 1)
34#define DEFLATE_LEVEL 2
35#define COMPRESS 1
36#define TYPE6_NAME "obs_t"
37
38int
39main(int argc, char **argv)
40{
41   int ncid;
42   int ijkm;
43
44   int dimids[VAR3_RANK];
45   int var1idvar2idvar3idvar4idvar5id;
46   size_t chunksizes[] = {CHUNK1CHUNK2CHUNK3};
47   int data1[DIM1_LEN];
48   int data1_in[DIM1_LEN];
49   int data2[DIM1_LEN][DIM2_LEN];
50   int data2_in[DIM1_LEN][DIM2_LEN];
51   int data3[DIM1_LEN][DIM2_LEN][DIM3_LEN];
52   int data3_in[DIM1_LEN][DIM2_LEN][DIM3_LEN];
53
54   printf("\n*** Testing '-s' option for special attributes.\n");
55   printf("*** creating special attributes test file %s...", FILE_NAME);
56   if (nc_create(FILE_NAMENC_CLOBBER | NC_NETCDF4, &ncid)) ERR;
57
58   /* Declare dimensions and variables */
59   if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
60   if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
61   if (nc_def_dim(ncidDIM3_NAMEDIM3_LEN, &dimids[2])) ERR;
62   if (nc_def_var(ncidVAR1_NAMENC_INTVAR1_RANKdimids, &var1id)) ERR;
63   if (nc_def_var(ncidVAR2_NAMENC_INTVAR2_RANKdimids, &var2id)) ERR;
64   if (nc_def_var(ncidVAR3_NAMENC_INTVAR3_RANKdimids, &var3id)) ERR;
65   if (nc_def_var(ncidVAR4_NAMENC_INTVAR4_RANKdimids, &var4id)) ERR;
66   {
67
68       typedef struct obs_t {
69    char day;
70    short elev;
71    int count;
72    float relhum;
73    double time;
74    unsigned char category;
75    unsigned short id;
76    unsigned int particularity;
77    long long attention_span;
78       } obs_t ;
79       nc_type typeid;
80
81       /* Create a compound type. */
82       if (nc_def_compound(ncid, sizeof(obs_t), TYPE6_NAME, &typeid)) ERR;
83       if (nc_insert_compound(ncidtypeid, "day",
84       NC_COMPOUND_OFFSET(struct obs_tday), NC_BYTE)) ERR;
85       if (nc_insert_compound(ncidtypeid, "elev",
86       NC_COMPOUND_OFFSET(struct obs_telev), NC_SHORT)) ERR;
87       if (nc_insert_compound(ncidtypeid, "count",
88       NC_COMPOUND_OFFSET(struct obs_tcount), NC_INT)) ERR;
89       if (nc_insert_compound(ncidtypeid, "relhum",
90       NC_COMPOUND_OFFSET(struct obs_trelhum),
91       NC_FLOAT)) ERR;
92       if (nc_insert_compound(ncidtypeid, "time",
93       NC_COMPOUND_OFFSET(struct obs_t, time),
94       NC_DOUBLE)) ERR;
95       if (nc_insert_compound(ncidtypeid, "category",
96       NC_COMPOUND_OFFSET(struct obs_tcategory),
97       NC_UBYTE)) ERR;
98       if (nc_insert_compound(ncidtypeid, "id",
99       NC_COMPOUND_OFFSET(struct obs_tid),
100       NC_USHORT)) ERR;
101       if (nc_insert_compound(ncidtypeid, "particularity",
102       NC_COMPOUND_OFFSET(struct obs_tparticularity),
103       NC_UINT)) ERR;
104       if (nc_insert_compound(ncidtypeid, "attention_span",
105       NC_COMPOUND_OFFSET(struct obs_tattention_span),
106       NC_INT64)) ERR;
107       /* create a variable of that compound type */
108       if (nc_def_var(ncid, "var5", typeidVAR1_RANKdimids, &var5id))
109    ERR;
110   }
111
112   /* Specify contiguous storage and endianness explicitly for var1. */
113   if (nc_def_var_chunking(ncidvar1idNC_CONTIGUOUSNULL)) ERR;
114   if (nc_def_var_endian(ncidvar1idNC_ENDIAN_LITTLE)) ERR;
115
116   /* Specify chunking for var2, note only uses CHUNK1 and CHUNK2.
117      Also, specify using a checksum for this variable. */
118   if (nc_def_var_chunking(ncidvar2idNC_CHUNKEDchunksizes)) ERR;
119   if (nc_def_var_fletcher32(ncidvar2idNC_FLETCHER32)) ERR;
120   if (nc_def_var_endian(ncidvar2idNC_ENDIAN_BIG)) ERR;
121
122   /* Use compression but no shuffle for var3, also set to big endian */
123   if (nc_def_var_deflate(ncidvar3idNC_NOSHUFFLECOMPRESSDEFLATE_LEVEL)) ERR;
124   if (nc_def_var_chunking(ncidvar3idNC_CHUNKEDchunksizes)) ERR;
125   if (nc_def_var_endian(ncidvar3idNC_ENDIAN_LITTLE)) ERR;
126
127   /* Use compression, chunking, shuffle filter, and no-fill for var4 */
128   if (nc_def_var_deflate(ncidvar4idNC_SHUFFLECOMPRESSDEFLATE_LEVEL)) ERR;
129   if (nc_def_var_chunking(ncidvar4idNC_CHUNKEDchunksizes)) ERR;
130   if (nc_def_var_endian(ncidvar4idNC_ENDIAN_LITTLE)) ERR;
131   if (nc_def_var_fill(ncidvar4idNC_NOFILLNULL)) ERR;
132
133   /* Set endianness, chunking, checksums, shuffle, and compression for var5 */
134   if (nc_def_var_chunking(ncidvar5idNC_CHUNKEDchunksizes)) ERR;
135   if (nc_def_var_fletcher32(ncidvar5idNC_FLETCHER32)) ERR;
136   if (nc_def_var_deflate(ncidvar5idNC_SHUFFLECOMPRESSDEFLATE_LEVEL)) ERR;
137
138   if (nc_enddef(ncid)) ERR;
139
140   /* Some artificial data */
141   m = 0;
142   for(i = 0; i < DIM1_LENi++) {
143       data1[i] = m++;
144       for(j = 0; j < DIM2_LENj++) {
145    data2[i][j] = m++;
146    for(k = 0; k < DIM3_LENk++) {
147        data3[i][j][k] = m++;
148    }
149       }
150   }
151
152   /* Store data in each variable */
153   if(nc_put_var(ncidvar1id, &data1[0])) ERR;
154   if(nc_put_var(ncidvar2id, &data2[0][0])) ERR;
155   if(nc_put_var(ncidvar3id, &data3[0][0][0])) ERR;
156   if(nc_put_var(ncidvar4id, &data3[0][0][0])) ERR;
157
158   if (nc_close(ncid)) ERR;
159
160   /* Check it out. */
161   if (nc_open(FILE_NAMENC_NOWRITE, &ncid)) ERR;
162   if (nc_inq_varid(ncidVAR1_NAME, &var1id)) ERR;
163   if (nc_inq_varid(ncidVAR2_NAME, &var2id)) ERR;
164   if (nc_inq_varid(ncidVAR3_NAME, &var3id)) ERR;
165   if (nc_inq_varid(ncidVAR4_NAME, &var4id)) ERR;
166
167   /* Check chunk sizes */
168   {
169       size_t chunks_in[VAR3_RANK];
170       if (nc_inq_var_chunking(ncidvar2idNULLchunks_in)) ERR;
171       for(i = 0; i < VAR2_RANKi++)
172    if(chunks_in[i] != chunksizes[i]) ERR;
173       if (nc_inq_var_chunking(ncidvar3idNULLchunks_in)) ERR;
174       for(i = 0; i < VAR3_RANKi++)
175    if(chunks_in[i] != chunksizes[i]) ERR;
176       if (nc_inq_var_chunking(ncidvar4idNULLchunks_in)) ERR;
177       for(i = 0; i < VAR4_RANKi++)
178    if(chunks_in[i] != chunksizes[i]) ERR;
179   }
180   if(nc_get_var(ncidvar1id, &data1_in[0])) ERR;
181   for(i = 0; i < DIM1_LENi++)
182       if(data1_in[i] != data1[i]) ERR;
183
184   if(nc_get_var(ncidvar2id, &data2_in[0][0])) ERR;
185   for(i = 0; i < DIM1_LENi++)
186       for(j = 0; j < DIM2_LENj++)
187    if(data2_in[i][j] != data2[i][j]) ERR;
188
189   if(nc_get_var(ncidvar3id, &data3_in[0][0][0])) ERR;
190   for(i = 0; i < DIM1_LENi++)
191       for(j = 0; j < DIM2_LENj++)
192    for(k = 0; k < DIM3_LENk++)
193        if(data3_in[i][j][k] != data3[i][j][k]) ERR;
194
195   if(nc_get_var(ncidvar4id, &data3_in[0][0][0])) ERR;
196   for(i = 0; i < DIM1_LENi++)
197       for(j = 0; j < DIM2_LENj++)
198    for(k = 0; k < DIM3_LENk++)
199        if(data3_in[i][j][k] != data3[i][j][k]) ERR;
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