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


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