Reads particle data from file in parallel using HDF5.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(particle_set), | intent(inout) | :: | this |
Set of resolved particles |
||
| integer, | intent(out) | :: | iter |
Iteration at write |
||
| real(kind=wp), | intent(out) | :: | time |
Time at write |
impure subroutine particle_set_ReadHDF5(this,iter,time) !> Reads particle data from file in parallel using HDF5. use leapUtils, only: stringtool_obj implicit none class(particle_set), intent(inout) :: this !! Set of resolved particles integer, intent(out) :: iter !! Iteration at write real(wp), intent(out) :: time !! Time at write ! Work variables type(stringtool_obj):: stringtool character(len=:), & allocatable :: filename type(hdf5_obj) :: hdf5 integer, allocatable :: buffi(:) integer(leapI8),allocatable :: buffi8(:) real(wp), allocatable :: buffr(:) integer :: n filename = 'Hdf5/'//stringtool%RemoveExtension(this%read_file) ! Initialize HDF5 call hdf5%Initialize(this%parallel) ! Open file call hdf5%Open(filename,'R') ! Read attributes call hdf5%ReadAttributes("/","Time", time) call hdf5%ReadAttributes("/","Iter", iter) call hdf5%ReadAttributes("/","Count",this%count) ! Distribute equally the data on each mpi rank associate(mpi=>this%parallel) this%count_=int(this%count/mpi%nproc) if (mpi%rank%mine.le.mod(this%count,mpi%nproc)) this%count_=this%count_+1 end associate ! Resize the data array to contain read Lagrangian objects call this%Resize(this%count_) ! Allocate buffers allocate(buffi8(this%count_),buffi(this%count_),buffr(this%count_)) ! Read the base Lagrangian object structure if (this%count_.eq.0) then call hdf5%Read("/","id", buffi8) call hdf5%Read("/","x", buffr ) call hdf5%Read("/","y", buffr ) call hdf5%Read("/","z", buffr ) call hdf5%Read("/","i", buffi ) call hdf5%Read("/","j", buffi ) call hdf5%Read("/","k", buffi ) call hdf5%Read("/","vx", buffr ) call hdf5%Read("/","vy", buffr ) call hdf5%Read("/","vz", buffr ) call hdf5%Read("/","wx", buffr ) call hdf5%Read("/","wy", buffr ) call hdf5%Read("/","wz", buffr ) call hdf5%Read("/","d", buffr ) call hdf5%Read("/","s", buffi ) call hdf5%Read("/","rho",buffr ) call hdf5%Read("/","Fhx",buffr ) call hdf5%Read("/","Fhy",buffr ) call hdf5%Read("/","Fhz",buffr ) call hdf5%Read("/","Thx",buffr ) call hdf5%Read("/","Thy",buffr ) call hdf5%Read("/","Thz",buffr ) call hdf5%Read("/","Fcx",buffr ) call hdf5%Read("/","Fcy",buffr ) call hdf5%Read("/","Fcz",buffr ) call hdf5%Read("/","Tcx",buffr ) call hdf5%Read("/","Tcy",buffr ) call hdf5%Read("/","Tcz",buffr ) else select type (particles=>this%p) type is (particle_obj) call hdf5%Read("/","id", buffi8); particles(:)%id = buffi8 call hdf5%Read("/","x", buffr ); particles(:)%p(1) = buffr call hdf5%Read("/","y", buffr ); particles(:)%p(2) = buffr call hdf5%Read("/","z", buffr ); particles(:)%p(3) = buffr call hdf5%Read("/","i", buffi ); particles(:)%c(1) = buffi call hdf5%Read("/","j", buffi ); particles(:)%c(2) = buffi call hdf5%Read("/","k", buffi ); particles(:)%c(3) = buffi call hdf5%Read("/","vx", buffr ); particles(:)%v(1) = buffr call hdf5%Read("/","vy", buffr ); particles(:)%v(2) = buffr call hdf5%Read("/","vz", buffr ); particles(:)%v(3) = buffr call hdf5%Read("/","wx", buffr ); particles(:)%w(1) = buffr call hdf5%Read("/","wy", buffr ); particles(:)%w(2) = buffr call hdf5%Read("/","wz", buffr ); particles(:)%w(3) = buffr call hdf5%Read("/","d", buffr ); particles(:)%d = buffr call hdf5%Read("/","s", buffi ); particles(:)%s = buffi call hdf5%Read("/","rho",buffr ); particles(:)%rho = buffr call hdf5%Read("/","Fhx",buffr ); particles(:)%Fh(1)= buffr call hdf5%Read("/","Fhy",buffr ); particles(:)%Fh(2)= buffr call hdf5%Read("/","Fhz",buffr ); particles(:)%Fh(3)= buffr call hdf5%Read("/","Thx",buffr ); particles(:)%Th(1)= buffr call hdf5%Read("/","Thy",buffr ); particles(:)%Th(2)= buffr call hdf5%Read("/","Thz",buffr ); particles(:)%Th(3)= buffr call hdf5%Read("/","Fcx",buffr ); particles(:)%Fc(1)= buffr call hdf5%Read("/","Fcy",buffr ); particles(:)%Fc(2)= buffr call hdf5%Read("/","Fcz",buffr ); particles(:)%Fc(3)= buffr call hdf5%Read("/","Tcx",buffr ); particles(:)%Tc(1)= buffr call hdf5%Read("/","Tcy",buffr ); particles(:)%Tc(2)= buffr call hdf5%Read("/","Tcz",buffr ); particles(:)%Tc(3)= buffr end select end if deallocate(buffi8,buffi,buffr) ! Close file call hdf5%Close() ! Finalize HDF5 call hdf5%Finalize() ! Set unread variables to zero select type (particles=>this%p) class is (particle_obj) do n=1,this%count_ particles(n)%pold = 0.0_wp particles(n)%vold = 0.0_wp particles(n)%wold = 0.0_wp particles(n)%Fhold = 0.0_wp particles(n)%Thold = 0.0_wp particles(n)%Fcold = 0.0_wp particles(n)%Tcold = 0.0_wp end do end select return end subroutine particle_set_ReadHDF5