1/* This is part of the netCDF package. Copyright 2005 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 a compound type and compound data for ncdump to read.
6
7   $Id: tst_comp.c,v 1.7 2008/10/20 01:48:08 ed Exp $
8*/
9
10
11#include <nc_tests.h>
12#include "err_macros.h"
13#include <netcdf.h>
14#include <string.h>
15
16#define FILE6_NAME "tst_comp.nc"
17#define TYPE6_NAME "obs_t"
18#define DIM6_NAME "n"
19#define DIM6_LEN 3
20#define VAR6_NAME "obs"
21#define VAR6_RANK 1
22#define ATT6_NAME "_FillValue"
23#define ATT6_LEN  1
24
25int
26main(int argc, char **argv)
27{
28   int ncid;
29   int dimidvarid;
30   nc_type typeid;
31   char name_in[NC_MAX_NAME+1];
32   int i;
33
34   int var_dims[VAR6_RANK];
35
36   typedef struct obs_t {
37       char day;
38       short elev;
39       int count;
40       float relhum;
41       double time;
42       unsigned char category;
43       unsigned short id;
44       unsigned int particularity;
45       long long attention_span;
46   } obs_t ;
47
48   obs_t obsdata[DIM6_LEN] = {
49       {15, 2, 1, 0.5, 3600.01, 0, 0, 0, 0LL},
50       {-99, -99, -99, -99.0f, -99.0, 255, 65535, 4294967295U,
51 -9223372036854775806LL},
52       {20, 6, 3, 0.75, 5000.01, 200, 64000, 4220002000U, 9000000000000000000LL }
53   };
54
55   obs_t missing_val = {-99, -99, -99, -99, -99, 255, 65535, 4294967295U,
56 -9223372036854775806LL};
57   obs_t val_in;
58   size_t size_in;
59   size_t nfields_in;
60   nc_type class_in;
61
62   printf("\n*** Testing compound types.\n");
63   printf("*** creating compound test file %s...", FILE6_NAME);
64   if (nc_create(FILE6_NAMENC_CLOBBER | NC_NETCDF4, &ncid)) ERR;
65
66   /* Create a compound type. */
67   if (nc_def_compound(ncid, sizeof(obs_t), TYPE6_NAME, &typeid)) ERR;
68   if (nc_insert_compound(ncidtypeid, "day",
69   NC_COMPOUND_OFFSET(struct obs_tday), NC_BYTE)) ERR;
70   if (nc_insert_compound(ncidtypeid, "elev",
71   NC_COMPOUND_OFFSET(struct obs_telev), NC_SHORT)) ERR;
72   if (nc_insert_compound(ncidtypeid, "count",
73   NC_COMPOUND_OFFSET(struct obs_tcount), NC_INT)) ERR;
74   if (nc_insert_compound(ncidtypeid, "relhum",
75   NC_COMPOUND_OFFSET(struct obs_trelhum),
76   NC_FLOAT)) ERR;
77   if (nc_insert_compound(ncidtypeid, "time",
78   NC_COMPOUND_OFFSET(struct obs_t, time),
79   NC_DOUBLE)) ERR;
80   if (nc_insert_compound(ncidtypeid, "category",
81   NC_COMPOUND_OFFSET(struct obs_tcategory),
82   NC_UBYTE)) ERR;
83   if (nc_insert_compound(ncidtypeid, "id",
84   NC_COMPOUND_OFFSET(struct obs_tid),
85   NC_USHORT)) ERR;
86   if (nc_insert_compound(ncidtypeid, "particularity",
87   NC_COMPOUND_OFFSET(struct obs_tparticularity),
88   NC_UINT)) ERR;
89   if (nc_insert_compound(ncidtypeid, "attention_span",
90   NC_COMPOUND_OFFSET(struct obs_tattention_span),
91   NC_INT64)) ERR;
92
93   /* Declare a dimension for number of obs */
94   if (nc_def_dim(ncidDIM6_NAMEDIM6_LEN, &dimid)) ERR;
95
96   /* Declare a variable of the compound type */
97   var_dims[0] = dimid;
98   if (nc_def_var(ncidVAR6_NAMEtypeidVAR6_RANKvar_dims, &varid)) ERR;
99
100   /* Create and write a variable attribute of the compound type */
101   if (nc_put_att(ncidvaridATT6_NAMEtypeidATT6_LEN, (void *) &missing_val)) ERR;
102   if (nc_enddef(ncid)) ERR;
103
104   /* Store data, writing all values in one call */
105   if(nc_put_var(ncidvaridobsdata)) ERR;
106
107   /* Write the file. */
108   if (nc_close(ncid)) ERR;
109
110   /* Check it out. */
111
112   /* Reopen the file. */
113   if (nc_open(FILE6_NAMENC_NOWRITE, &ncid)) ERR;
114
115   /* Get info with the generic inquire for user-defined types */
116   if (nc_inq_user_type(ncidtypeidname_inNULLNULL,
117 NULL, &class_in)) ERR;
118   if (strcmp(name_inTYPE6_NAME) ||
119       class_in != NC_COMPOUNDERR;
120
121   /* Get the same info with the compound-specific inquire function */
122   if (nc_inq_compound(ncidtypeidname_in, &size_in, &nfields_in)) ERR;
123   if (strcmp(name_inTYPE6_NAME) ||
124       size_in != sizeof(obs_t) ||
125       nfields_in != 9) ERR;
126
127   if (nc_inq_varid(ncidVAR6_NAME, &varid)) ERR;
128
129   /* Read in attribute value and check it */
130   if (nc_get_att(ncidvaridATT6_NAME, &val_in)) ERR;
131   if (val_in.day != missing_val.day ||
132       val_in.elev != missing_val.elev ||
133       val_in.count != missing_val.count ||
134       val_in.relhum != missing_val.relhum ||
135       val_in.time != missing_val.time ||
136       val_in.category != missing_val.category ||
137       val_in.id != missing_val.id ||
138       val_in.particularity != missing_val.particularity ||
139       val_in.attention_span != missing_val.attention_span ) ERR;
140
141   /* Read in each value and check */
142   for (i = 0; i < DIM6_LENi++) {
143       size_t index[VAR6_RANK];
144       index[0] = i;
145       if (nc_get_var1(ncidvaridindex, (void *) &val_in)) ERR;
146       if (val_in.day != obsdata[i].dayERR;
147       if (val_in.elev != obsdata[i].elevERR;
148       if (val_in.count != obsdata[i].countERR;
149       if (val_in.relhum != obsdata[i].relhumERR;
150       if (val_in.time != obsdata[i].time) ERR;
151       if (val_in.category != obsdata[i].categoryERR;
152       if (val_in.id != obsdata[i].idERR;
153       if (val_in.particularity != obsdata[i].particularityERR;
154       if (val_in.attention_span != obsdata[i].attention_spanERR;
155   }
156
157   if (nc_close(ncid)) ERR;
158
159   SUMMARIZE_ERR;
160   FINAL_RESULTS;
161}


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