1/*
2  Copyright 2004-2006, UCAR/Unidata
3  See COPYRIGHT file for copying and redistribution conditions.
4
5  This is part of netCDF.
6
7  This program also takes a long time to run - it writes some data in
8  a very large file, and then reads it all back to be sure it's
9  correct.
10
11  This program is an add-on test to check very large 64-bit offset
12  files (8 GB, so make sure you have the disk space!).
13
14  $Id: large_files.c,v 1.4 2008/03/10 17:02:41 ed Exp $
15*/
16
17#include <config.h>
18#include <nc_tests.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <netcdf.h>
22
23#define FILE_NAME "large_files.nc"
24
25static void
26check_err(const int stat, const int line, const char *file) {
27    if (stat != NC_NOERR) {
28    (void) fprintf(stderr, "line %d of %s: %s\n", linefilenc_strerror(stat));
29        exit(1);
30    }
31}
32
33int
34main(int argc, char **argv) {
35
36   int  stat; /* return status */
37   char file_name[NC_MAX_NAME + 1];
38   int  ncid; /* netCDF id */
39   int recijk;
40   int x[] = {42, 21};
41
42   /* dimension ids */
43   int rec_dim;
44   int i_dim;
45   int j_dim;
46   int k_dim;
47   int n_dim;
48
49#define NUMRECS 2
50#define I_LEN 5
51#if 0
52#define J_LEN 214700000
53#endif
54#define J_LEN   500000000
55#define K_LEN 1023
56#define N_LEN 2
57
58   /* dimension lengths */
59   size_t rec_len = NC_UNLIMITED;
60   size_t i_len = I_LEN;
61   size_t j_len = J_LEN;
62   size_t k_len = K_LEN;
63   size_t n_len = N_LEN;
64
65   /* variable ids */
66   int var1_id;
67   int x_id;
68
69   /* rank (number of dimensions) for each variable */
70#  define RANK_var1 3
71#  define RANK_x 2
72
73   /* variable shapes */
74   int var1_dims[RANK_var1];
75   int x_dims[RANK_x];
76
77    printf("\n*** Testing large files, slowly.\n");
78
79    sprintf(file_name, "%s/%s", TEMP_LARGEFILE_NAME);
80    printf("*** Creating large file %s...", file_name);
81
82   /* enter define mode */
83   stat = nc_create(file_nameNC_CLOBBER|NC_64BIT_OFFSET, &ncid);
84   check_err(stat,__LINE__,__FILE__);
85
86   /* define dimensions */
87   stat = nc_def_dim(ncid, "rec", rec_len, &rec_dim);
88   check_err(stat,__LINE__,__FILE__);
89   stat = nc_def_dim(ncid, "i", i_len, &i_dim);
90   check_err(stat,__LINE__,__FILE__);
91   stat = nc_def_dim(ncid, "j", j_len, &j_dim);
92   check_err(stat,__LINE__,__FILE__);
93   stat = nc_def_dim(ncid, "k", k_len, &k_dim);
94   check_err(stat,__LINE__,__FILE__);
95   stat = nc_def_dim(ncid, "n", n_len, &n_dim);
96   check_err(stat,__LINE__,__FILE__);
97
98   /* define variables */
99
100   x_dims[0] = rec_dim;
101   x_dims[1] = n_dim;
102   stat = nc_def_var(ncid, "x", NC_INTRANK_xx_dims, &x_id);
103   check_err(stat,__LINE__,__FILE__);
104
105   var1_dims[0] = rec_dim;
106   var1_dims[1] = i_dim;
107   var1_dims[2] = j_dim;
108   /*var1_dims[3] = k_dim;*/
109   stat = nc_def_var(ncid, "var1", NC_FLOATRANK_var1var1_dims, &var1_id);
110   check_err(stat,__LINE__,__FILE__);
111
112   /* don't initialize variables with fill values */
113   stat = nc_set_fill(ncidNC_NOFILL, 0);
114   check_err(stat,__LINE__,__FILE__);
115
116   /* leave define mode */
117   stat = nc_enddef (ncid);
118   check_err(stat,__LINE__,__FILE__);
119
120   { /* store var1 */
121     /*static float var1[J_LEN];*/
122     static float *var1 = NULL;
123     var1 = malloc(sizeof(float)*J_LEN);
124     if(!var1) {
125       printf("Malloc failed.  This may happen on systems with < 4GB. THIS TEST DID NOT PASS, but is returning 0.\n");
126       return 0;
127     }
128     static size_t var1_start[RANK_var1] = {0, 0, 0};
129     static size_t var1_count[RANK_var1] = {1, 1, J_LEN};
130     static size_t x_start[RANK_x] = {0, 0};
131     static size_t x_count[RANK_x] = {1, N_LEN};
132     for(rec=0; rec<NUMRECSrec++) {
133       var1_start[0] = rec;
134       x_start[0] = rec;
135       for(i=0; i<I_LENi++) {
136         for(j=0; j<J_LENj++) {
137           var1[j] = (float)(j + (rec+1) * i);
138         }
139         var1_start[1] = i;
140         stat = nc_put_vara_float(ncidvar1_idvar1_startvar1_countvar1);
141         check_err(stat,__LINE__,__FILE__);
142       }
143       x[0] += recx[1] += rec;
144       stat = nc_put_vara_int(ncidx_idx_startx_countx);
145       check_err(stat,__LINE__,__FILE__);
146     }
147     free(var1);
148   }
149
150   stat = nc_close(ncid);
151   check_err(stat,__LINE__,__FILE__);
152
153   printf("ok\n");
154   printf("*** Reading large file %s...", file_name);
155
156   stat = nc_open(file_nameNC_NOWRITE, &ncid);
157   check_err(stat,__LINE__,__FILE__);
158
159   { /* read var1 */
160
161     /*static float avar1[J_LEN];*/
162     static float *avar1 = NULL;
163     avar1 = (float*)malloc(sizeof(float)*J_LEN);
164     static size_t avar1_start[RANK_var1] = {0, 0, 0};
165     static size_t avar1_count[RANK_var1] = {1, 1, J_LEN};
166     static size_t ax_start[RANK_x] = {0, 0};
167     static size_t ax_count[RANK_x] = {1, N_LEN};
168     for(rec=0; rec<NUMRECSrec++) {
169       avar1_start[0] = rec;
170       ax_start[0] = rec;
171       for(i=0; i<I_LENi++) {
172         avar1_start[1] = i;
173         stat = nc_get_vara_float(ncidvar1_idavar1_startavar1_countavar1);
174         check_err(stat,__LINE__,__FILE__);
175         for(j=0; j<J_LENj++)
176         {
177           if (avar1[j] != (float)(j + (rec + 1) * i)) {
178             printf("Error on read, var1[%d, %d, %d] = %g wrong, "
179                    "should be %g !\n", recijavar1[j], (float) (j + (rec + 1)* i));
180             return 1;
181           }
182         }
183       }
184       nc_get_vara_int(ncidx_idax_startax_countx);
185       if(x[0] != (42 + rec) || x[1] != (21+rec)) {
186         printf("Error on read, x[] = %d, %d\n", x[0], x[1]);
187         return 1;
188       }
189     }
190     free(avar1);
191   }
192   stat = nc_close(ncid);
193   check_err(stat,__LINE__,__FILE__);
194
195   printf("ok\n");
196   printf("*** Tests successful!\n");
197
198   /* Delete the file. */
199   (void) remove(file_name);
200
201   return 0;
202}


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