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 fix of bug involving creation of a file with pnetcdf APIs,
6   then opening and modifying the file with netcdf.
7
8   Author: Wei-keng Liao.
9*/
10
11#include <nc_tests.h>
12#include "err_macros.h"
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16#include <mpi.h>
17#include <netcdf.h>
18#include <netcdf_par.h>
19#include <assert.h>
20
21#define NVARS 6
22#define NX    5
23#define FILENAME "tst_pnetcdf.nc"
24
25int main(int argc, char* argv[])
26{
27    int ijranknprocsncidcmodevarid[NVARS], dimid[2], *buf;
28    int err = 0;
29    char str[32];
30    size_t start[2], count[2];
31    MPI_Comm comm=MPI_COMM_SELF;
32    MPI_Info info=MPI_INFO_NULL;
33
34    printf("\n*** Testing bug fix with changing pnetcdf variable offsets...");
35
36    MPI_Init(&argc,&argv);
37    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
38    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
39
40    if (nprocs > 1 && rank == 0)
41        printf("This test program is intended to run on ONE process\n");
42    if (rank > 0) goto fn_exit;
43
44    /* first, use PnetCDF to create a file with default header/variable alignment */
45#ifdef DISABLE_PNETCDF_ALIGNMENT
46    MPI_Info_create(&info);
47    MPI_Info_set(info, "nc_header_align_size", "1");
48    MPI_Info_set(info, "nc_var_align_size",    "1");
49#endif
50
51    cmode = NC_PNETCDF | NC_CLOBBER;
52    if (nc_create_par(FILENAMEcmodecomminfo, &ncid)) ERR_RET;
53
54    /* define dimension */
55    if (nc_def_dim(ncid, "Y", NC_UNLIMITED, &dimid[0])) ERR;
56    if (nc_def_dim(ncid, "X", NX,           &dimid[1])) ERR;
57
58    /* Odd numbers are fixed variables, even numbers are record variables */
59    for (i=0; i<NVARSi++) {
60        if (i%2) {
61            sprintf(str,"fixed_var_%d",i);
62            if (nc_def_var(ncidstrNC_INT, 1, dimid+1, &varid[i])) ERR;
63        }
64        else {
65            sprintf(str,"record_var_%d",i);
66            if (nc_def_var(ncidstrNC_INT, 2, dimid, &varid[i])) ERR;
67        }
68    }
69    if (nc_enddef(ncid)) ERR;
70
71    for (i=0; i<NVARSi++) {
72        /* Note NC_INDEPENDENT is the default */
73        if (nc_var_par_access(ncidvarid[i], NC_INDEPENDENT)) ERR;
74    }
75
76    /* write all variables */
77    buf = (int*) malloc(NX * sizeof(int));
78    for (i=0; i<NVARSi++) {
79        for (j=0; j<NXj++) buf[j] = i*10 + j;
80        if (i%2) {
81            start[0] = 0; count[0] = NX;
82            if (nc_put_vara_int(ncidvarid[i], startcountbuf)) ERR;
83        }
84        else {
85            start[0] = 0; start[1] = 0;
86            count[0] = 1; count[1] = NX;
87            if (nc_put_vara_int(ncidvarid[i], startcountbuf)) ERR;
88        }
89    }
90    if (nc_close(ncid)) ERR;
91    if (info != MPI_INFO_NULLMPI_Info_free(&info);
92
93    /* re-open the file with netCDF (parallel) and enter define mode */
94    if (nc_open_par(FILENAMENC_WRITE|NC_PNETCDFcomminfo, &ncid)) ERR_RET;
95    if (nc_redef(ncid)) ERR;
96
97    /* add attributes to make header grow */
98    for (i=0; i<NVARSi++) {
99        sprintf(str, "annotation_for_var_%d",i);
100        if (nc_put_att_text(ncidvarid[i], "text_attr", strlen(str), str)) ERR;
101    }
102    if (nc_enddef(ncid)) ERR;
103
104    /* read variables and check their contents */
105    for (i=0; i<NVARSi++) {
106        for (j=0; j<NXj++) buf[j] = -1;
107        if (i%2) {
108            start[0] = 0; count[0] = NX;
109            if (nc_get_var_int(ncidvarid[i], buf)) ERR;
110            for (j=0; j<NXj++)
111                if (buf[j] != i*10 + j)
112                    printf("unexpected read value var i=%d buf[j=%d]=%d should be %d\n",i,j,buf[j],i*10+j);
113        }
114        else {
115            start[0] = 0; start[1] = 0;
116            count[0] = 1; count[1] = NX;
117            if (nc_get_vara_int(ncidvarid[i], startcountbuf)) ERR;
118            for (j=0; j<NXj++)
119                if (buf[j] != i*10+j)
120                    printf("unexpected read value var i=%d buf[j=%d]=%d should be %d\n",i,j,buf[j],i*10+j);
121        }
122    }
123    if (nc_close(ncid)) ERR;
124
125fn_exit:
126    MPI_Finalize();
127    SUMMARIZE_ERR;
128    FINAL_RESULTS;
129    return 0;
130}
131
132/*
133    Compile:
134        mpicc -g -o nc_pnc nc_pnc.c -lnetcdf -lcurl -lhdf5_hl -lhdf5 -lpnetcdf -lz -lm
135
136    Run:
137        nc_pnc
138
139    Standard Output:
140        At the time of this test is written, I used the following libraries.
141            HDF5    version 1.8.10
142            netCDF  version 4.2.1.1 and
143            PnetCDF version 1.3.1
144
145        If macro DISABLE_PNETCDF_ALIGNMENT is defined (i.e. disable PnetCDF
146        alignment) then there is no standard output.
147
148        If macro DISABLE_PNETCDF_ALIGNMENT is NOT defined (i.e. default PnetCDF
149        alignment) then this test reports unexpected read values below.
150
151         unexpected read value var i=1 buf[j=0]=0 should be 10
152         unexpected read value var i=1 buf[j=1]=0 should be 11
153         unexpected read value var i=1 buf[j=2]=0 should be 12
154         unexpected read value var i=1 buf[j=3]=0 should be 13
155         unexpected read value var i=1 buf[j=4]=0 should be 14
156         unexpected read value var i=3 buf[j=0]=0 should be 30
157         unexpected read value var i=3 buf[j=1]=0 should be 31
158         unexpected read value var i=3 buf[j=2]=0 should be 32
159         unexpected read value var i=3 buf[j=3]=0 should be 33
160         unexpected read value var i=3 buf[j=4]=0 should be 34
161         unexpected read value var i=5 buf[j=0]=0 should be 50
162         unexpected read value var i=5 buf[j=1]=0 should be 51
163         unexpected read value var i=5 buf[j=2]=0 should be 52
164         unexpected read value var i=5 buf[j=3]=0 should be 53
165         unexpected read value var i=5 buf[j=4]=0 should be 54
166*/


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