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 internal netcdf-4 file code.
6   $Id: tst_files3.c,v 1.5 2010/02/02 17:19:28 ed Exp $
7*/
8
9#include <config.h>
10#include <stdio.h>
11#include <nc_tests.h>
12#include "err_macros.h"
13#include "netcdf.h"
14#include <hdf5.h>
15#include <unistd.h>
16#include <time.h>
17#include <sys/time.h> /* Extra high precision time info. */
18#include <string.h>
19
20#define NDIMS1 1
21#define NDIMS 3
22#define FILE_NAME "tst_files3.nc"
23#define X_LEN 120
24#define Y_LEN 64
25#define Z_LEN 128
26#define NUM_TRIES 200
27
28int dump_file2(const float *data, int docompression, int usedefdim)
29{
30   int ncmodenciddimids[NDIMS], var;
31   size_t start[NDIMS] = {0, 0, 0};
32   size_t count[NDIMS] = {1, 1, Z_LEN};
33/*   size_t count[NDIMS] = {X_LEN, Y_LEN, Z_LEN};*/
34
35   ncmode = NC_CLOBBER|NC_NETCDF4;
36
37   if (nc_create(FILE_NAMENC_NETCDF4, &ncid)) ERR_RET;
38   if (nc_def_dim(ncid, "time", X_LEN, &dimids[0])) ERR_RET;
39   if (nc_def_dim(ncid, "lat", Y_LEN, &dimids[1])) ERR_RET;
40   if (nc_def_dim(ncid, "lon", Z_LEN, &dimids[2])) ERR_RET;
41   if (nc_def_var(ncid, "test", NC_FLOATNDIMSdimids, &var)) ERR_RET;
42   if (docompression)
43     if (nc_def_var_deflate(ncidvar, 1, 1, 1)) ERR_RET;
44   if (nc_enddef(ncid)) ERR_RET;
45   for (start[0] = 0; start[0] < X_LENstart[0]++)
46      for (start[1] = 0; start[1] < Y_LENstart[1]++)
47  if (nc_put_vara_float(ncidvarstartcountdata)) ERR_RET;
48   if (nc_close(ncid)) ERR_RET;
49
50   return 0;
51}
52
53int dump_file(const float *data, int docompression, int usedefdim)
54{
55   int ncmodenciddimids[NDIMS], var;
56   size_t start[NDIMS] = {0, 0, 0}, count[NDIMS] = {X_LENY_LENZ_LEN};
57   ptrdiff_t stride[NDIMS] = {1, 1, 1};
58
59   ncmode = NC_CLOBBER|NC_NETCDF4;
60
61   if (nc_create(FILE_NAMEncmode, &ncid)) ERR_RET;
62   if (nc_def_dim(ncid, "time", X_LEN, &dimids[0])) ERR_RET;
63   if (nc_def_dim(ncid, "lat", Y_LEN, &dimids[1])) ERR_RET;
64   if (nc_def_dim(ncid, "lon", Z_LEN, &dimids[2])) ERR_RET;
65   if (nc_def_var(ncid, "test", NC_FLOATNDIMSdimids, &var)) ERR_RET;
66   if (docompression)
67      if (nc_def_var_deflate(ncidvar, 1, 1, 1)) ERR_RET;
68   if (nc_enddef(ncid)) ERR_RET;
69   if (nc_put_vars_float(ncidvarstartcountstridedata)) ERR_RET;
70   if (nc_close(ncid)) ERR_RET;
71
72   return 0;
73}
74
75int dump_file3(const float *data, int docompression, int usedefdim)
76{
77   int ncmodenciddimids[NDIMS], var;
78   size_t start[NDIMS] = {0, 0, 0}, count[NDIMS] = {X_LENY_LENZ_LEN};
79   ptrdiff_t stride[NDIMS] = {1, 1, 1};
80
81   ncmode = NC_CLOBBER|NC_NETCDF4;
82
83   if (nc_create(FILE_NAMEncmode, &ncid)) ERR_RET;
84   if (nc_def_dim(ncid, "time", X_LEN, &dimids[0])) ERR_RET;
85   if (nc_def_dim(ncid, "lat", Y_LEN, &dimids[1])) ERR_RET;
86   if (nc_def_dim(ncid, "lon", Z_LEN, &dimids[2])) ERR_RET;
87   if (nc_def_var(ncid, "test", NC_FLOATNDIMSdimids, &var)) ERR_RET;
88   if (docompression)
89      if (nc_def_var_deflate(ncidvar, 1, 1, 1)) ERR_RET;
90   if (nc_enddef(ncid)) ERR_RET;
91   if (nc_put_vars_float(ncidvarstartcountstridedata)) ERR_RET;
92   if (nc_close(ncid)) ERR_RET;
93
94   return 0;
95}
96
97int dump_hdf_file(const float *data, int docompression)
98{
99   hid_t file_iddataset_iddataspace_idpropid;
100   hid_t file_spaceidmem_spaceidaccess_plistidxfer_plistid;
101   herr_t status;
102   hsize_t dims[NDIMS] = {X_LENY_LENZ_LEN};
103   hsize_t start[NDIMS] = {0, 0, 0};
104   hsize_t count[NDIMS] = {1, 1, Z_LEN};
105
106   /* create file */
107   file_id = H5Fcreate(FILE_NAMEH5F_ACC_TRUNC,
108        H5P_DEFAULTH5P_DEFAULT);
109
110   /* create property for dataset */
111   propid = H5Pcreate(H5P_DATASET_CREATE);
112
113   if (docompression)
114   {
115      if (H5Pset_layout(propidH5D_CHUNKED) < 0) ERR;
116      if (H5Pset_chunk(propidNDIMSdims) < 0) ERR;
117/*     values[0]=9; */
118/*     status = H5Pset_filter(propid, H5Z_FILTER_DEFLATE,0,1,&values[0]); */
119/*     printf("deflat estatus is: %i\n",status); */
120      /* sets defalte level */
121      if (H5Pset_deflate(propid, 1)) ERR;
122   }
123   if ((file_spaceid = H5Screate_simple(NDIMSdimsdims)) < 0) ERR;
124
125   /* Set up the cache. */
126   if ((access_plistid = H5Pcreate(H5P_DATASET_ACCESS)) < 0) ERR;
127   if (H5Pset_chunk_cache(access_plistidCHUNK_CACHE_NELEMS,
128   CHUNK_CACHE_SIZECHUNK_CACHE_PREEMPTION) < 0) ERR;
129
130   /* Create the dataset. */
131   if ((dataset_id = H5Dcreate2(file_id, "dset", H5T_NATIVE_FLOATfile_spaceid,
132 H5P_DEFAULTpropidaccess_plistid)) < 0) ERR;
133
134/*   if ((file_spaceid = H5Dget_space(dataset_id)) < 0) ERR;*/
135   if ((mem_spaceid = H5Screate_simple(NDIMScountNULL)) < 0) ERR;
136   if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0) ERR;
137
138   /* Write the dataset. */
139   for (start[0] = 0; start[0] < X_LENstart[0]++)
140      for (start[1] = 0; start[1] < Y_LENstart[1]++)
141      {
142  if (H5Sselect_hyperslab(file_spaceidH5S_SELECT_SETstartNULL,
143  countNULL) < 0) ERR_RET;
144  if (H5Dwrite(dataset_idH5T_NATIVE_FLOATmem_spaceidfile_spaceid,
145       xfer_plistiddata) < 0) ERR_RET;
146      }
147
148   /* Close property lists. */
149   if (H5Pclose(propid) < 0) ERR;
150   if (H5Pclose(access_plistid) < 0) ERR;
151   if (H5Pclose(xfer_plistid) < 0) ERR;
152
153   /* Close spaces. */
154   if (H5Sclose(file_spaceid) < 0) ERR;
155   if (H5Sclose(mem_spaceid) < 0) ERR;
156
157   /* End access to the dataset and release resources used by it. */
158   if (H5Dclose(dataset_id) < 0) ERR;
159
160   /* close file */
161   if (H5Fclose(file_id) < 0) ERR;
162   return 0;
163}
164
165void
166get_mem_used2(int *mem_used)
167{
168   char buf[30];
169   FILE *pf;
170
171   snprintf(buf, 30, "/proc/%u/statm", (unsigned)getpid());
172   pf = fopen(buf, "r");
173   if (pf) {
174      unsigned size; /*       total program size */
175      unsigned resident;/*   resident set size */
176      unsigned share;/*      shared pages */
177      unsigned text;/*       text (code) */
178      unsigned lib;/*        library */
179      unsigned data;/*       data/stack */
180      /*unsigned dt;          dirty pages (unused in Linux 2.6)*/
181      fscanf(pf, "%u %u %u %u %u %u", &size, &resident, &share,
182      &text, &lib, &data);
183      *mem_used = data;
184   }
185   else
186      *mem_used = -1;
187  fclose(pf);
188}
189
190int main(void)
191{
192   float data[X_LEN * Y_LEN * Z_LEN];
193   int i;
194
195   printf("\n*** Testing netcdf-4 file functions with caching.\n");
196
197  /* Initialize data. */
198   for (i = 0; i < (X_LEN * Y_LEN * Z_LEN); i++)
199      data[i] = i;
200   printf("*** testing a bunch of file writes with compressed data...\n");
201   {
202      int mem_usedmem_used1;
203
204      printf("*** testing netcdf-4 writes...\n");
205      for (i = 0; i < NUM_TRIESi++)
206      {
207  get_mem_used2(&mem_used);
208  if (dump_file3(data, 1, 0)) ERR_RET;
209  get_mem_used2(&mem_used1);
210  if (mem_used1 - mem_used)
211     printf("delta %d bytes of memory for try %d\n", mem_used1 - mem_usedi);
212      }
213      printf("*** testing HDF5 writes...\n");
214      for (i = 0; i < NUM_TRIESi++)
215      {
216  get_mem_used2(&mem_used);
217  if (dump_hdf_file(data, 1)) ERR_RET;
218  get_mem_used2(&mem_used1);
219  if (mem_used1 - mem_used)
220     printf("delta %d bytes of memory for try %d\n", mem_used1 - mem_usedi);
221      }
222      printf("*** testing netcdf-4 writes again...\n");
223      for (i = 0; i < NUM_TRIESi++)
224      {
225  get_mem_used2(&mem_used);
226  if (dump_file2(data, 1, 0)) ERR_RET;
227  get_mem_used2(&mem_used1);
228  if (mem_used1 - mem_used)
229     printf("delta %d bytes of memory for try %d\n", mem_used1 - mem_usedi);
230      }
231   }
232   SUMMARIZE_ERR;
233   FINAL_RESULTS;
234}


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