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 array member of compound type and nested
6   compound data for ncdump to read.
7
8   $Id: tst_comp2.c,v 1.4 2008/10/20 01:48:08 ed Exp $
9*/
10
11
12#include <nc_tests.h>
13#include "err_macros.h"
14#include <netcdf.h>
15#include <string.h>
16
17#define FILE9_NAME "tst_comp2.nc"
18#define TYPE_NAME "vecmat_t"
19#define DIM_NAME "n"
20#define DIM_LEN 3
21#define VAR_NAME "obs"
22#define VAR_RANK 1
23#define ATT_NAME "_FillValue"
24#define ATT_LEN  1
25
26int
27main(int argc, char **argv)
28{
29   int ncid;
30   int dimidvarid;
31   nc_type typeid;
32   char name_in[NC_MAX_NAME+1];
33   int ijk;
34
35   int var_dims[VAR_RANK];
36
37#define VEC_LEN 3
38#define MAT_DIM0 2
39#define MAT_DIM1 3
40#define MON_LEN 3
41#define NFIELDS 4 /* number of fields in struct and compound type */
42   struct vecmat_t {
43       char dow;
44       char mon[MON_LEN];
45       short vec[VEC_LEN];
46       float mat[MAT_DIM0][MAT_DIM1];
47   };
48
49   struct vecmat_t data[DIM_LEN] = {
50       {
51    'S',
52    "jan",
53    {1, 2, 3},
54    {{4, 5, 6}, {7, 8, 9}}
55       },
56       {
57    'M',
58    "feb",
59    {11, 12, 13},
60    {{4.25, 5.25, 6.25}, {7.25, 8.25, 9.25}}
61       },
62       {
63    'T',
64    "mar",
65    {21, 22, 23},
66    {{4.5, 5.5, 6.5}, {7.5, 8.5, 9.5}}
67       }
68   };
69
70   struct vecmat_t missing_val = {
71       '?',
72       "---",
73       {-1, -2, -3},
74       {{-4.0f, -5.0f, -6.0f}, {-7.0f, -8.0f, -9.0f}}
75   };
76   struct vecmat_t val_in;
77   size_t size_in;
78   size_t nfields_in;
79   nc_type class_in;
80   int vec_sizes[] = {VEC_LEN};
81   int mat_sizes[] = {MAT_DIM0MAT_DIM1};
82   int mon_sizes[] = {MON_LEN};
83
84   printf("\n*** Testing compound types some more.\n");
85   printf("*** creating another compound test file %s...", FILE9_NAME);
86   if (nc_create(FILE9_NAMENC_CLOBBER | NC_NETCDF4, &ncid)) ERR;
87
88   /* Create a compound type. */
89   if (nc_def_compound(ncid, sizeof(struct vecmat_t), TYPE_NAME, &typeid)) ERR;
90   if (nc_insert_compound(ncidtypeid, "day",
91 NC_COMPOUND_OFFSET(struct vecmat_tdow),
92 NC_CHAR)) ERR;
93   if (nc_insert_array_compound(ncidtypeid, "mnth",
94 NC_COMPOUND_OFFSET(struct vecmat_tmon),
95 NC_CHAR, 1, mon_sizes)) ERR;
96   if (nc_insert_array_compound(ncidtypeid, "vect",
97 NC_COMPOUND_OFFSET(struct vecmat_tvec),
98 NC_SHORT, 1, vec_sizes)) ERR;
99   if (nc_insert_array_compound(ncidtypeid, "matr",
100 NC_COMPOUND_OFFSET(struct vecmat_tmat),
101 NC_FLOAT, 2, mat_sizes)) ERR;
102
103   /* Declare a dimension for number of obs */
104   if (nc_def_dim(ncidDIM_NAMEDIM_LEN, &dimid)) ERR;
105
106   /* Declare a variable of the compound type */
107   var_dims[0] = dimid;
108   if (nc_def_var(ncidVAR_NAMEtypeidVAR_RANKvar_dims, &varid)) ERR;
109
110   /* Create and write a variable attribute of the compound type */
111   if (nc_put_att(ncidvaridATT_NAMEtypeidATT_LEN, (void *) &missing_val)) ERR;
112   if (nc_enddef(ncid)) ERR;
113
114   /* Store data, writing all values in one call */
115   if(nc_put_var(ncidvariddata)) ERR;
116
117   /* Write the file. */
118   if (nc_close(ncid)) ERR;
119
120   /* Check it out. */
121
122   /* Reopen the file. */
123   if (nc_open(FILE9_NAMENC_NOWRITE, &ncid)) ERR;
124
125   /* Get info with the generic inquire for user-defined types */
126   if (nc_inq_user_type(ncidtypeidname_inNULLNULL,
127 NULL, &class_in)) ERR;
128   if (strcmp(name_inTYPE_NAME) ||
129       class_in != NC_COMPOUNDERR;
130
131   /* Get the same info with the compound-specific inquire function */
132   if (nc_inq_compound(ncidtypeidname_in, &size_in, &nfields_in)) ERR;
133   if (strcmp(name_inTYPE_NAME) ||
134       size_in != sizeof(struct vecmat_t) ||
135       nfields_in != NFIELDSERR;
136
137   if (nc_inq_varid(ncidVAR_NAME, &varid)) ERR;
138
139   /* Read in attribute value and check it */
140   if (nc_get_att(ncidvaridATT_NAME, &val_in)) ERR;
141   for(i=0; i < VEC_LENi++) {
142       if (val_in.vec[i] != missing_val.vec[i]) ERR;
143   }
144   for(i=0; i < MAT_DIM0i++) {
145       for(j=0; j < MAT_DIM1j++) {
146    if (val_in.mat[i][j] != missing_val.mat[i][j]) ERR;
147       }
148   }
149   for(i=0; i < MON_LENi++) {
150       if (val_in.mon[i] != missing_val.mon[i]) ERR;
151   }
152   /* Read in each value and check */
153   for (k = 0; k < DIM_LENk++) {
154       size_t index[VAR_RANK];
155       index[0] = k;
156       if (nc_get_var1(ncidvaridindex, (void *) &val_in)) ERR;
157       if (val_in.dow != data[k].dowERR;
158       for(i=0; i < MON_LENi++) {
159    if (val_in.mon[i] != data[k].mon[i]) ERR;
160       }
161       for(i=0; i < VEC_LENi++) {
162    if (val_in.vec[i] != data[k].vec[i]) ERR;
163       }
164       for(i=0; i < MAT_DIM0i++) {
165    for(j=0; j < MAT_DIM1j++) {
166        if (val_in.mat[i][j] != data[k].mat[i][j]) ERR;
167    }
168       }
169   }
170
171   if (nc_close(ncid)) ERR;
172
173   SUMMARIZE_ERR;
174   FINAL_RESULTS;
175}


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