1/* This is part of the netCDF package. Copyright 2005 University
2   Corporation for Atmospheric Research/Unidata. See COPYRIGHT file
3   for conditions of use.
4
5   Test netcdf-4 mapped var operations.
6
7   Remember, in C, last dimension of an array varies fastest in memory.
8   int data[2][3] is order in memory (0,0), (0,1), (0,2), (1,0), (1,1), (1,2).
9   applying map of (1,2) will reorder them in the following way:
10   (0,0), (1,0), (0,1), (1,1), (0,2), (1,2)
11
12   I wrote this in Jenny Lake Campground near Jackson, WY. This is a
13   bit of a change from my usual workplace. Given total mobility the
14   ability to work anywhere, I usually choose to work at home. Not
15   sure what this says about me or the modern world, but camping makes
16   a nice change of pace! Ed 8/19/5
17
18   $Id: tst_varms.c,v 1.9 2010/05/25 13:53:04 ed Exp $
19*/
20
21#include <nc_tests.h>
22#include "err_macros.h"
23#define FILE_NAME "tst_varms.nc"
24#define DIM1_NAME "i"
25#define DIM1_LEN 2
26#define DIM2_NAME "j"
27#define DIM2_LEN 3
28#define VAR_NAME "Little_Jenny_Campground"
29
30int
31main(int argc, char **argv)
32{
33   int ncidvariddimids[2];
34   int data[DIM1_LEN][DIM2_LEN], data_in[DIM1_LEN][DIM2_LEN];
35   int ndims_indimids_in[10], natts_in;
36   size_t start[2], count[2];
37   ptrdiff_t stride[2], map[2];
38   char name_in[NC_MAX_NAME+1];
39   nc_type xtype_in;
40   int nvarsnattsndimsunlimdimid;
41   int ijk = 0;
42
43   printf("\n*** Testing netcdf-4 mapped variable functions.\n");
44   {
45      int data_2d[2][2], data_2d_in[2][2];
46
47      printf("*** testing mapping with 2x2 variable...");
48
49      /* Create phoney data. */
50      for (i = 0; i < 2; i++)
51  for (j = 0; j < 2; j++)
52     data_2d[i][j] = k++;
53
54      /* Create a file with one 2D variable of type int and write our
55       * data. */
56      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
57      if (nc_def_dim(ncid, "i", 2, &dimids[0])) ERR;
58      if (nc_def_dim(ncid, "j", 2, &dimids[1])) ERR;
59      if (nc_def_var(ncidVAR_NAMENC_INT, 2, dimids, &varid)) ERR;
60      if (nc_enddef(ncid)) ERR;
61      if (nc_put_var_int(ncidvarid, (int *)data_2d)) ERR;
62      if (nc_close(ncid)) ERR;
63
64      /* Open the file and check. */
65      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
66      if (nc_get_var_int(ncidvarid, (int *)data_2d_in)) ERR;
67      for (i = 0; i < 2; i++)
68  for (j = 0; j < 2; j++)
69     if (data_2d_in[i][j] != data_2d[i][j]) ERR;
70
71      /* Get a transpose of the array. I have no idea how to figure
72       * out the map array, but my first guess worked. */
73      start[0] = start[1] = 0;
74      count[0] = count[1] = 2;
75      stride[0] = stride[1] = 1;
76      map[0] = 1;
77      map[1] = 2;
78      if (nc_get_varm_int(ncidvaridstartcountstridemap,
79   (int *)data_2d_in)) ERR;
80      for (i = 0; i < 2; i++)
81  for (j = 0; j < 2; j++)
82     if (data_2d_in[j][i] != data_2d[i][j]) ERR;
83
84      /* Now read the untransposed array. I still haven't much idea
85       * what these numbers mean. */
86      map[0] = 2;
87      map[1] = 1;
88      if (nc_get_varm_int(ncidvaridstartcountstridemap,
89   (int *)data_2d_in)) ERR;
90      for (i = 0; i < 2; i++)
91  for (j = 0; j < 2; j++)
92     if (data_2d_in[i][j] != data_2d[i][j]) ERR;
93
94      if (nc_close(ncid)) ERR;
95   }
96
97   SUMMARIZE_ERR;
98   printf("*** testing mapping with 2x3 variable...");
99
100   {
101      int data_in_t[DIM2_LEN][DIM1_LEN];
102
103      /* Create some phoney data. */
104      k = 0;
105      for (i = 0; i < DIM1_LENi++)
106  for (j = 0; j < DIM2_LENj++)
107     data[i][j] = k++;
108
109      /* Create a file with one variable of type int. */
110      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
111      if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimids[0])) ERR;
112      if (nc_def_dim(ncidDIM2_NAMEDIM2_LEN, &dimids[1])) ERR;
113      if (nc_def_var(ncidVAR_NAMENC_INT, 2, dimids, &varid)) ERR;
114      if (nc_enddef(ncid)) ERR;
115      if (nc_put_var_int(ncidvarid, (int *)data)) ERR;
116      if (nc_close(ncid)) ERR;
117
118      /* Open the file and check. */
119      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
120      if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims_indimids_in,
121      &natts_in)) ERR;
122      if (strcmp(name_inVAR_NAME) || xtype_in != NC_INT ||
123   ndims_in != 2 || natts_in != 0 || dimids_in[0] != dimids[0] ||
124   dimids_in[1] != dimids[1]) ERR;
125      if (nc_get_var_int(ncidvarid, (int *)data_in)) ERR;
126      for (i = 0; i < DIM1_LENi++)
127  for (j = 0; j < DIM2_LENj++)
128     if (data_in[i][j] != data[i][j]) ERR;
129
130      /* Get a transpose of the array. */
131      start[0] = start[1] = 0;
132      count[0] = DIM1_LEN;
133      count[1] = DIM2_LEN;
134      stride[0] = stride[1] = 1;
135      map[0] = 1;
136      map[1] = 2;
137      if (nc_get_varm_int(ncidvaridstartcountstridemap,
138   (int *)data_in_t)) ERR;
139      for (i = 0; i < DIM1_LENi++)
140  for (j = 0; j < DIM2_LENj++)
141     if (data_in_t[j][i] != data[i][j]) ERR;
142
143      if (nc_close(ncid)) ERR;
144
145   }
146
147   SUMMARIZE_ERR;
148   printf("*** testing simple example from C Users' Guide...");
149
150   {
151#define D0 4
152#define D1 3
153#define D2 2
154
155      /* netCDF dimension       inter-element distance */
156      /* ----------------       ---------------------- */
157      /* most rapidly varying       1                  */
158      /* intermediate               2 (=imap[2]*2)     */
159      /* most slowly varying        6 (=imap[1]*3)     */
160      ptrdiff_t imap[3] = {6, 2, 1}, stride[3] = {1, 1, 1};
161      size_t start[3] = {0, 0, 0}, count[3] = {D0D1D2};
162      int ncidvariddimids[3];
163      float data[D0][D1][D2], data_in[D0][D1][D2];
164
165      for (i = 0; i < D0i++)
166  for (j = 0; j < D1j++)
167     for (k = 0; k < D2k++)
168        data[i][j][k] = i + j + k;
169
170      /* Create a file with one variable of type float. */
171      if (nc_create(FILE_NAMENC_CLOBBER, &ncid)) ERR;
172      if (nc_def_dim(ncid, "D0", D0, &dimids[0])) ERR;
173      if (nc_def_dim(ncid, "D1", D1, &dimids[1])) ERR;
174      if (nc_def_dim(ncid, "D2", D2, &dimids[2])) ERR;
175      if (nc_def_var(ncid, "Jackson_Hole", NC_FLOAT, 3, dimids, &varid)) ERR;
176      if (nc_enddef(ncid)) ERR;
177      if (nc_put_var_float(ncidvarid, (float *)data)) ERR;
178      if (nc_close(ncid)) ERR;
179
180      /* Open the file and check. */
181      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
182      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
183      if (ndims != 3 || nvars != 1 || natts != 0 || unlimdimid != -1) ERR;
184      if (nc_get_var_float(ncid, 0, (float *)data_in)) ERR;
185      for (i = 0; i < D0i++)
186  for (j = 0; j < D1j++)
187     for (k = 0; k < D2k++)
188        if (data_in[i][j][k] != data[i][j][k]) ERR;
189
190      /* Using the imap above I should get identical results
191       * (according to the manual). */
192      if (nc_get_varm_float(ncid, 0, startcountstrideimap,
193     (float *)data_in)) ERR;
194      for (i = 0; i < D0i++)
195  for (j = 0; j < D1j++)
196     for (k = 0; k < D2k++)
197        if (data_in[i][j][k] != data[i][j][k]) ERR;
198
199      /* Now let's mess things around a bit. */
200/*       imap[0] = 0; */
201/*       imap[1] = 1; */
202/*       imap[2] = 2; */
203/*       if (nc_get_varm_float(ncid, 0, start, count, stride, imap,  */
204/*      (float *)data_in)) ERR;    */
205/*       for (i = 0; i < D0; i++) */
206/*   for (j = 0; j < D1; j++) */
207/*      for (k = 0; k < D2; k++) */
208/*         if (data_in[i][j][k] != data[i][j][k]) ERR; */
209
210      if (nc_close(ncid)) ERR;
211   }
212
213   SUMMARIZE_ERR;
214
215   printf("*** testing transposed rh example from C Users' Guide...");
216   {
217      /*nc_set_log_level(2);*/
218
219      ptrdiff_t imap[2] = {1, 6}, stride[2] = {1, 1};
220      size_t start[2] = {0, 0}, count[2] = {6, 4};
221      int ncidvariddimids[3];
222      float data[4][6], data_in[6][4];
223      int k=0;
224
225      /* Phoney data. */
226      for (i = 0; i < 4; i++)
227  for (j = 0; j < 6; j++)
228  {
229     data[i][j] = k;
230     data_in[j][i] = k;
231     k++;
232  }
233
234      /* Create a file with one variable of type float, writing a transposed array. */
235      if (nc_create(FILE_NAME, 0, &ncid)) ERR;
236      if (nc_def_dim(ncid, "lat", 6, &dimids[0])) ERR;
237      if (nc_def_dim(ncid, "lon", 4, &dimids[1])) ERR;
238      if (nc_def_var(ncid, "rh", NC_FLOAT, 2, dimids, &varid)) ERR;
239      dimids[0] = 1;
240      dimids[1] = 0;
241      if (nc_def_var(ncid, "rh2", NC_FLOAT, 2, dimids, &varid)) ERR;
242      if (nc_enddef(ncid)) ERR;
243      if (nc_put_varm_float(ncid, 0, startcountstrideimap,
244     (float *)data)) ERR;
245      count[0] = 4;
246      count[1] = 6;
247      if (nc_put_vara_float(ncid, 1, startcount,
248     (float *)data_in)) ERR;
249      if (nc_close(ncid)) ERR;
250
251      /* Open the file and check. */
252      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
253      if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
254      if (ndims != 2 || nvars != 2 || natts != 0 || unlimdimid != -1) ERR;
255      if (nc_get_var_float(ncid, 0, (float *)data_in)) ERR;
256/*       for (i = 0; i < 4; i++) */
257/*   for (j = 0; j < 6; j++) */
258/*      if (data_in[i][j] != data[j][i]) ERR; */
259
260      if (nc_close(ncid)) ERR;
261   }
262
263   SUMMARIZE_ERR;
264   FINAL_RESULTS;
265}


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