1/* This is part of the netCDF package. Copyright 2010 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use.
4
5   Test netcdf-4 coordinate variables and dimensions with an example
6   from the CF conventions.
7
8 Here's the example from the CF conventions:
9dimensions:
10  xc = 128 ;
11  yc = 64 ;
12  lev = 18 ;
13variables:
14  float T(lev,yc,xc) ;
15    T:long_name = "temperature" ;
16    T:units = "K" ;
17    T:coordinates = "lon lat" ;
18  float xc(xc) ;
19    xc:axis = "X" ;
20    xc:long_name = "x-coordinate in Cartesian system" ;
21    xc:units = "m" ;
22  float yc(yc) ;
23    yc:axis = "Y" ;
24    yc:long_name = "y-coordinate in Cartesian system" ;
25    yc:units = "m" ;
26  float lev(lev) ;
27    lev:long_name = "pressure level" ;
28    lev:units = "hPa" ;
29  float lon(yc,xc) ;
30    lon:long_name = "longitude" ;
31    lon:units = "degrees_east" ;
32  float lat(yc,xc) ;
33    lat:long_name = "latitude" ;
34    lat:units = "degrees_north" ;
35
36   $Id: tst_coords3.c,v 1.1 2010/03/30 19:42:24 ed Exp $
37*/
38
39#include <nc_tests.h>
40#include "err_macros.h"
41#include "netcdf.h"
42
43#define FILE_NAME "tst_coords3.nc"
44
45#define NDIMS 3
46#define NVARS 6
47#define XC_NAME "xc"
48#define YC_NAME "yc"
49#define LEV_NAME "lev"
50#define T_NAME "T"
51#define LON_NAME "lon"
52#define LAT_NAME "lat"
53#define XC_LEN 128
54#define YC_LEN 64
55#define LEV_LEN 18
56#define DATA_NDIMS 3
57#define COORD_NDIMS 2
58
59/* For the attributes. */
60#define LONG_NAME "long_name"
61#define TEMPERATURE "temperature"
62#define UNITS "units"
63#define KELVIN "K"
64#define COORDINATES_NAME "coordinates"
65#define LONLAT_COORDINATES "lon lat"
66#define AXIS "axis"
67#define X_NAME "X"
68#define X_LONG_NAME "x-coordinate in Cartesian system"
69#define METER "m"
70#define Y_NAME "Y"
71#define Y_LONG_NAME "y-coordinate in Cartesian system"
72#define LEV_LONG_NAME "pressure level"
73#define LON_LONG_NAME "longitude"
74#define LAT_LONG_NAME "latitude"
75#define DEGREES_EAST "degrees_east"
76#define DEGREES_NORTH "degrees_north"
77#define HPA "hPa"
78#define SAMPLE_VALUE 0.5
79
80int
81check_cf_data(int ncid)
82{
83   float temp_in[YC_LEN][XC_LEN];
84   size_t start[DATA_NDIMS] = {0, 0, 0}, count[DATA_NDIMS] = {1, YC_LENXC_LEN};
85   float xc_in[XC_LEN], yc_in[YC_LEN];
86   int xy;
87
88   /* Get the record we wrote. */
89   if (nc_get_vara_float(ncid, 0, startcount, (float *)temp_in)) ERR_RET;
90   for (y = 0; y < YC_LENy++)
91      for (x = 0; x < XC_LENx++)
92  if (temp_in[y][x] != SAMPLE_VALUEERR_RET;
93
94   /* Get the XC data. */
95   if (nc_get_var_float(ncid, 1, xc_in)) ERR_RET;
96   for (x = 0; x < XC_LENx++)
97      if (xc_in[x] != SAMPLE_VALUEERR_RET;
98
99   /* Get the YC data. */
100   if (nc_get_var_float(ncid, 2, yc_in)) ERR_RET;
101   for (y = 0; y < YC_LENy++)
102      if (yc_in[y] != SAMPLE_VALUEERR_RET;
103
104   return 0;
105}
106
107int
108check_cf_metadata(int ncid)
109{
110
111   int nvars_invarids_in[NVARS];
112   int nvarsndimsngattsunlimdimid;
113   int ndims_innatts_indimids_in[NDIMS];
114   char var_name_in[NC_MAX_NAME + 1], dim_name_in[NC_MAX_NAME + 1];
115   size_t len_in;
116   nc_type xtype_in;
117   int v;
118   char att_text_in[NC_MAX_NAME + 1];
119
120   /* Right number of objects? */
121   if (nc_inq(ncid, &ndims, &nvars, &ngatts, &unlimdimid)) ERR_RET;
122   if (nvars != NVARS || ndims != NDIMS || ngatts != 0 || unlimdimid != -1) ERR_RET;
123
124   /* Right number of varids? */
125   if (nc_inq_varids(ncid, &nvars_invarids_in)) ERR_RET;
126   if (nvars_in != NVARSERR_RET;
127   for (v = 0; v < NVARSv++)
128      if (varids_in[v] != vERR_RET;
129
130   /* Right number of dimids? */
131   if (nc_inq_dimids(ncid, &ndims_indimids_in, 0)) ERR_RET;
132   if (ndims_in != NDIMSERR_RET;
133
134   /* Check dimensions. */
135   if (nc_inq_dim(ncid, 0, dim_name_in, &len_in)) ERR;
136   if (strcmp(dim_name_inXC_NAME) || len_in != XC_LENERR;
137   if (nc_inq_dim(ncid, 1, dim_name_in, &len_in)) ERR;
138   if (strcmp(dim_name_inYC_NAME) || len_in != YC_LENERR;
139   if (nc_inq_dim(ncid, 2, dim_name_in, &len_in)) ERR;
140   if (strcmp(dim_name_inLEV_NAME) || len_in != LEV_LENERR;
141
142   /* Check variable T. */
143   if (nc_inq_var(ncid, 0, var_name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR_RET;
144   if (strcmp(var_name_inT_NAME) || xtype_in != NC_FLOAT || ndims_in != NDIMS ||
145       dimids_in[0] != 2 || dimids_in[1] != 1 || dimids_in[2] != 0 || natts_in != 3) ERR_RET;
146   if (nc_get_att_text(ncid, 0, LONG_NAMEatt_text_in)) ERR;
147   if (strncmp(att_text_inTEMPERATURE, strlen(TEMPERATURE))) ERR;
148   if (nc_get_att_text(ncid, 0, UNITSatt_text_in)) ERR;
149   if (strncmp(att_text_inKELVIN, strlen(KELVIN))) ERR;
150   if (nc_get_att_text(ncid, 0, COORDINATES_NAMEatt_text_in)) ERR;
151   if (strncmp(att_text_inLONLAT_COORDINATES, strlen(LONLAT_COORDINATES))) ERR;
152
153   /* Check variable xc. */
154   if (nc_inq_var(ncid, 1, var_name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR_RET;
155   if (strcmp(var_name_inXC_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
156       dimids_in[0] != 0 || natts_in != 3) ERR_RET;
157   if (nc_get_att_text(ncid, 1, AXISatt_text_in)) ERR;
158   if (strncmp(att_text_inX_NAME, strlen(X_NAME))) ERR;
159   if (nc_get_att_text(ncid, 1, LONG_NAMEatt_text_in)) ERR;
160   if (strncmp(att_text_inX_LONG_NAME, strlen(X_LONG_NAME))) ERR;
161   if (nc_get_att_text(ncid, 1, UNITSatt_text_in)) ERR;
162   if (strncmp(att_text_inMETER, strlen(METER))) ERR;
163
164   /* Check variable yc. */
165   if (nc_inq_var(ncid, 2, var_name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR_RET;
166   if (strcmp(var_name_inYC_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
167       dimids_in[0] != 1 || natts_in != 3) ERR_RET;
168   if (nc_get_att_text(ncid, 2, AXISatt_text_in)) ERR;
169   if (strncmp(att_text_inY_NAME, strlen(Y_NAME))) ERR;
170   if (nc_get_att_text(ncid, 2, LONG_NAMEatt_text_in)) ERR;
171   if (strncmp(att_text_inY_LONG_NAME, strlen(Y_LONG_NAME))) ERR;
172   if (nc_get_att_text(ncid, 2, UNITSatt_text_in)) ERR;
173   if (strncmp(att_text_inMETER, strlen(METER))) ERR;
174
175   /* Check variable lev. */
176   if (nc_inq_var(ncid, 3, var_name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR_RET;
177   if (strcmp(var_name_inLEV_NAME) || xtype_in != NC_FLOAT || ndims_in != 1 ||
178       dimids_in[0] != 2 || natts_in != 2) ERR_RET;
179   if (nc_get_att_text(ncid, 3, LONG_NAMEatt_text_in)) ERR;
180   if (strncmp(att_text_inLEV_LONG_NAME, strlen(LEV_LONG_NAME))) ERR;
181   if (nc_get_att_text(ncid, 3, UNITSatt_text_in)) ERR;
182   if (strncmp(att_text_inHPA, strlen(HPA))) ERR;
183
184   /* Check variable lon. */
185   if (nc_inq_var(ncid, 4, var_name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR_RET;
186   if (strcmp(var_name_inLON_NAME) || xtype_in != NC_FLOAT || ndims_in != COORD_NDIMS ||
187       dimids_in[0] != 1 || dimids_in[1] != 0 || natts_in != 2) ERR_RET;
188   if (nc_get_att_text(ncid, 4, LONG_NAMEatt_text_in)) ERR;
189   if (strncmp(att_text_inLON_LONG_NAME, strlen(LON_LONG_NAME))) ERR;
190   if (nc_get_att_text(ncid, 4, UNITSatt_text_in)) ERR;
191   if (strncmp(att_text_inDEGREES_EAST, strlen(DEGREES_EAST))) ERR;
192
193   /* Check variable lat. */
194   if (nc_inq_var(ncid, 5, var_name_in, &xtype_in, &ndims_indimids_in, &natts_in)) ERR_RET;
195   if (strcmp(var_name_inLAT_NAME) || xtype_in != NC_FLOAT || ndims_in != COORD_NDIMS ||
196       dimids_in[0] != 1 || dimids_in[1] != 0 || natts_in != 2) ERR_RET;
197   if (nc_get_att_text(ncid, 5, LONG_NAMEatt_text_in)) ERR;
198   if (strncmp(att_text_inLAT_LONG_NAME, strlen(LAT_LONG_NAME))) ERR;
199   if (nc_get_att_text(ncid, 5, UNITSatt_text_in)) ERR;
200   if (strncmp(att_text_inDEGREES_NORTH, strlen(DEGREES_NORTH))) ERR;
201
202   return 0;
203}
204
205int
206main(int argc, char **argv)
207{
208   printf("\n*** Testing with CF example http://cf-pcmdi.llnl.gov/documents/cf-conventions/1.4/ch05s02.html....\n");
209   printf("**** simple test with only metadata");
210   {
211      int nciddimids[NDIMS], varids[NVARS], data_dimids[DATA_NDIMS];
212      int coord_dimids[COORD_NDIMS];
213
214      /* Create a netcdf-4 file. */
215      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
216
217      /* Define dimensions. */
218      if (nc_def_dim(ncidXC_NAMEXC_LEN, &dimids[0])) ERR;
219      if (nc_def_dim(ncidYC_NAMEYC_LEN, &dimids[1])) ERR;
220      if (nc_def_dim(ncidLEV_NAMELEV_LEN, &dimids[2])) ERR;
221
222      /* Define variables. Start with T. */
223      data_dimids[0] = dimids[2];
224      data_dimids[1] = dimids[1];
225      data_dimids[2] = dimids[0];
226      if (nc_def_var(ncidT_NAMENC_FLOATDATA_NDIMSdata_dimids, &varids[0])) ERR;
227      if (nc_put_att_text(ncidvarids[0], LONG_NAME, strlen(TEMPERATURE),
228   TEMPERATURE)) ERR;
229      if (nc_put_att_text(ncidvarids[0], UNITS, strlen(KELVIN), KELVIN)) ERR;
230      if (nc_put_att_text(ncidvarids[0], COORDINATES_NAME, strlen(LONLAT_COORDINATES),
231   LONLAT_COORDINATES)) ERR;
232
233      /* Define xc variable. */
234      if (nc_def_var(ncidXC_NAMENC_FLOAT, 1, &dimids[0], &varids[1])) ERR;
235      if (nc_put_att_text(ncidvarids[1], AXIS, strlen(X_NAME), X_NAME)) ERR;
236      if (nc_put_att_text(ncidvarids[1], LONG_NAME, strlen(X_LONG_NAME),
237   X_LONG_NAME)) ERR;
238      if (nc_put_att_text(ncidvarids[1], UNITS, strlen(METER), METER)) ERR;
239
240      /* Define yc variable. */
241      if (nc_def_var(ncidYC_NAMENC_FLOAT, 1, &dimids[1], &varids[2])) ERR;
242      if (nc_put_att_text(ncidvarids[2], AXIS, strlen(Y_NAME), Y_NAME)) ERR;
243      if (nc_put_att_text(ncidvarids[2], LONG_NAME, strlen(Y_LONG_NAME),
244   Y_LONG_NAME)) ERR;
245      if (nc_put_att_text(ncidvarids[2], UNITS, strlen(METER), METER)) ERR;
246
247      /* Define lev variable. */
248      if (nc_def_var(ncidLEV_NAMENC_FLOAT, 1, &dimids[2], &varids[3])) ERR;
249      if (nc_put_att_text(ncidvarids[3], LONG_NAME, strlen(LEV_LONG_NAME),
250   LEV_LONG_NAME)) ERR;
251      if (nc_put_att_text(ncidvarids[3], UNITS, strlen(HPA), HPA)) ERR;
252
253      /* Define lon variable. */
254      coord_dimids[0] = dimids[1];
255      coord_dimids[1] = dimids[0];
256      if (nc_def_var(ncidLON_NAMENC_FLOATCOORD_NDIMScoord_dimids, &varids[4])) ERR;
257      if (nc_put_att_text(ncidvarids[4], LONG_NAME, strlen(LON_LONG_NAME),
258   LON_LONG_NAME)) ERR;
259      if (nc_put_att_text(ncidvarids[4], UNITS, strlen(DEGREES_EAST), DEGREES_EAST)) ERR;
260
261      /* Define lat variable. */
262      if (nc_def_var(ncidLAT_NAMENC_FLOATCOORD_NDIMScoord_dimids, &varids[5])) ERR;
263      if (nc_put_att_text(ncidvarids[5], LONG_NAME, strlen(LAT_LONG_NAME),
264   LAT_LONG_NAME)) ERR;
265      if (nc_put_att_text(ncidvarids[5], UNITS, strlen(DEGREES_NORTH), DEGREES_NORTH)) ERR;
266
267      /* Check the metadata. */
268      if (check_cf_metadata(ncid)) ERR;
269
270      /* Close up. */
271      if (nc_close(ncid)) ERR;
272
273      /* Open the file and check the order of variables and dimensions. */
274      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
275
276      /* Check the metadata. */
277      if (check_cf_metadata(ncid)) ERR;
278
279      /* Close up. */
280      if (nc_close(ncid)) ERR;
281   }
282   SUMMARIZE_ERR;
283   printf("**** test with data writes...");
284   {
285      int nciddimids[NDIMS], varids[NVARS], data_dimids[DATA_NDIMS];
286      int coord_dimids[COORD_NDIMS];
287      float temp[YC_LEN][XC_LEN], xc[XC_LEN], yc[YC_LEN];
288      size_t start[DATA_NDIMS] = {0, 0, 0}, count[DATA_NDIMS] = {1, YC_LENXC_LEN};
289      int xy;
290
291      /* Initialize some fake data. */
292      for (y = 0; y < YC_LENy++)
293  for (x = 0; x < XC_LENx++)
294     temp[y][x] = SAMPLE_VALUE;
295      for (x = 0; x < XC_LENx++)
296  xc[x] = SAMPLE_VALUE;
297      for (y = 0; y < YC_LENy++)
298  yc[y] = SAMPLE_VALUE;
299
300      /* Create a netcdf-4 file. */
301      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
302
303      /* Define dimensions. */
304      if (nc_def_dim(ncidXC_NAMEXC_LEN, &dimids[0])) ERR;
305      if (nc_def_dim(ncidYC_NAMEYC_LEN, &dimids[1])) ERR;
306      if (nc_def_dim(ncidLEV_NAMELEV_LEN, &dimids[2])) ERR;
307
308      /* Define variables. Start with T. */
309      data_dimids[0] = dimids[2];
310      data_dimids[1] = dimids[1];
311      data_dimids[2] = dimids[0];
312      if (nc_def_var(ncidT_NAMENC_FLOATDATA_NDIMSdata_dimids, &varids[0])) ERR;
313      if (nc_put_att_text(ncidvarids[0], LONG_NAME, strlen(TEMPERATURE),
314   TEMPERATURE)) ERR;
315      if (nc_put_att_text(ncidvarids[0], UNITS, strlen(KELVIN), KELVIN)) ERR;
316      if (nc_put_att_text(ncidvarids[0], COORDINATES_NAME, strlen(LONLAT_COORDINATES),
317   LONLAT_COORDINATES)) ERR;
318
319      /* Define xc variable. */
320      if (nc_def_var(ncidXC_NAMENC_FLOAT, 1, &dimids[0], &varids[1])) ERR;
321      if (nc_put_att_text(ncidvarids[1], AXIS, strlen(X_NAME), X_NAME)) ERR;
322      if (nc_put_att_text(ncidvarids[1], LONG_NAME, strlen(X_LONG_NAME),
323   X_LONG_NAME)) ERR;
324      if (nc_put_att_text(ncidvarids[1], UNITS, strlen(METER), METER)) ERR;
325
326      /* Define yc variable. */
327      if (nc_def_var(ncidYC_NAMENC_FLOAT, 1, &dimids[1], &varids[2])) ERR;
328      if (nc_put_att_text(ncidvarids[2], AXIS, strlen(Y_NAME), Y_NAME)) ERR;
329      if (nc_put_att_text(ncidvarids[2], LONG_NAME, strlen(Y_LONG_NAME),
330   Y_LONG_NAME)) ERR;
331      if (nc_put_att_text(ncidvarids[2], UNITS, strlen(METER), METER)) ERR;
332
333      /* Define lev variable. */
334      if (nc_def_var(ncidLEV_NAMENC_FLOAT, 1, &dimids[2], &varids[3])) ERR;
335      if (nc_put_att_text(ncidvarids[3], LONG_NAME, strlen(LEV_LONG_NAME),
336   LEV_LONG_NAME)) ERR;
337      if (nc_put_att_text(ncidvarids[3], UNITS, strlen(HPA), HPA)) ERR;
338
339      /* Define lon variable. */
340      coord_dimids[0] = dimids[1];
341      coord_dimids[1] = dimids[0];
342      if (nc_def_var(ncidLON_NAMENC_FLOATCOORD_NDIMScoord_dimids, &varids[4])) ERR;
343      if (nc_put_att_text(ncidvarids[4], LONG_NAME, strlen(LON_LONG_NAME),
344   LON_LONG_NAME)) ERR;
345      if (nc_put_att_text(ncidvarids[4], UNITS, strlen(DEGREES_EAST), DEGREES_EAST)) ERR;
346
347      /* Define lat variable. */
348      if (nc_def_var(ncidLAT_NAMENC_FLOATCOORD_NDIMScoord_dimids, &varids[5])) ERR;
349      if (nc_put_att_text(ncidvarids[5], LONG_NAME, strlen(LAT_LONG_NAME),
350   LAT_LONG_NAME)) ERR;
351      if (nc_put_att_text(ncidvarids[5], UNITS, strlen(DEGREES_NORTH), DEGREES_NORTH)) ERR;
352
353      /* Write some data to T. */
354      if (nc_put_vara_float(ncid, 0, startcount, (const float *)temp)) ERR;
355      /* Write data to XC. */
356      if (nc_put_var_float(ncid, 1, xc)) ERR;
357      /* Write data to YC. */
358      if (nc_put_var_float(ncid, 2, yc)) ERR;
359
360      /* Check the metadata and data. */
361      if (check_cf_metadata(ncid)) ERR;
362      if (check_cf_data(ncid)) ERR;
363
364      /* Close up. */
365      if (nc_close(ncid)) ERR;
366
367      /* Open the file and check the order of variables and dimensions. */
368      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
369
370      /* Check the metadata and data. */
371      if (check_cf_metadata(ncid)) ERR;
372      if (check_cf_data(ncid)) ERR;
373
374      /* Close up. */
375      if (nc_close(ncid)) ERR;
376   }
377   SUMMARIZE_ERR;
378   printf("**** test with data writes without enddefs...");
379   {
380      int nciddimids[NDIMS], varids[NVARS], data_dimids[DATA_NDIMS];
381      int coord_dimids[COORD_NDIMS];
382      float temp[YC_LEN][XC_LEN], xc[XC_LEN], yc[YC_LEN];
383      size_t start[DATA_NDIMS] = {0, 0, 0}, count[DATA_NDIMS] = {1, YC_LENXC_LEN};
384      int xy;
385
386      /* Initialize some fake data. */
387      for (y = 0; y < YC_LENy++)
388  for (x = 0; x < XC_LENx++)
389     temp[y][x] = SAMPLE_VALUE;
390      for (x = 0; x < XC_LENx++)
391  xc[x] = SAMPLE_VALUE;
392      for (y = 0; y < YC_LENy++)
393  yc[y] = SAMPLE_VALUE;
394
395      /* Create a netcdf-4 file. */
396      if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR;
397
398      /* Define dimensions. */
399      if (nc_def_dim(ncidXC_NAMEXC_LEN, &dimids[0])) ERR;
400      if (nc_def_dim(ncidYC_NAMEYC_LEN, &dimids[1])) ERR;
401      if (nc_def_dim(ncidLEV_NAMELEV_LEN, &dimids[2])) ERR;
402
403      /* Define variables. Start with T. */
404      data_dimids[0] = dimids[2];
405      data_dimids[1] = dimids[1];
406      data_dimids[2] = dimids[0];
407      if (nc_def_var(ncidT_NAMENC_FLOATDATA_NDIMSdata_dimids, &varids[0])) ERR;
408      if (nc_put_att_text(ncidvarids[0], LONG_NAME, strlen(TEMPERATURE),
409   TEMPERATURE)) ERR;
410      if (nc_put_att_text(ncidvarids[0], UNITS, strlen(KELVIN), KELVIN)) ERR;
411      if (nc_put_att_text(ncidvarids[0], COORDINATES_NAME, strlen(LONLAT_COORDINATES),
412   LONLAT_COORDINATES)) ERR;
413
414      /* Write some data to T. */
415      if (nc_put_vara_float(ncid, 0, startcount, (const float *)temp)) ERR;
416
417      /* Define xc variable. */
418      if (nc_def_var(ncidXC_NAMENC_FLOAT, 1, &dimids[0], &varids[1])) ERR;
419      if (nc_put_att_text(ncidvarids[1], AXIS, strlen(X_NAME), X_NAME)) ERR;
420      if (nc_put_att_text(ncidvarids[1], LONG_NAME, strlen(X_LONG_NAME),
421   X_LONG_NAME)) ERR;
422      if (nc_put_att_text(ncidvarids[1], UNITS, strlen(METER), METER)) ERR;
423
424      /* Write data to XC. */
425      if (nc_put_var_float(ncid, 1, xc)) ERR;
426
427      /* Define yc variable. */
428      if (nc_def_var(ncidYC_NAMENC_FLOAT, 1, &dimids[1], &varids[2])) ERR;
429      if (nc_put_att_text(ncidvarids[2], AXIS, strlen(Y_NAME), Y_NAME)) ERR;
430      if (nc_put_att_text(ncidvarids[2], LONG_NAME, strlen(Y_LONG_NAME),
431   Y_LONG_NAME)) ERR;
432      if (nc_put_att_text(ncidvarids[2], UNITS, strlen(METER), METER)) ERR;
433
434      /* Write data to YC. */
435      if (nc_put_var_float(ncid, 2, yc)) ERR;
436
437      /* Define lev variable. */
438      if (nc_def_var(ncidLEV_NAMENC_FLOAT, 1, &dimids[2], &varids[3])) ERR;
439      if (nc_put_att_text(ncidvarids[3], LONG_NAME, strlen(LEV_LONG_NAME),
440   LEV_LONG_NAME)) ERR;
441      if (nc_put_att_text(ncidvarids[3], UNITS, strlen(HPA), HPA)) ERR;
442
443      /* Define lon variable. */
444      coord_dimids[0] = dimids[1];
445      coord_dimids[1] = dimids[0];
446      if (nc_def_var(ncidLON_NAMENC_FLOATCOORD_NDIMScoord_dimids, &varids[4])) ERR;
447      if (nc_put_att_text(ncidvarids[4], LONG_NAME, strlen(LON_LONG_NAME),
448   LON_LONG_NAME)) ERR;
449      if (nc_put_att_text(ncidvarids[4], UNITS, strlen(DEGREES_EAST), DEGREES_EAST)) ERR;
450
451      /* Define lat variable. */
452      if (nc_def_var(ncidLAT_NAMENC_FLOATCOORD_NDIMScoord_dimids, &varids[5])) ERR;
453      if (nc_put_att_text(ncidvarids[5], LONG_NAME, strlen(LAT_LONG_NAME),
454   LAT_LONG_NAME)) ERR;
455      if (nc_put_att_text(ncidvarids[5], UNITS, strlen(DEGREES_NORTH), DEGREES_NORTH)) ERR;
456
457      /* Check the metadata and data. */
458      if (check_cf_metadata(ncid)) ERR;
459      if (check_cf_data(ncid)) ERR;
460
461      /* Close up. */
462      if (nc_close(ncid)) ERR;
463
464      /* Open the file and check the order of variables and dimensions. */
465      if (nc_open(FILE_NAMENC_WRITE, &ncid)) ERR;
466
467      /* Check the metadata and data. */
468      if (check_cf_metadata(ncid)) ERR;
469      if (check_cf_data(ncid)) ERR;
470
471      /* Close up. */
472      if (nc_close(ncid)) ERR;
473   }
474   SUMMARIZE_ERR;
475   FINAL_RESULTS;
476}


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