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

  1. a mcve.
  2. 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

Popular posts from this blog

neo4j - finding mutual friends in a cypher statement starting with three or more persons -

php - How to remove letter in front of the word laravel -

minify - Minimizing css files -