1/* This program adds two new variables to an existing netCDF file.
2 * It is used to test if netCDF can correctly calculate the file offsets
3 * for the two new variables, in particular for files that align the
4 * fix-size variables to a boundary larger than 4 bytes, for instance
5 * a file created by PnetCDF with defaut alignment of 512 bytes.
6 *
7 * This program should run after tst_pnetcdf.c and takes the output file
8 * from tst_pnetcdf.c as input on the command-line.
9 *
10 * To check the file offsets for all variables, adding a printf statement is
11 * necessary in netcdf-4.3.3.1/libsrc/nc3internal.c around line 222,
12 * for example,
13 * printf("var %s: begin=%ld len=%ld end=%ld\n",(*vpp)->name->cp, (*vpp)->begin, (*vpp)->len, (*vpp)->begin+(*vpp)->len);
14 *
15 * Check the first new variable's begin to see whether it is less than
16 * the last variable's offset in the existing file.
17 */
18#include <stdio.h>
19#include <stdlib.h>
20#include <netcdf.h>
21
22#define ERR {if(err!=NC_NOERR){printf("Error at line=%d: %s\n", __LINE__nc_strerror(err));}}
23
24int main(int argc, char** argv) {
25    int ijerrnerrsncidvarid[5], dimid[2];
26    int old_buf[3][5], get_buf[3][5], new_buf[1024];
27
28    if (argc != 2) {
29        printf("Usage: %s [filename]\n",argv[0]);
30        exit(0);
31    }
32
33    err = nc_open(argv[1], NC_WRITE, &ncid); ERR
34
35    /* read all fixed-size variables */
36    err = nc_inq_varid(ncid, "fixed_var_1", &varid[0]);
37    err = nc_inq_varid(ncid, "fixed_var_3", &varid[1]);
38    err = nc_inq_varid(ncid, "fixed_var_5", &varid[2]);
39    err = nc_get_var_int(ncidvarid[0], old_buf[0]); ERR
40    err = nc_get_var_int(ncidvarid[1], old_buf[1]); ERR
41    err = nc_get_var_int(ncidvarid[2], old_buf[2]); ERR
42
43    err = nc_redef(ncid); ERR
44
45    /* add 2 new dimensions */
46    err = nc_def_dim(ncid, "new_dim_1", 32, &dimid[0]); ERR
47    err = nc_def_dim(ncid, "new_dim_2", 32, &dimid[1]); ERR
48
49    /* add 2 new dimensions */
50    err = nc_def_var(ncid, "new_var1", NC_INT,   2, dimid, &varid[3]); ERR
51    err = nc_def_var(ncid, "new_var2", NC_FLOAT, 2, dimid, &varid[4]); ERR
52    err = nc_enddef(ncid); ERR
53
54    /* write more than 512 bytes (the default alignment used in PnetCDF) */
55    for (i=0; i<1024; i++) new_buf[i] = -1;
56    err = nc_put_var_int(ncidvarid[3], new_buf); ERR
57
58    /* read and check all variables from the original file */
59    err = nc_get_var_int(ncidvarid[0], get_buf[0]); ERR
60    err = nc_get_var_int(ncidvarid[1], get_buf[1]); ERR
61    err = nc_get_var_int(ncidvarid[2], get_buf[2]); ERR
62
63    nerrs = 0;
64    for (i=0; i<3; i++) {
65        char varname[32];
66        sprintf(varname, "fixed_var_%d",2*i+1);
67        for (j=0; j<5; j++) {
68            if (get_buf[i][j] != old_buf[i][j]) {
69                printf("Error in %s line %d: expecting %s[%d]=%d but got %d\n",
70                       __FILE__,__LINE__,varname,j,old_buf[i][j],get_buf[i][j]);
71                nerrs++;
72            }
73        }
74    }
75
76    err = nc_close(ncid); ERR
77
78    if (nerrs > 0) exit(-1);
79/*
80    SUMMARIZE_ERR;
81    FINAL_RESULTS;
82*/
83    return 0;
84}


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