1/*
2Copyright 2009, UCAR/Unidata
3See COPYRIGHT file for copying and redistribution conditions.
4
5This program tests netcdf-4 performance with some AR-4 3D data.
6
7$Id: tst_ar4.c,v 1.4 2010/01/11 19:27:11 ed Exp $
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <time.h>
13#include <sys/time.h>
14#include <unistd.h>
15
16  /* From the data file we are using:
17
18netcdf pr_A1.20C3M_8.CCSM.atmm.1870-01_cat_1999-12 {
19dimensions:
20 lon = 256 ;
21 lat = 128 ;
22 bnds = 2 ;
23 time = UNLIMITED ; // (1560 currently)
24variables:
25 double lon_bnds(lon, bnds) ;
26 double lat_bnds(lat, bnds) ;
27 double time_bnds(time, bnds) ;
28 double time(time) ;
29 time:calendar = "noleap" ;
30 time:standard_name = "time" ;
31 time:axis = "T" ;
32 time:units = "days since 0000-1-1" ;
33 time:bounds = "time_bnds" ;
34 time:long_name = "time" ;
35 double lat(lat) ;
36 lat:axis = "Y" ;
37 lat:standard_name = "latitude" ;
38 lat:bounds = "lat_bnds" ;
39 lat:long_name = "latitude" ;
40 lat:units = "degrees_north" ;
41 double lon(lon) ;
42 lon:axis = "X" ;
43 lon:standard_name = "longitude" ;
44 lon:bounds = "lon_bnds" ;
45 lon:long_name = "longitude" ;
46 lon:units = "degrees_east" ;
47 float pr(time, lat, lon) ;
48 pr:comment = "Created using NCL code CCSM_atmm_2cf.ncl on\n",
49 " machine mineral" ;
50 pr:missing_value = 1.e+20f ;
51 pr:_FillValue = 1.e+20f ;
52 pr:cell_methods = "time: mean (interval: 1 month)" ;
53 pr:history = "(PRECC+PRECL)*r[h2o]" ;
54 pr:original_units = "m-1 s-1" ;
55 pr:original_name = "PRECC, PRECL" ;
56 pr:standard_name = "precipitation_flux" ;
57 pr:units = "kg m-2 s-1" ;
58 pr:long_name = "precipitation_flux" ;
59 pr:cell_method = "time: mean" ;
60
61*/
62
63#define USAGE   "\
64  [-v]        Verbose\n\
65  [-h]        Print output header\n\
66  [-t]        Do a time-series read\n\
67  [-c CACHE_SIZE]        Set the HDF5 chunk cache to this size before read\n\
68  file        Name of netCDF file\n"
69
70static void
71usage(void)
72{
73   fprintf(stderr, "tst_ar4 -v -h -t -c CACHE_SIZE file\n%s", USAGE);
74}
75
76#define NDIMS3 3
77#define DATA_VAR_NAME "pr"
78#define NUM_CACHE_TRIES 1
79#define LON_DIMID 0
80#define LAT_DIMID 1
81#define BNDS_DIMID 2
82#define TIME_DIMID 3
83#define LON_LEN 256
84#define LAT_LEN 128
85#define BNDS_LEN 2
86#define TIME_LEN 1560
87#define NUM_TS 1
88
89int
90main(int argc, char **argv)
91{
92   extern int optind;
93   extern int opterr;
94   extern char *optarg;
95   int cheader = 0, verbose = 0, timeseries = 0;
96   int ncidvaridstorage;
97   char name_in[NC_MAX_NAME + 1];
98   size_t len;
99   size_t cs[NDIMS3] = {0, 0, 0};
100   int cache = MEGABYTE;
101   int ndimsdimid[NDIMS3];
102   float hor_data[LAT_LEN * LON_LEN];
103   int read_1_usavg_read_us;
104   float ts_data[TIME_LEN];
105   size_t start[NDIMS3], count[NDIMS3];
106   int deflateshuffledeflate_level;
107   struct timeval start_timeend_timediff_time;
108
109   while ((c = getopt(argcargv, "vhtc:")) != EOF)
110      switch(c)
111      {
112  case 'v':
113     verbose++;
114     break;
115  case 'h':
116     header++;
117     break;
118  case 't':
119     timeseries++;
120     break;
121  case 'c':
122     sscanf(optarg, "%d", &cache);
123     break;
124  case '?':
125     usage();
126     return 1;
127      }
128
129   argc -= optind;
130   argv += optind;
131
132   /* If no file arguments left, report and exit */
133   if (argc < 1)
134   {
135      printf("no file specified\n");
136      return 0;
137   }
138
139   /* Print the header if desired. */
140   if (header)
141   {
142      printf("cs[0]\tcs[1]\tcs[2]\tcache(MB)\tdeflate\tshuffle");
143      if (timeseries)
144  printf("\t1st_read_ser(us)\tavg_read_ser(us)\n");
145      else
146  printf("\t1st_read_hor(us)\tavg_read_hor(us)\n");
147   }
148
149#define PREEMPTION .75
150      /* Also tried NELEMS of 2500009*/
151#define NELEMS 7919
152   if (nc_set_chunk_cache(cacheNELEMSPREEMPTION)) ERR;
153   if (nc_open(argv[0], 0, &ncid)) ERR;
154
155   /* Check to make sure that all the dimension information is
156    * correct. */
157   if (nc_inq_varid(ncidDATA_VAR_NAME, &varid)) ERR;
158   if (nc_inq_dim(ncidLON_DIMIDname_in, &len)) ERR;
159   if (strcmp(name_in, "lon") || len != LON_LENERR;
160   if (nc_inq_dim(ncidLAT_DIMIDname_in, &len)) ERR;
161   if (strcmp(name_in, "lat") || len != LAT_LENERR;
162   if (nc_inq_dim(ncidBNDS_DIMIDname_in, &len)) ERR;
163   if (strcmp(name_in, "bnds") || len != BNDS_LENERR;
164   if (nc_inq_dim(ncidTIME_DIMIDname_in, &len)) ERR;
165   if (strcmp(name_in, "time") || len != TIME_LENERR;
166   if (nc_inq_var(ncidvaridNULLNULL, &ndimsdimidNULL)) ERR;
167   if (ndims != NDIMS3 || dimid[0] != TIME_DIMID ||
168       dimid[1] != LAT_DIMID || dimid[2] != LON_DIMIDERR;
169
170   /* Get info about the main data var. */
171   if (nc_inq_var_chunking(ncidvarid, &storagecs)) ERR;
172   if (nc_inq_var_deflate(ncidvarid, &shuffle, &deflate,
173   &deflate_level)) ERR;
174
175   if (timeseries)
176   {
177      /* Read the var as a time series. */
178      start[0] = 0;
179      start[1] = 0;
180      start[2] = 0;
181      count[0] = TIME_LEN;
182      count[1] = 1;
183      count[2] = 1;
184
185      /* Read the first timeseries. */
186      if (gettimeofday(&start_timeNULL)) ERR;
187      if (nc_get_vara_float(ncidvaridstartcountts_data)) ERR_RET;
188      if (gettimeofday(&end_timeNULL)) ERR;
189      if (nc4_timeval_subtract(&diff_time, &end_time, &start_time)) ERR;
190      read_1_us = (int)diff_time.tv_sec * MILLION + (int)diff_time.tv_usec;
191
192      /* Read all the rest. */
193      if (gettimeofday(&start_timeNULL)) ERR;
194      for (start[1] = 0; start[1] < LAT_LENstart[1]++)
195  for (start[2] = 1; start[2] < LON_LENstart[2]++)
196     if (nc_get_vara_float(ncidvaridstartcountts_data)) ERR_RET;
197      if (gettimeofday(&end_timeNULL)) ERR;
198      if (nc4_timeval_subtract(&diff_time, &end_time, &start_time)) ERR;
199      avg_read_us = ((int)diff_time.tv_sec * MILLION + (int)diff_time.tv_usec + read_1_us) /
200  (LAT_LEN * LON_LEN);
201   }
202   else
203   {
204      /* Read the data variable in horizontal slices. */
205      start[0] = 0;
206      start[1] = 0;
207      start[2] = 0;
208      count[0] = 1;
209      count[1] = LAT_LEN;
210      count[2] = LON_LEN;
211
212      /* Read (and time) the first one. */
213      if (gettimeofday(&start_timeNULL)) ERR;
214      if (nc_get_vara_float(ncidvaridstartcounthor_data)) ERR_RET;
215      if (gettimeofday(&end_timeNULL)) ERR;
216      if (nc4_timeval_subtract(&diff_time, &end_time, &start_time)) ERR;
217      read_1_us = (int)diff_time.tv_sec * MILLION + (int)diff_time.tv_usec;
218
219      /* Read (and time) all the rest. */
220      if (gettimeofday(&start_timeNULL)) ERR;
221      for (start[0] = 1; start[0] < TIME_LENstart[0]++)
222  if (nc_get_vara_float(ncidvaridstartcounthor_data)) ERR_RET;
223      if (gettimeofday(&end_timeNULL)) ERR;
224      if (nc4_timeval_subtract(&diff_time, &end_time, &start_time)) ERR;
225      avg_read_us = ((int)diff_time.tv_sec * MILLION + (int)diff_time.tv_usec +
226      read_1_us) / TIME_LEN;
227   }
228
229   /* Close file. */
230   if (nc_close(ncid)) ERR;
231
232   /* Print results. */
233   printf("%d\t%d\t%d\t%.1f\t\t%d\t%d\t\t",
234   (int)cs[0], (int)cs[1], (int)cs[2],
235   (storage == NC_CHUNKED) ? (cache/(float)MEGABYTE) : 0,
236   deflateshuffle);
237   if (timeseries)
238      printf("%d\t\t%d\n", (int)read_1_us, (int)avg_read_us);
239   else
240      printf("%d\t\t%d\n", (int)read_1_us, (int)avg_read_us);
241
242   return 0;
243}


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