1 /* This is part of the netCDF package.
2    Copyright 2005 University Corporation for Atmospheric Research/Unidata
3    See COPYRIGHT file for conditions of use.
4 
5    Test netcdf-4 variables with unlimited dimensions.
6 
7    $Id: tst_unlim_vars.c,v 1.9 2010/05/25 13:53:04 ed Exp $
8 */
9 
10 #include <config.h>
11 #include <nc_tests.h>
12 #include "err_macros.h"
13 
14 #define FILE_NAME "tst_unlim_vars.nc"
15 #define SFC_TEMP_NAME "surface_temperature"
16 #define LAT_NAME "lat"
17 #define LAT_LEN 2
18 #define LON_NAME "lon"
19 #define LON_LEN 3
20 #define TIME_NAME "time"
21 #define NUM_TIMESTEPS 4
22 #define NDIMS 3
23 
24 int
main(int argc,char ** argv)25 main(int argc, char **argv)
26 {
27    int ncid, sfc_tempid;
28    float data_out[NUM_TIMESTEPS][LAT_LEN][LON_LEN], data_in[NUM_TIMESTEPS][LAT_LEN][LON_LEN];
29    int lat, lon, time;
30    int dimids[NDIMS];
31    nc_type xtype_in;
32    int ndims_in, dimids_in[10], natts_in, nvars_in, unlimdimid_in;
33    size_t len_in;
34    char name_in[NC_MAX_NAME+1];
35    size_t start[NDIMS], count[NDIMS];
36    int d;
37 
38    /* Set up phony data. */
39    for (time = 0; time < NUM_TIMESTEPS; time++)
40       for (lat = 0; lat < LAT_LEN; lat++)
41 	 for (lon = 0; lon < LON_LEN; lon++)
42 	    data_out[time][lat][lon] = 25.5 + lat + lon + time;
43 
44    printf("\n*** Testing netcdf-4 variable with unlimited dimensions.\n");
45    printf("*** Testing file with one var, one unlim dim...");
46 
47    /* Create a file with a 3D surface temp variable. */
48    if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
49 
50    /* Create three dims, one unlimited. */
51    if (nc_def_dim(ncid, TIME_NAME, NC_UNLIMITED, &dimids[0])) ERR;
52    if (nc_def_dim(ncid, LAT_NAME, LAT_LEN, &dimids[1])) ERR;
53    if (nc_def_dim(ncid, LON_NAME, LON_LEN, &dimids[2])) ERR;
54 
55    /* Define a var. */
56    for (d = 0; d < NDIMS; d++)
57       dimids[d] = d;
58    if (nc_def_var(ncid, SFC_TEMP_NAME, NC_FLOAT, NDIMS, dimids, &sfc_tempid)) ERR;
59 
60    /* Check some metadata. */
61    if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
62    if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
63    if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
64 		  &natts_in)) ERR;
65    if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
66        ndims_in != 3 || natts_in != 0) ERR;
67    for (d = 0; d < NDIMS; d++)
68       if (dimids_in[d] != dimids[d]) ERR;
69    if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
70    if (len_in != 0 || strcmp(name_in, TIME_NAME)) ERR;
71    if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
72    if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
73    if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
74    if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
75    if (nc_close(ncid)) ERR;
76 
77    if (nc_open(FILE_NAME, 0, &ncid)) ERR;
78 
79    /* Check metadata. */
80    if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
81    if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
82    if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
83 		  &natts_in)) ERR;
84    if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
85        ndims_in != 3 || natts_in != 0) ERR;
86    for (d = 0; d < NDIMS; d++)
87       if (dimids_in[d] != dimids[d]) ERR;
88    if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
89    if (len_in != 0 || strcmp(name_in, TIME_NAME)) ERR;
90    if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
91    if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
92    if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
93    if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
94 
95    if (nc_close(ncid)) ERR;
96 
97    if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
98 
99    /* Check metadata. */
100    if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
101    if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
102    if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
103 		  &natts_in)) ERR;
104    if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
105        ndims_in != 3 || natts_in != 0) ERR;
106    for (d = 0; d < NDIMS; d++)
107       if (dimids_in[d] != dimids[d]) ERR;
108    if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
109    if (len_in != 0 || strcmp(name_in, TIME_NAME)) ERR;
110    if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
111    if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
112    if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
113    if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
114    if (nc_close(ncid)) ERR;
115 
116    /* Write some data to the var.*/
117    if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
118    for (d = 0; d < NDIMS; d++)
119       start[d] = 0;
120    count[0] = NUM_TIMESTEPS;
121    count[1] = LAT_LEN;
122    count[2] = LON_LEN;
123    if (nc_put_vara_float(ncid, 0, start, count, (float *)data_out)) ERR;
124 
125    /* Check metadata. */
126    if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
127    if (ndims_in != 3 || nvars_in != 1 || natts_in != 0 || unlimdimid_in != 0) ERR;
128    if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_in, dimids_in,
129 		  &natts_in)) ERR;
130    if (strcmp(name_in, SFC_TEMP_NAME) || xtype_in != NC_FLOAT ||
131        ndims_in != 3 || natts_in != 0) ERR;
132    for (d = 0; d < NDIMS; d++)
133       if (dimids_in[d] != dimids[d]) ERR;
134    if (nc_inq_dim(ncid, 0, name_in, &len_in)) ERR;
135    if (len_in != NUM_TIMESTEPS || strcmp(name_in, TIME_NAME)) ERR;
136    if (nc_inq_dim(ncid, 1, name_in, &len_in)) ERR;
137    if (len_in != LAT_LEN || strcmp(name_in, LAT_NAME)) ERR;
138    if (nc_inq_dim(ncid, 2, name_in, &len_in)) ERR;
139    if (len_in != LON_LEN || strcmp(name_in, LON_NAME)) ERR;
140 
141    if (nc_close(ncid)) ERR;
142 
143    if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
144 
145    /* Check data. */
146    if (nc_get_vara_float(ncid, 0, start, count, (float *)data_in)) ERR;
147    for (time = 0; time < NUM_TIMESTEPS; time++)
148       for (lat = 0; lat < LAT_LEN; lat++)
149 	 for (lon = 0; lon < LON_LEN; lon++)
150 	    if (data_in[time][lat][lon] != data_out[time][lat][lon]) ERR;
151 
152    if (nc_close(ncid)) ERR;
153    SUMMARIZE_ERR;
154    FINAL_RESULTS;
155 }
156