1#include <stdio.h>
2#include <stdlib.h>
3#include <netcdf.h>
4
5
6#define Clear ((unsigned char)0)
7#define Cumulonimbus ((unsigned char)1)
8#define Stratus ((unsigned char)2)
9typedef unsigned char enum_t;
10typedef unsigned char opaque_t[11];
11typedef nc_vlen_t vlen_t;
12typedef struct g_cmpd_t {
13    vlen_t f1;
14    enum_t f2;
15g_cmpd_t;
16
17
18void
19check_err(const int stat, const int line, const char *file) {
20    if (stat != NC_NOERR) {
21        (void)fprintf(stderr,"line %d of %s: %s\n", linefilenc_strerror(stat));
22        fflush(stderr);
23        exit(1);
24    }
25}
26
27int
28main() {/* create tst_diskless2.nc */
29
30    int  stat;  /* return status */
31    int  ncid;  /* netCDF id */
32
33    /* group ids */
34    int root_grp;
35    int g_grp;
36    int h_grp;
37
38    /* type ids */
39    int enum_t_typ;
40    int opaque_t_typ;
41    int vlen_t_typ;
42    int g_cmpd_t_typ;
43
44    /* dimension ids */
45    int lat_dim;
46    int lon_dim;
47    int time_dim;
48
49    /* dimension lengths */
50    size_t lat_len = 10;
51    size_t lon_len = 5;
52    size_t time_len = NC_UNLIMITED;
53
54    /* variable ids */
55    int lat_id;
56    int lon_id;
57    int time_id;
58    int Z_id;
59    int t_id;
60    int p_id;
61    int rh_id;
62    int country_id;
63    int tag_id;
64    int h_compoundvar_id;
65
66    /* rank (number of dimensions) for each variable */
67#   define RANK_lat 1
68#   define RANK_lon 1
69#   define RANK_time 1
70#   define RANK_Z 3
71#   define RANK_t 3
72#   define RANK_p 3
73#   define RANK_rh 3
74#   define RANK_country 3
75#   define RANK_tag 0
76#   define RANK_h_compoundvar 0
77
78    /* variable shapes */
79    int lat_dims[RANK_lat];
80    int lon_dims[RANK_lon];
81    int time_dims[RANK_time];
82    int Z_dims[RANK_Z];
83    int t_dims[RANK_t];
84    int p_dims[RANK_p];
85    int rh_dims[RANK_rh];
86    int country_dims[RANK_country];
87
88    /* enter define mode */
89    stat = nc_create("tst_diskless2.nc", NC_DISKLESS|NC_WRITE|NC_CLOBBER|NC_NETCDF4, &ncid);
90    check_err(stat,__LINE__,__FILE__);
91    root_grp = ncid;
92    stat = nc_def_grp(root_grp, "g", &g_grp);
93    check_err(stat,__LINE__,__FILE__);
94    stat = nc_def_grp(root_grp, "h", &h_grp);
95    check_err(stat,__LINE__,__FILE__);
96
97    {
98    unsigned char econst;
99    stat = nc_def_enum(root_grpNC_UBYTE, "enum_t", &enum_t_typ);
100    check_err(stat,__LINE__,__FILE__);
101    econst = 0;
102    stat = nc_insert_enum(root_grpenum_t_typ, "Clear", &econst);
103    check_err(stat,__LINE__,__FILE__);
104    econst = 1;
105    stat = nc_insert_enum(root_grpenum_t_typ, "Cumulonimbus", &econst);
106    check_err(stat,__LINE__,__FILE__);
107    econst = 2;
108    stat = nc_insert_enum(root_grpenum_t_typ, "Stratus", &econst);
109    check_err(stat,__LINE__,__FILE__);
110    }
111
112    stat = nc_def_opaque(root_grp, 11, "opaque_t", &opaque_t_typ);
113    check_err(stat,__LINE__,__FILE__);
114
115    stat = nc_def_vlen(root_grp, "vlen_t", NC_INT, &vlen_t_typ);    check_err(stat,__LINE__,__FILE__);
116
117    stat = nc_def_compound(g_grp, sizeof(g_cmpd_t), "cmpd_t", &g_cmpd_t_typ);    check_err(stat,__LINE__,__FILE__);
118    {
119    stat = nc_insert_compound(g_grpg_cmpd_t_typ, "f1", NC_COMPOUND_OFFSET(g_cmpd_t,f1), vlen_t_typ);    check_err(stat,__LINE__,__FILE__);
120    stat = nc_insert_compound(g_grpg_cmpd_t_typ, "f2", NC_COMPOUND_OFFSET(g_cmpd_t,f2), enum_t_typ);    check_err(stat,__LINE__,__FILE__);
121    }
122
123
124    /* define dimensions */
125    stat = nc_def_dim(root_grp, "lat", lat_len, &lat_dim);
126    check_err(stat,__LINE__,__FILE__);
127    stat = nc_def_dim(root_grp, "lon", lon_len, &lon_dim);
128    check_err(stat,__LINE__,__FILE__);
129    stat = nc_def_dim(root_grp, "time", time_len, &time_dim);
130    check_err(stat,__LINE__,__FILE__);
131
132    /* define variables */
133
134    lat_dims[0] = lat_dim;
135    stat = nc_def_var(root_grp, "lat", NC_INTRANK_latlat_dims, &lat_id);
136    check_err(stat,__LINE__,__FILE__);
137
138    lon_dims[0] = lon_dim;
139    stat = nc_def_var(root_grp, "lon", NC_INTRANK_lonlon_dims, &lon_id);
140    check_err(stat,__LINE__,__FILE__);
141
142    time_dims[0] = time_dim;
143    stat = nc_def_var(root_grp, "time", NC_INTRANK_timetime_dims, &time_id);
144    check_err(stat,__LINE__,__FILE__);
145
146    Z_dims[0] = time_dim;
147    Z_dims[1] = lat_dim;
148    Z_dims[2] = lon_dim;
149    stat = nc_def_var(root_grp, "Z", NC_FLOATRANK_ZZ_dims, &Z_id);
150    check_err(stat,__LINE__,__FILE__);
151
152    t_dims[0] = time_dim;
153    t_dims[1] = lat_dim;
154    t_dims[2] = lon_dim;
155    stat = nc_def_var(root_grp, "t", NC_FLOATRANK_tt_dims, &t_id);
156    check_err(stat,__LINE__,__FILE__);
157
158    p_dims[0] = time_dim;
159    p_dims[1] = lat_dim;
160    p_dims[2] = lon_dim;
161    stat = nc_def_var(root_grp, "p", NC_DOUBLERANK_pp_dims, &p_id);
162    check_err(stat,__LINE__,__FILE__);
163
164    rh_dims[0] = time_dim;
165    rh_dims[1] = lat_dim;
166    rh_dims[2] = lon_dim;
167    stat = nc_def_var(root_grp, "rh", NC_INTRANK_rhrh_dims, &rh_id);
168    check_err(stat,__LINE__,__FILE__);
169
170    country_dims[0] = time_dim;
171    country_dims[1] = lat_dim;
172    country_dims[2] = lon_dim;
173    stat = nc_def_var(root_grp, "country", NC_STRINGRANK_countrycountry_dims, &country_id);
174    check_err(stat,__LINE__,__FILE__);
175
176    stat = nc_def_var(root_grp, "tag", NC_UBYTERANK_tag, 0, &tag_id);
177    check_err(stat,__LINE__,__FILE__);
178
179    stat = nc_def_var(h_grp, "compoundvar", g_cmpd_t_typRANK_h_compoundvar, 0, &h_compoundvar_id);
180    check_err(stat,__LINE__,__FILE__);
181
182    /* assign global attributes */
183
184    {
185    static const int vlen_2[] = {17, 18, 19} ;
186    static const vlen_t globalatt_att[1] = {{3, (void*)vlen_2}} ;
187    stat = nc_put_att(root_grpNC_GLOBAL, "globalatt", vlen_t_typ, 1, globalatt_att);
188    check_err(stat,__LINE__,__FILE__);
189    }
190
191
192    /* assign per-variable attributes */
193
194    {
195    stat = nc_put_att_text(root_grplat_id, "long_name", 8, "latitude");
196    check_err(stat,__LINE__,__FILE__);
197    }
198
199    {
200    stat = nc_put_att_text(root_grplat_id, "units", 13, "degrees_north");
201    check_err(stat,__LINE__,__FILE__);
202    }
203
204    {
205    stat = nc_put_att_text(root_grplon_id, "long_name", 9, "longitude");
206    check_err(stat,__LINE__,__FILE__);
207    }
208
209    {
210    stat = nc_put_att_text(root_grplon_id, "units", 12, "degrees_east");
211    check_err(stat,__LINE__,__FILE__);
212    }
213
214    {
215    stat = nc_put_att_text(root_grptime_id, "units", 31, "seconds since 1992-1-1 00:00:00");
216    check_err(stat,__LINE__,__FILE__);
217    }
218
219    {
220    static const char* Z_units_att[1] = {"geopotential meters"} ;
221    stat = nc_put_att_string(root_grpZ_id, "units", 1, Z_units_att);    check_err(stat,__LINE__,__FILE__);
222    }
223
224    {
225    static const float Z_valid_range_att[2] = {((float)0), ((float)5000)} ;
226    stat = nc_put_att_float(root_grpZ_id, "valid_range", NC_FLOAT, 2, Z_valid_range_att);
227    check_err(stat,__LINE__,__FILE__);
228    }
229
230    {
231    static const double p_FillValue_att[1] = {((double)-9999)} ;
232    stat = nc_put_att_double(root_grpp_id, "_FillValue", NC_DOUBLE, 1, p_FillValue_att);
233    check_err(stat,__LINE__,__FILE__);
234    }
235
236    {
237    static const int rh_FillValue_att[1] = {-1} ;
238    stat = nc_put_att_int(root_grprh_id, "_FillValue", NC_INT, 1, rh_FillValue_att);
239    check_err(stat,__LINE__,__FILE__);
240    }
241
242
243    /* leave define mode */
244    stat = nc_enddef (root_grp);
245    check_err(stat,__LINE__,__FILE__);
246
247    /* assign variable data */
248
249    {
250    int lat_data[10] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90} ;
251    size_t lat_startset[1] = {0} ;
252    size_t lat_countset[1] = {10};
253    stat = nc_put_vara(root_grplat_idlat_startsetlat_countsetlat_data);
254    check_err(stat,__LINE__,__FILE__);
255    }
256
257
258    {
259    int lon_data[5] = {-140, -118, -96, -84, -52} ;
260    size_t lon_startset[1] = {0} ;
261    size_t lon_countset[1] = {5};
262    stat = nc_put_vara(root_grplon_idlon_startsetlon_countsetlon_data);
263    check_err(stat,__LINE__,__FILE__);
264    }
265
266
267    {
268    static const int vlen_10[] = {3, 4, 5} ;
269    size_t zero = 0;
270    static g_cmpd_t h_compoundvar_data[1] = {{{3, (void*)vlen_10}, 2}};
271    stat = nc_put_var1(h_grph_compoundvar_id, &zeroh_compoundvar_data);
272    check_err(stat,__LINE__,__FILE__);
273    }
274
275
276    stat = nc_close(root_grp);
277    check_err(stat,__LINE__,__FILE__);
278    return 0;
279}


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