/********************************************************************* * * Copyright (C) 2013, Northwestern University and Argonne National Laboratory * See COPYRIGHT notice in top-level directory. * *********************************************************************/ /* $Id$ */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This example shows how to use a single call of ncmpi_put_varn_float_all() * to write a sequence of one-element requests with arbitrary array indices. * * The compile and run commands are given below, together with an ncmpidump of * the output file. * * % mpicc -O2 -o put_varn_float put_varn_float.c -lpnetcdf * % mpiexec -n 4 ./put_varn_float /pvfs2/wkliao/testfile.nc * % ncmpidump /pvfs2/wkliao/testfile.nc * netcdf testfile { * // file format: CDF-5 (big variables) * dimensions: * Y = 4 ; * X = 10 ; * variables: * int var(Y, X) ; * data: * * var = * 3, 3, 3, 1, 1, 0, 0, 2, 1, 1, * 0, 2, 2, 2, 3, 1, 1, 2, 2, 2, * 1, 1, 2, 3, 3, 3, 0, 0, 1, 1, * 0, 0, 0, 2, 1, 1, 1, 3, 3, 3 ; * } * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include #include #include /* strcpy(), strncpy() */ #include /* getopt() */ #include #include #define NY 4 #define NX 10 #define NDIMS 2 #define ERR {if(err!=NC_NOERR){printf("Error at line %d in %s: %s\n", __LINE__,__FILE__, ncmpi_strerror(err));nerrs++;}} static void usage(char *argv0) { char *help = "Usage: %s [-h] | [-q] [file_name]\n" " [-h] Print help\n" " [-q] Quiet mode (reports when fail)\n" " [filename] output netCDF file name\n"; fprintf(stderr, help, argv0); } int main(int argc, char** argv) { extern int optind; char filename[256]; int i, rank, nprocs, verbose=1, err, nerrs=0; int ncid, cmode, varid, dimid[2], num_reqs; float *buffer; MPI_Offset **starts=NULL; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); /* get command-line arguments */ while ((i = getopt(argc, argv, "hq")) != EOF) switch(i) { case 'q': verbose = 0; break; case 'h': default: if (rank==0) usage(argv[0]); MPI_Finalize(); return 1; } if (argv[optind] == NULL) strcpy(filename, "testfile.nc"); else snprintf(filename, 256, "%s", argv[optind]); if (verbose && nprocs != 4 && rank == 0) printf("Warning: this program is intended to run on 4 processes\n"); /* create a new file for writing ----------------------------------------*/ cmode = NC_CLOBBER; err = ncmpi_create(MPI_COMM_WORLD, filename, cmode, MPI_INFO_NULL, &ncid); ERR /* create a global array of size NY * NX */ err = ncmpi_def_dim(ncid, "Y", NY, &dimid[0]); ERR err = ncmpi_def_dim(ncid, "X", NX, &dimid[1]); ERR err = ncmpi_def_var(ncid, "var", NC_FLOAT, NDIMS, dimid, &varid); ERR err = ncmpi_enddef(ncid); ERR /* pick arbitrary numbers of requests for 4 processes */ num_reqs = 0; if (rank == 0) num_reqs = 8; else if (rank == 1) num_reqs = 13; else if (rank == 2) num_reqs = 9; else if (rank == 3) num_reqs = 10; if (num_reqs > 0) { starts = (MPI_Offset**) malloc(num_reqs* sizeof(MPI_Offset*)); starts[0] = (MPI_Offset*) calloc(num_reqs*NDIMS, sizeof(MPI_Offset)); for (i=1; i 0) { free(starts[0]); free(starts); } /* check if there is any PnetCDF internal malloc residue */ MPI_Offset malloc_size, sum_size; err = ncmpi_inq_malloc_size(&malloc_size); if (err == NC_NOERR) { MPI_Reduce(&malloc_size, &sum_size, 1, MPI_OFFSET, MPI_SUM, 0, MPI_COMM_WORLD); if (rank == 0 && sum_size > 0) printf("heap memory allocated by PnetCDF internally has %lld bytes yet to be freed\n", sum_size); } MPI_Finalize(); return (nerrs > 0); }