1/* This is part of the netCDF package. Copyright 2005-2007, University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use.
4
5   This program creates some test files which ncdump will read. This
6   is only done if netCDF-4 is enabled.
7
8   $Id: tst_create_files.c,v 1.16 2008/10/20 01:48:08 ed Exp $
9*/
10
11#include <nc_tests.h>
12#include "err_macros.h"
13#include <netcdf.h>
14#include <stdlib.h>
15
16#define FILE_NAME_1 "tst_solar_1.nc"
17#define FILE_NAME_2 "tst_solar_2.nc"
18#define FILE_NAME_CMP "tst_solar_cmp.nc"
19#define SOLAR_SYSTEM "solar_system"
20#define EARTH "Earth"
21#define LUNA "Luna"
22#define ATT_NAME "Vogon_Poem"
23#define VLEN_TYPE_NAME "unimaginatively_named_vlen_type"
24
25/* http://www.bbc.co.uk/cult/hitchhikers/vogonpoetry/lettergen.shtml */
26static char *poem = {
27"See, see the netCDF-filled sky\n\
28Marvel at its big barf-green depths.\n\
29Tell me, Ed do you\n\
30Wonder why the yellow-bellied Snert ignores you?\n\
31Why its foobly stare\n\
32makes you feel ubiquitous obliquity.\n\
33I can tell you, it is\n\
34Worried by your HDF5-eating facial growth\n\
35That looks like\n\
36A moldy pile of ASCII data.\n\
37What's more, it knows\n\
38Your redimensioning potting shed\n\
39Smells of booger.\n\
40Everything under the big netCDF-filled sky\n\
41Asks why, why do you even bother?\n\
42You only charm software defects."
43};
44
45#define ATT_LEN 3
46#define UCHAR_ATT_NAME "Number_of_vogons"
47#define ULONGLONG_ATT_NAME "Number_of_vogon_poems"
48#define LONGLONG_ATT_NAME "alien_concept_number_which_cannot_be_understood_by_humans"
49#define DIM_NAME "length_of_name"
50#define VAR_NAME "var_name"
51#define DIM_LEN 2
52
53int
54main(int argc, char **argv)
55{
56   /* These values will be written in various places. */
57   unsigned char num_vogons[ATT_LEN] = {2, 23, 230};
58   unsigned long long num_poems[ATT_LEN] = {23232244LL, 1214124123423LL, 2353424234LL};
59   long long alien[ATT_LEN] = {-23232244LL, 1214124123423LL, -2353424234LL};
60   long long data[DIM_LEN] = {42LL, -42LL};
61
62   printf("\n*** Creating test files for ncdump.\n");
63   /*nc_set_log_level(4);*/
64
65   printf("*** creating nested group file %s...", FILE_NAME_1);
66   {
67      int ncidsolar_system_iddimidvarid;
68      int earth_idluna_id;
69
70      /* Create a file with nested groups. */
71      if (nc_create(FILE_NAME_1NC_NETCDF4, &ncid)) ERR;
72      if (nc_def_grp(ncidSOLAR_SYSTEM, &solar_system_id)) ERR;
73      if (nc_def_grp(solar_system_idEARTH, &earth_id)) ERR;
74      if (nc_def_grp(earth_idLUNA, &luna_id)) ERR;
75
76      /* Put some attributes in the root group. */
77      if (nc_put_att_uchar(ncidNC_GLOBALUCHAR_ATT_NAMENC_UBYTE,
78    ATT_LENnum_vogons)) ERR;
79      if (nc_put_att_ulonglong(ncidNC_GLOBALULONGLONG_ATT_NAME,
80        NC_UINT64ATT_LENnum_poems)) ERR;
81
82      /* Put a dimension in the root group. */
83      if (nc_def_dim(ncidDIM_NAMEDIM_LEN, &dimid)) ERR;
84
85      /* Put an attribute in the Earth group. */
86      if (nc_put_att_longlong(earth_idNC_GLOBALLONGLONG_ATT_NAMENC_INT64,
87       ATT_LENalien)) ERR;
88
89      /* Put an attribute in the bottom group. */
90      if (nc_put_att_text(luna_idNC_GLOBALATT_NAME,
91   strlen(poem) + 1, poem)) ERR;
92
93      /* Put a variable in the bottom group. */
94      if (nc_def_var(luna_idVAR_NAMENC_INT64, 1, &dimid, &varid)) ERR;
95      if (nc_put_var_longlong(luna_idvariddata)) ERR;
96
97      if (nc_close(ncid)) ERR;
98
99   }
100
101   SUMMARIZE_ERR;
102   printf("*** checking nested group file %s...", FILE_NAME_1);
103#define CHAR_ATT_MAX 3000
104
105   {
106      int ncidsolar_system_id;
107      int earth_idluna_id;
108      int numgrps_in;
109      unsigned char uchar_in[ATT_LEN];
110      unsigned long long ulonglong_in[ATT_LEN];
111      long long longlong_in[ATT_LEN], data_in[DIM_LEN];
112      char char_in[CHAR_ATT_MAX], name_in[NC_MAX_NAME + 1];
113      int varid_indimid_inndims_innatts_indimid_in_2nvars_in;
114      size_t len_in;
115      nc_type xtype_in;
116      int i;
117
118      /* Oh well, might as well check this file. It will also be
119       * checked by ncdump tests. */
120      if (nc_open(FILE_NAME_1NC_NOWRITE, &ncid)) ERR;
121
122      /* Check nested groups. */
123      if (nc_inq_grps(ncid, &numgrps_in, &solar_system_id)) ERR;
124      if (numgrps_in != 1) ERR;
125      if (nc_inq_grps(solar_system_id, &numgrps_in, &earth_id)) ERR;
126      if (numgrps_in != 1) ERR;
127      if (nc_inq_grps(earth_id, &numgrps_in, &luna_id)) ERR;
128      if (numgrps_in != 1) ERR;
129      if (nc_inq_grps(luna_id, &numgrps_inNULL)) ERR;
130      if (numgrps_in != 0) ERR;
131
132      /* Check some attributes in the root group. */
133      if (nc_inq_att(ncidNC_GLOBALUCHAR_ATT_NAME, &xtype_in,
134      &len_in)) ERR;
135      if (xtype_in != NC_UBYTE || len_in != ATT_LENERR;
136      if (nc_get_att_uchar(ncidNC_GLOBALUCHAR_ATT_NAMEuchar_in)) ERR;
137      for (i = 0; i < ATT_LENi++)
138  if (uchar_in[i] != num_vogons[i]) ERR;
139
140      if (nc_inq_att(ncidNC_GLOBALULONGLONG_ATT_NAME, &xtype_in,
141      &len_in)) ERR;
142      if (xtype_in != NC_UINT64 || len_in != ATT_LENERR;
143      if (nc_get_att_ulonglong(ncidNC_GLOBALULONGLONG_ATT_NAMEulonglong_in)) ERR;
144      for (i = 0; i < ATT_LENi++)
145  if (ulonglong_in[i] != num_poems[i]) ERR;
146
147      /* Check a dimension in the root group. */
148      if (nc_inq_dimids(ncid, &ndims_in, &dimid_in, 0)) ERR;
149      if (ndims_in != 1) ERR;
150      if (nc_inq_dim(nciddimid_inname_in, &len_in)) ERR;
151      if (strcmp(name_inDIM_NAME) || len_in != DIM_LENERR;
152
153      /* Check an attribute in the Earth group. */
154      if (nc_inq_att(earth_idNC_GLOBALLONGLONG_ATT_NAME, &xtype_in,
155      &len_in)) ERR;
156      if (xtype_in != NC_INT64 || len_in != ATT_LENERR;
157      if (nc_get_att_longlong(earth_idNC_GLOBALLONGLONG_ATT_NAME,
158       longlong_in)) ERR;
159      for (i = 0; i < ATT_LENi++)
160  if (longlong_in[i] != alien[i]) ERR;
161
162      /* Check an attribute in the bottom group. */
163      if (nc_inq_att(luna_idNC_GLOBALATT_NAME, &xtype_in,
164      &len_in)) ERR;
165      if (xtype_in != NC_CHAR || len_in != strlen(poem) + 1 ||
166   len_in > CHAR_ATT_MAXERR;
167      if (nc_get_att_text(luna_idNC_GLOBALATT_NAMEchar_in)) ERR;
168      char_in[len_in] = '\0'; /* null terminate, because nc_get_att_text doesn't */
169      if (strcmp(char_inpoem)) ERR;
170
171      /* Check a variable in the bottom group. */
172      if (nc_inq_varids(luna_id, &nvars_in, &varid_in)) ERR;
173      if (nc_inq_var(luna_idvarid_inname_in, &xtype_in, &ndims_in,
174      &dimid_in_2, &natts_in)) ERR;
175      if (strcmp(name_inVAR_NAME) || xtype_in != NC_INT64 ||
176   ndims_in != 1 || dimid_in_2 != dimid_in || natts_in != 0) ERR;
177      if (nc_get_var_longlong(luna_idvarid_indata_in)) ERR;
178      for (i = 0; i < DIM_LENi++)
179  if (data_in[i] != data[i]) ERR;
180
181      if (nc_close(ncid)) ERR;
182
183   }
184
185   SUMMARIZE_ERR;
186   printf("*** creating file with VLEN %s...", FILE_NAME_2);
187#define ATT_NAME2 "equally_unimaginatively_named_attribute_YAWN"
188#define ATT_NAME3 "for_testing_unsigned_short_attribute_bug"
189   {
190      int ncid;
191      int ij;
192      nc_type typeid;
193      nc_vlen_t data[DIM_LEN];
194      int *phoney;
195      unsigned short us_att[ATT_LEN] = {0, 32768, 65535};
196
197      /* Create phoney data. */
198      for (i=0; i<DIM_LENi++)
199      {
200  if (!(phoney = (int *)malloc(sizeof(int) * (i+1))))
201     return NC_ENOMEM;
202  for (j=0; j<i+1; j++)
203     phoney[j] = -99;
204  data[i].p = phoney;
205  data[i].len = i+1;
206      }
207
208      /* Create a file with a VLEN attribute. */
209      if (nc_create(FILE_NAME_2NC_NETCDF4, &ncid)) ERR;
210
211      if (nc_def_vlen(ncidVLEN_TYPE_NAMENC_INT, &typeid)) ERR;
212      if (nc_put_att(ncidNC_GLOBALATT_NAME2typeidDIM_LENdata)) ERR;
213
214      /* Test fix of ncdump bug displaying unsigned short attributes */
215      if (nc_put_att(ncidNC_GLOBALATT_NAME3NC_USHORTATT_LENus_att)) ERR;
216
217      if (nc_close(ncid)) ERR;
218
219      /* Free the memory used in our phoney data. */
220      for (i=0; i<DIM_LENi++)
221  free(data[i].p);
222   }
223
224   SUMMARIZE_ERR;
225   printf("*** creating file with compound type %s...", FILE_NAME_CMP);
226#define ATT_NAME_CMP "my_favorite_wind_speeds"
227#define COMPOUND_NAME "wind_vector"
228#define NUM_FAVS 3
229#define U_VALUE 13.3
230#define V_VALUE 12.2
231
232   {
233      int ncid;
234
235      /* Store winds as two floats: the u and v components of the wind. */
236      struct wind_vector
237      {
238     float uv;
239      } favs[NUM_FAVS];
240      nc_type typeid;
241      int fav;
242
243      /* Create some fake data... */
244      for (fav = 0; fav < NUM_FAVSfav++)
245      {
246  favs[fav].u = U_VALUE;
247  favs[fav].v = V_VALUE;
248      }
249
250      /* Create a file with a compound attribute. */
251      if (nc_create(FILE_NAME_CMPNC_NETCDF4, &ncid)) ERR;
252
253      if (nc_def_compound(ncid, sizeof(struct wind_vector), COMPOUND_NAME,
254   &typeid)) ERR;
255      if (nc_insert_compound(ncidtypeid, "u", NC_COMPOUND_OFFSET(struct wind_vectoru),
256      NC_FLOAT)) ERR;
257      if (nc_insert_compound(ncidtypeid, "v", NC_COMPOUND_OFFSET(struct wind_vectorv),
258      NC_FLOAT)) ERR;
259      if (nc_put_att(ncidNC_GLOBALATT_NAME_CMPtypeidNUM_FAVSfavs)) ERR;
260
261      if (nc_close(ncid)) ERR;
262   }
263
264   SUMMARIZE_ERR;
265
266   FINAL_RESULTS;
267}


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