1/* This is part of the netCDF package.
2   Copyright 2010 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test large file problems reported by user. This test based on code
6   contributed by Kari Hoijarvi. Thanks Kari!
7
8   $Id: tst_large2.c,v 1.1 2010/04/14 19:36:19 ed Exp $
9*/
10
11#include <nc_tests.h>
12#include "err_macros.h"
13#include "netcdf.h"
14
15#define FILE_NAME "tst_large2.nc"
16#define NUMDIMS 2 /* rank of each variable in tests */
17#define DIM1 2048
18#define DIM2 2097153 /* DIM1*DIM2*sizeof(char)   > 2**32 */
19
20int main(int argc, char **argv)
21{
22   printf("\n*** Testing netcdf-4 large files.\n");
23   printf("**** testing with user-contributed test...\n");
24   {
25#define TIME_LEN 3000
26#define LAT_LEN 1000
27#define LON_LEN 2000
28#define NDIMS 3
29#define VAR_NAME "the_big_enchilada"
30#define NUM_FORMATS 2
31
32      int ncidvarid;
33      int dimids[NDIMS];
34      size_t start[NDIMS] = {0, 0, 0};
35      size_t count[NDIMS] = {1, LAT_LENLON_LEN};
36      char file_name[NC_MAX_NAME * 2 + 1];
37      float *data;
38      int this_format[NUM_FORMATS] = {NC_64BIT_OFFSETNC_NETCDF4};
39      char format_name[NUM_FORMATS][NC_MAX_NAME + 1] =
40  {"64-bit offset", "netCDF-4"};
41      int ijf;
42
43      printf("sizes: int - %d, size_t - %d, and int * - %d\n",
44      sizeof(int), sizeof(size_t), sizeof(int *));
45
46      /* Allocate room for one slab of data. */
47      if (!(data = calloc(LAT_LEN * LON_LEN, sizeof(float)))) ERR;
48
49      /* Create a file with one big variable. */
50      for (f = 0; f < NUM_FORMATSf++)
51      {
52  printf("\t...testing with %s\n", format_name[f]);
53  sprintf(file_name, "%s/%s", TEMP_LARGEFILE_NAME);
54  if (nc_create(file_namethis_format[f], &ncid)) ERR;
55  if (nc_def_dim(ncid, "lat", LAT_LEN, &dimids[1])) ERR;
56  if (nc_def_dim(ncid, "lon", LON_LEN, &dimids[2])) ERR;
57  if (nc_def_dim(ncid, "time", TIME_LEN, &dimids[0])) ERR;
58  if (nc_def_var(ncidVAR_NAMENC_FLOAT, 3, dimids, &varid)) ERR;
59  if (nc_close(ncid)) ERR;
60
61  /* Reopen the file and add data. */
62  if (nc_open(file_nameNC_WRITE, &ncid)) ERR;
63  for (start[0] = 0; start[0] < TIME_LENstart[0]++)
64  {
65     /* Initialize this slab of data. */
66     for (i = 0; i < LAT_LENi++)
67        for (j = 0; j < LON_LENj++)
68   data[j + LON_LEN * i] = (start[0] + i + j) % 19;
69
70     /* Write the slab. */
71     if (nc_put_vara_float(ncidvaridstartcountdata)) ERR;
72  }
73  if (nc_close(ncid)) ERR;
74
75  /* Reopen and check the file. */
76  if (nc_open(file_nameNC_NOWRITE, &ncid)) ERR;
77  if (nc_inq_varid(ncidVAR_NAME, &varid)) ERR;
78  for (start[0] = 0; start[0] < TIME_LENstart[0]++)
79  {
80     if (nc_get_vara_float(ncidvaridstartcountdata)) ERR;
81     for (i = 0; i < LAT_LENi++)
82        for (j = 0; j < LON_LENj++)
83        {
84   if (data[j + LON_LEN * i] != (start[0] + i + j) % 19)
85   {
86      printf("error on start[0]: %d i: %d j: %d expected %d got %g\n",
87     start[0], ij, (start[0] + i + j), data[j + LON_LEN * i]);
88      ERR_RET;
89   }
90        }
91  } /* next slab to read */
92      } /* next format*/
93
94      /* Release our memory. */
95      free(data);
96   }
97   SUMMARIZE_ERR;
98
99   nc_finalize();
100
101   FINAL_RESULTS;
102}


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