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 vlen type and vlen data for ncdump to read.
6
7   $Id: tst_vlen_data.c,v 1.12 2009/11/15 00:17:59 dmh Exp $
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <netcdf.h>
13#include <stdlib.h>
14
15#define FILE5_NAME "tst_vlen_data.nc"
16#define TYPE5_NAME "row_of_floats"
17#define TYPE5_TYPE NC_FLOAT
18#define DIM5_NAME "m"
19#define DIM5_LEN 5
20#define VAR5_NAME "ragged_array"
21#define VAR5_RANK 1
22#define ATT5_NAME "_FillValue"
23#define ATT5_LEN  1
24#define NROWS 5
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   nc_type base_typeid;
34   size_t base_size_in;
35   int class_in;
36   float value_in;
37
38   int ij;
39
40   int var_dims[VAR5_RANK];
41   float **array; /* a ragged array */
42   nc_vlen_t ragged_data[DIM5_LEN];
43   float missing_value = -999.0;
44   nc_vlen_t missing_val;
45   nc_vlen_t val_in;
46
47   printf("\n*** Testing vlens.\n");
48   printf("*** creating vlen test file %s...", FILE5_NAME);
49   if (nc_create(FILE5_NAMENC_CLOBBER | NC_NETCDF4, &ncid)) ERR;
50
51   /* Create a vlen type. */
52   if (nc_def_vlen(ncidTYPE5_NAMETYPE5_TYPE, &typeid)) ERR;
53
54   /* Declare a dimension for number of rows */
55   if (nc_def_dim(ncidDIM5_NAMEDIM5_LEN, &dimid)) ERR;
56
57   /* Declare a variable of the vlen type */
58   var_dims[0] = dimid;
59   if (nc_def_var(ncidVAR5_NAMEtypeidVAR5_RANKvar_dims, &varid)) ERR;
60
61   /* Create and write a variable attribute of the vlen type */
62   missing_val.p = &missing_value;
63   missing_val.len = 1;
64   if (nc_put_att(ncidvaridATT5_NAMEtypeidATT5_LEN, (void *) &missing_val)) ERR;
65   if (nc_enddef(ncid)) ERR;
66
67   /* fill in pointers to data rows in preparation for writing */
68   array = (float **) malloc(NROWS * sizeof(float *));
69   if(array == NULLERR;
70   for (i = 0; i < NROWSi++) {
71       int ncolumns = NROWS - i;
72       array[i] = (float *) malloc(ncolumns * sizeof(float));
73       if(array[i] == NULLERR;
74       for (j = 0; j < ncolumnsj++) {
75    array[i][j] = 10.0 * (i + 1) + j;
76       }
77   }
78   array[4][0] = missing_value; /* overwrite last row with missing for equality test */
79
80   for (i = 0; i < DIM5_LENi++) {
81       ragged_data[i].p = array[i];
82       ragged_data[i].len = NROWS - i;
83   }
84
85   /* Store data, writing all values of the ragged matrix in one call */
86   if(nc_put_var(ncidvaridragged_data)) ERR;
87
88   /* Write the file. */
89   if (nc_close(ncid)) ERR;
90
91   /* Check it out. */
92
93   /* Reopen the file. */
94   if (nc_open(FILE5_NAMENC_NOWRITE, &ncid)) ERR;
95
96   /* Get info with the generic inquire for user-defined types */
97   if (nc_inq_user_type(ncidtypeidname_in, &base_size_in, &base_typeid,
98 NULL, &class_in)) ERR;
99   if (strcmp(name_inTYPE5_NAME) ||
100       base_size_in != sizeof(nc_vlen_t) ||
101       base_typeid != NC_FLOAT ||
102       class_in != NC_VLENERR;
103
104   /* Get the same info with the vlen-specific inquire function */
105   if (nc_inq_vlen(ncidtypeidname_in, &base_size_in, &base_typeid)) ERR;
106   if (strcmp(name_inTYPE5_NAME) ||
107       base_size_in != sizeof(nc_vlen_t) ||
108       base_typeid != NC_FLOATERR;
109
110   if (nc_inq_varid(ncidVAR5_NAME, &varid)) ERR;
111
112   /* Read in attribute value and check it */
113   if (nc_get_att(ncidvaridATT5_NAME, &val_in)) ERR;
114   if (val_in.len != ATT5_LENERR;
115   value_in = *(float *)val_in.p;
116   if (value_in != missing_valueERR;
117   /* Free allocated space for attribute value when finished with it */
118   if (nc_free_vlen(&val_in)) ERR;
119
120   /* Read in each row, check its length and values */
121   for (i = 0; i < DIM5_LENi++) {
122       size_t index[VAR5_RANK];
123       float *fvals;
124       index[0] = i;
125       if (nc_get_var1(ncidvaridindex, (void *) &val_in)) ERR;
126       if (val_in.len != NROWS - iERR;
127       fvals = (float *)val_in.p;
128       for (j = 0; j < val_in.lenj++) {
129    if (fvals[j] != array[i][j] ) ERR;
130       }
131       if (nc_free_vlen(&val_in)) ERR;
132   }
133
134   /* Now read in all the rows at once, then check lengths and values */
135   {
136       nc_vlen_t vals_in[DIM5_LEN];
137       float *fvals;
138       size_t start[VAR5_RANK], count[VAR5_RANK];
139       start[0] = 0;
140       count[0] = NROWS;
141       if (nc_get_vara(ncidvaridstartcountvals_in)) ERR;
142       for (i = 0; i < DIM5_LENi++) {
143    for (j = 0; j < vals_in[i].lenj++) {
144        fvals = (float *)vals_in[i].p;
145        if (fvals[j] != array[i][j] ) ERR;
146    }
147    if (nc_free_vlen(&vals_in[i])) ERR;
148       }
149   }
150
151
152   if (nc_close(ncid)) ERR;
153
154   /* Free space used for sample data. */
155   for (i = 0; i < NROWSi++)
156      free(array[i]);
157   free(array);
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