1/*
2  Copyright 2011, UCAR/Unidata
3  See COPYRIGHT file for copying and redistribution conditions.
4
5  This is part of netCDF.
6
7  This program tests for a bug discovered with nofill mode that failed
8  only on file systems with block size in a particular range.  This version
9  of the test showed failure using a normal nc_create() call rather tha
10  a special nc__create() call to change the blksize.
11*/
12
13#include <config.h>
14#include <nc_tests.h>
15#include "err_macros.h"
16#include <stdio.h>
17#include <limits.h>
18#include <stdlib.h>
19#include <errno.h>
20#include <netcdf.h>
21
22#define FILE_NAME "tst_nofill3.nc"
23#define TIME_LEN 1
24/* Change any of these values and the bug doesn't happen or requires a
25 * larger disk block size (set with the "chunksize" parameter to
26 * nc__create()) to see. Similarly, adding attributes or additional
27 * variables will either make the bug go away or require a larger disk
28 * block size to observe.  But not just any larger disk block size; it
29 * will have to be in a relatively narrow range. */
30#define LON_LEN 11
31#define LAT_LEN 11
32#define LVL_LEN 34
33
34int
35create_file(char *file_name, int fill_mode)
36{
37   int ncid;
38   int lon_dimlat_dimlvl_dimtime_dim;
39   int time_idzonal_wnd_id;
40   int i;
41
42   /* rank (number of dimensions) for each variable */
43#  define RANK_time 1
44#  define RANK_zonal_wnd 3
45
46   /* variable shapes */
47   int zonal_wnd_dims[RANK_zonal_wnd];
48   size_t zonal_wnd_start[RANK_zonal_wnd];
49   size_t zonal_wnd_count[RANK_zonal_wnd];
50   float zonal_wnd[LON_LEN*LAT_LEN];
51   int time[TIME_LEN];
52
53   for(i = 0; i < TIME_LENi++) {
54       time[i] = 1;
55   }
56   if (nc_create(file_nameNC_CLOBBER, &ncid)) ERR;
57   if (nc_set_fill(ncidfill_modeNULL)) ERR;
58
59   /* define dimensions */
60   if (nc_def_dim(ncid, "lon", LON_LEN, &lon_dim)) ERR;
61   if (nc_def_dim(ncid, "lat", LAT_LEN, &lat_dim)) ERR;
62   if (nc_def_dim(ncid, "lvl", LVL_LEN, &lvl_dim)) ERR;
63   if (nc_def_dim(ncid, "time", TIME_LEN, &time_dim)) ERR;
64
65   /* define variables */
66   if (nc_def_var(ncid, "time", NC_INTRANK_time, &time_dim, &time_id)) ERR;
67
68   zonal_wnd_dims[0] = lvl_dim;
69   zonal_wnd_dims[1] = lat_dim;
70   zonal_wnd_dims[2] = lon_dim;
71   if (nc_def_var(ncid, "zonal_wnd", NC_FLOATRANK_zonal_wndzonal_wnd_dims, &zonal_wnd_id)) ERR;
72
73   if (nc_enddef (ncid)) ERR;
74   if (nc_put_var_int(ncidtime_id, time)) ERR;
75   /* Bug exposed when last value written. */
76   {
77      int izw;
78
79      i = LVL_LEN - 1;
80      for(izw = 0; izw < LAT_LEN * LON_LENizw++) {
81  zonal_wnd[izw] = 100 + i;
82      }
83      zonal_wnd_start[0] = i;
84      zonal_wnd_start[1] = 0;
85      zonal_wnd_start[2] = 0;
86      zonal_wnd_count[0] = 1;
87      zonal_wnd_count[1] = LAT_LEN;
88      zonal_wnd_count[2] = LON_LEN;
89      if (nc_put_vara_float(ncidzonal_wnd_idzonal_wnd_startzonal_wnd_countzonal_wnd)) ERR;
90   }
91   if (nc_close(ncid)) ERR;
92   return 0;
93}
94
95int
96main(int argc, char **argv)
97{
98   printf("\n*** Testing nofill mode.\n");
99   printf("*** Create file in nofill mode using nc_create()...");
100   {
101       int ncidvarid;
102      int data[TIME_LEN];
103
104      if (create_file(FILE_NAMENC_NOFILL)) ERR;
105      if (nc_open(FILE_NAME, 0, &ncid)) ERR;
106      if (nc_inq_varid(ncid, "time", &varid)) ERR;
107      if (nc_get_var(ncidvariddata)) ERR;
108      if (data[0] != 1) ERR; /* value overwritten by zero due to NOFILL bug */
109      if (nc_close(ncid)) ERR;
110   }
111   SUMMARIZE_ERR;
112   FINAL_RESULTS;
113}


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