parallel processing - HDF5 Real attribute writing in Fortran -
i trying write attribute in hdf file, code manages write proper value attribute if of type integer, not reals. code
! number of processes assumed 4 ! program dataset_by_chunk use hdf5 ! module contains necessary modules ! use mpi implicit none include 'mpif.h' character(len=7), parameter :: filename = "test.h5" ! file name character(len=9), parameter :: dsetname = "data_test" ! dataset name integer(hsize_t), dimension(1) :: data_dims integer(hid_t) :: file_id ! file identifier integer(hid_t) :: dset_id ! dataset identifier integer(hid_t) :: filespace ! dataspace identifier in file integer(hid_t) :: memspace ! dataspace identifier in memory integer(hid_t) :: plist_id ! property list identifier integer(hid_t) :: attr_id ! attribute identifier integer(hid_t) :: aspace_id ! attribute dataspace identifier integer(hid_t) :: atype_id ! attribute dataspace identifier integer(hsize_t), dimension(2) :: dimsf = (/4,8/) ! dataset dimensions ! in file. ! integer, dimension(7) :: dimsfi = (/4,8,0,0,0,0,0/) integer(hsize_t), dimension (2) :: dimsfi = (/4,8/) integer(hsize_t), dimension(2) :: chunk_dims = (/2,4/) ! chunks dimensions integer(hsize_t), dimension(2) :: count integer(hssize_t), dimension(2) :: offset integer(hsize_t), dimension(2) :: stride integer(hsize_t), dimension(2) :: block integer(hsize_t), dimension(1) :: adims ! attribute dimension integer :: arank = 1 ! attribure rank integer(size_t) :: attrlen ! length of attribute string character(len=80) :: attr_data ! attribute data integer, allocatable :: data (:,:) ! data write integer :: rank = 2 ! dataset rank real re integer :: error, error_n ! error flags ! ! mpi definitions , calls. ! integer :: mpierror ! mpi error flag integer :: comm, info integer :: mpi_size, mpi_rank comm = mpi_comm_world info = mpi_info_null call mpi_init(mpierror) call mpi_comm_size(comm, mpi_size, mpierror) call mpi_comm_rank(comm, mpi_rank, mpierror) ! quit if mpi_size not 4 if (mpi_size .ne. 4) write(*,*) 'this example set use 4 processes' write(*,*) 'quitting....' goto 100 endif attr_data = "dataset character attribute" ! ! initialize hdf5 library , fortran interfaces. ! call h5open_f(error) ! ! setup file access property list parallel i/o access. ! call h5pcreate_f(h5p_file_access_f, plist_id, error) call h5pset_fapl_mpio_f(plist_id, comm, info, error) ! ! create file collectively. ! call h5fcreate_f(trim(filename), h5f_acc_trunc_f, file_id, error, access_prp = plist_id) call h5pclose_f(plist_id, error) ! ! create attribute ! re = 20.0 ! ! create scalar data space attribute. ! call h5screate_f(h5s_scalar_f,aspace_id,error) adims=80 ! ----------------------------- ! reynolds number call h5acreate_f(file_id,'re',h5t_native_double,aspace_id, & attr_id, error) call h5awrite_f(attr_id,h5t_native_double,re,adims,error) call h5aclose_f(attr_id, error) ! ! terminate access data space. ! call h5sclose_f(aspace_id, error) ! ! create data space dataset. ! call h5screate_simple_f(rank, dimsf, filespace, error) call h5screate_simple_f(rank, chunk_dims, memspace, error) ! ! create chunked dataset. ! call h5pcreate_f(h5p_dataset_create_f, plist_id, error) call h5pset_chunk_f(plist_id, rank, chunk_dims, error) call h5dcreate_f(file_id, dsetname, h5t_native_integer, filespace, & dset_id, error, plist_id) call h5sclose_f(filespace, error) ! ! each process defines dataset in memory , writes hyperslab ! in file. ! stride(1) = 1 stride(2) = 1 count(1) = 1 count(2) = 1 block(1) = chunk_dims(1) block(2) = chunk_dims(2) if (mpi_rank .eq. 0) offset(1) = 0 offset(2) = 0 endif if (mpi_rank .eq. 1) offset(1) = chunk_dims(1) offset(2) = 0 endif if (mpi_rank .eq. 2) offset(1) = 0 offset(2) = chunk_dims(2) endif if (mpi_rank .eq. 3) offset(1) = chunk_dims(1) offset(2) = chunk_dims(2) endif ! ! select hyperslab in file. ! call h5dget_space_f(dset_id, filespace, error) call h5sselect_hyperslab_f (filespace, h5s_select_set_f, offset, count, error, & stride, block) ! ! initialize data buffer trivial data. ! allocate (data(chunk_dims(1),chunk_dims(2))) data = mpi_rank + 1 ! ! create property list collective dataset write ! call h5pcreate_f(h5p_dataset_xfer_f, plist_id, error) call h5pset_dxpl_mpio_f(plist_id, h5fd_mpio_collective_f, error) ! ! write dataset collectively. ! call h5dwrite_f(dset_id, h5t_native_integer, data, dimsfi, error, & file_space_id = filespace, mem_space_id = memspace, xfer_prp = plist_id) ! ! write dataset independently. ! ! call h5dwrite_f(dset_id, h5t_native_integer, data, dimsfi,error, & ! file_space_id = filespace, mem_space_id = memspace) ! ! deallocate data buffer. ! deallocate(data) ! ! close dataspaces. ! call h5sclose_f(filespace, error) call h5sclose_f(memspace, error) ! ! close dataset. ! call h5dclose_f(dset_id, error) ! ! close property list. ! call h5pclose_f(plist_id, error) ! ! close file. ! call h5fclose_f(file_id, error) ! ! close fortran interfaces , hdf5 library. ! call h5close_f(error) 100 continue call mpi_finalize(mpierror) end program dataset_by_chunk the program runs satisfactorily, when checking in matlab h5disp, that:
attributes: 're': 0.000000
any suggestions how fix great! lot
a minimal, complete, , verifiable example (mcve) both (to spot mistake) , figure out doing.
so in saying that, here's one. please note there no error checking, bad, bad, bad.
program fa use hdf5 implicit none character(len=8), parameter :: filename = "test.h5" integer(hid_t) :: file_id integer(hid_t) :: attr_id integer(hid_t) :: aspace_id integer(size_t), dimension(1) :: adims = (/0/) integer :: ierr real :: re re = 20.0 call h5open_f(ierr) call h5fcreate_f(trim(filename), h5f_acc_trunc_f, file_id, ierr) call h5screate_f(h5s_scalar_f, aspace_id, ierr) call h5acreate_f(file_id, 'reynolds number', h5t_native_real, & aspace_id, attr_id, ierr) call h5awrite_f(attr_id, h5t_native_real, re, adims, ierr) call h5aclose_f(attr_id, ierr) call h5sclose_f(aspace_id, ierr) call h5fclose_f(file_id, ierr) call h5close_f(ierr) end program fa if compile, run dump file:
$ h5fc -o fa fa.f90 $ ./fa $ h5dump test.h5 hdf5 "test.h5" { group "/" { attribute "reynolds number" { datatype h5t_ieee_f32le dataspace scalar data { (0): 20 } } } } now question have ask code why adims set 80?
i highly suggest 3 things
- a mcve.
- error checking.
in regards using mpi should serial version (within reason) working parallelize it. yes, know might near impossible, if go route make life easier (at least begin with).
Comments
Post a Comment