/* * Independent read/write for fixed dimension datasets. */ #include /* * Example of using the parallel HDF5 library to create two datasets * in one HDF5 files with parallel MPIO access support. * The Datasets are of sizes (number-of-mpi-processes x DIM1) x DIM2. * Each process controls only a slab of size DIM1 x DIM2 within each * dataset. */ void dataset_writeInd(char *filename) { hid_t fid; /* HDF5 file ID */ hid_t acc_tpl; /* File access templates */ hid_t sid; /* Dataspace ID */ hid_t file_dataspace; /* File dataspace ID */ hid_t mem_dataspace; /* memory dataspace ID */ hid_t dataset1, dataset2; /* Dataset ID */ hsize_t dims[RANK] = {DIM1,DIM2}; /* dataset dim sizes */ hsize_t dimslocal1[RANK] = {DIM1,DIM2}; /* local dataset dim sizes */ DATATYPE data_array1[DIM1][DIM2]; /* data buffer */ hssize_t start[RANK]; /* for hyperslab setting */ hsize_t count[RANK], stride[RANK]; /* for hyperslab setting */ herr_t ret; /* Generic return value */ int i, j; int mpi_size, mpi_rank; char *fname; MPI_Comm comm = MPI_COMM_WORLD; MPI_Info info = MPI_INFO_NULL; if (verbose) printf("Independent write test on file %s\n", filename); /* set up MPI parameters */ MPI_Comm_size(MPI_COMM_WORLD,&mpi_size); MPI_Comm_rank(MPI_COMM_WORLD,&mpi_rank); /* ---------------------------------------- * CREATE AN HDF5 FILE WITH PARALLEL ACCESS * ---------------------------------------*/ /* setup file access template with parallel IO access. */ acc_tpl = H5Pcreate (H5P_FILE_ACCESS); VRFY((acc_tpl != FAIL), "H5Pcreate access succeeded"); /* set Parallel access with communicator */ ret = H5Pset_mpi(acc_tpl, comm, info); VRFY((ret != FAIL), "H5Pset_mpi succeeded"); /* create the file collectively */ fid=H5Fcreate(filename,H5F_ACC_TRUNC,H5P_DEFAULT,acc_tpl); VRFY((fid != FAIL), "H5Fcreate succeeded"); /* Release file-access template */ ret=H5Pclose(acc_tpl); VRFY((ret != FAIL), ""); /* --------------------------------------------- * Define the dimensions of the overall datasets * and the slabs local to the MPI process. * ------------------------------------------- */ /* setup dimensionality object */ sid = H5Screate_simple (RANK, dims, NULL); VRFY((sid != FAIL), "H5Screate_simple succeeded"); /* create a dataset collectively */ dataset1 = H5Dcreate(fid, DATASETNAME1, H5T_NATIVE_INT, sid, H5P_DEFAULT); VRFY((dataset1 != FAIL), "H5Dcreate succeeded"); /* create another dataset collectively */ dataset2 = H5Dcreate(fid, DATASETNAME2, H5T_NATIVE_INT, sid, H5P_DEFAULT); VRFY((dataset2 != FAIL), "H5Dcreate succeeded"); /* * To test the independent orders of writes between processes, all * even number processes write to dataset1 first, then dataset2. * All odd number processes write to dataset2 first, then dataset1. */ /* set up dimensions of the slab this process accesses */ slab_set(mpi_rank, mpi_size, start, count, stride, BYROW); /* put some trivial data in the data_array */ dataset_fill(start, count, stride, &data_array1[0][0]); MESG("data_array initialized"); /* create a file dataspace independently */ file_dataspace = H5Dget_space (dataset1); VRFY((file_dataspace != FAIL), "H5Dget_space succeeded"); ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, NULL); VRFY((ret != FAIL), "H5Sset_hyperslab succeeded"); /* create a memory dataspace independently */ mem_dataspace = H5Screate_simple (RANK, count, NULL); VRFY((mem_dataspace != FAIL), ""); /* write data independently */ ret = H5Dwrite(dataset1, H5T_NATIVE_INT, mem_dataspace, file_dataspace, H5P_DEFAULT, data_array1); VRFY((ret != FAIL), "H5Dwrite dataset1 succeeded"); /* write data independently */ ret = H5Dwrite(dataset2, H5T_NATIVE_INT, mem_dataspace, file_dataspace, H5P_DEFAULT, data_array1); VRFY((ret != FAIL), "H5Dwrite dataset2 succeeded"); /* release dataspace ID */ H5Sclose(file_dataspace); /* close dataset collectively */ ret=H5Dclose(dataset1); VRFY((ret != FAIL), "H5Dclose1 succeeded"); ret=H5Dclose(dataset2); VRFY((ret != FAIL), "H5Dclose2 succeeded"); /* release all IDs created */ H5Sclose(sid); /* close the file collectively */ H5Fclose(fid); } /* Example of using the parallel HDF5 library to read a dataset */ void dataset_readInd(char *filename) { hid_t fid; /* HDF5 file ID */ hid_t acc_tpl; /* File access templates */ hid_t sid; /* Dataspace ID */ hid_t file_dataspace; /* File dataspace ID */ hid_t mem_dataspace; /* memory dataspace ID */ hid_t dataset1, dataset2; /* Dataset ID */ hsize_t dims[] = {DIM1,DIM2}; /* dataset dim sizes */ DATATYPE data_array1[DIM1][DIM2]; /* data buffer */ DATATYPE data_origin1[DIM1][DIM2]; /* expected data buffer */ hssize_t start[RANK]; /* for hyperslab setting */ hsize_t count[RANK], stride[RANK]; /* for hyperslab setting */ herr_t ret; /* Generic return value */ int i, j; int mpi_size, mpi_rank; MPI_Comm comm = MPI_COMM_WORLD; MPI_Info info = MPI_INFO_NULL; if (verbose) printf("Independent read test on file %s\n", filename); /* set up MPI parameters */ MPI_Comm_size(MPI_COMM_WORLD,&mpi_size); MPI_Comm_rank(MPI_COMM_WORLD,&mpi_rank); /* setup file access template */ acc_tpl = H5Pcreate (H5P_FILE_ACCESS); VRFY((acc_tpl != FAIL), ""); /* set Parallel access with communicator */ ret = H5Pset_mpi(acc_tpl, comm, info); VRFY((ret != FAIL), ""); /* open the file collectively */ fid=H5Fopen(filename,H5F_ACC_RDONLY,acc_tpl); VRFY((fid != FAIL), ""); /* Release file-access template */ ret=H5Pclose(acc_tpl); VRFY((ret != FAIL), ""); /* open the dataset1 collectively */ dataset1 = H5Dopen(fid, DATASETNAME1); VRFY((dataset1 != FAIL), ""); /* open another dataset collectively */ dataset2 = H5Dopen(fid, DATASETNAME1); VRFY((dataset2 != FAIL), ""); /* set up dimensions of the slab this process accesses */ slab_set(mpi_rank, mpi_size, start, count, stride, BYROW); /* create a file dataspace independently */ file_dataspace = H5Dget_space (dataset1); VRFY((file_dataspace != FAIL), ""); ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, NULL); VRFY((ret != FAIL), ""); /* create a memory dataspace independently */ mem_dataspace = H5Screate_simple (RANK, count, NULL); VRFY((mem_dataspace != FAIL), ""); /* fill dataset with test data */ dataset_fill(start, count, stride, &data_origin1[0][0]); /* read data independently */ ret = H5Dread(dataset1, H5T_NATIVE_INT, mem_dataspace, file_dataspace, H5P_DEFAULT, data_array1); VRFY((ret != FAIL), ""); /* verify the read data with original expected data */ ret = dataset_vrfy(start, count, stride, &data_array1[0][0], &data_origin1[0][0]); if (ret) nerrors++; /* read data independently */ ret = H5Dread(dataset2, H5T_NATIVE_INT, mem_dataspace, file_dataspace, H5P_DEFAULT, data_array1); VRFY((ret != FAIL), ""); /* verify the read data with original expected data */ ret = dataset_vrfy(start, count, stride, &data_array1[0][0], &data_origin1[0][0]); if (ret) nerrors++; /* close dataset collectively */ ret=H5Dclose(dataset1); VRFY((ret != FAIL), ""); ret=H5Dclose(dataset2); VRFY((ret != FAIL), ""); /* release all IDs created */ H5Sclose(file_dataspace); /* close the file collectively */ H5Fclose(fid); }