diff --git a/src/fckit/module/fckit_mpi.fypp b/src/fckit/module/fckit_mpi.fypp index 462acb4..ef3e421 100644 --- a/src/fckit/module/fckit_mpi.fypp +++ b/src/fckit/module/fckit_mpi.fypp @@ -916,10 +916,10 @@ subroutine alltoallv_${dtype}$_r${rank}$(this,in,scounts,sdispl,out,rcounts,rdis use, intrinsic :: iso_c_binding use fckit_array_module, only: array_view1d class(fckit_mpi_comm), intent(in) :: this - ${ftype}$, intent(in) :: in${dim[rank]}$ - integer(c_int32_t), intent(in) :: scounts(:), sdispl(:) - ${ftype}$, intent(inout) :: out${dim[rank]}$ - integer(c_int32_t), intent(in) :: rcounts(:), rdispl(:) + ${ftype}$, intent(in), target :: in${dim[rank]}$ + integer(c_int32_t), intent(in), target :: scounts(:), sdispl(:) + ${ftype}$, intent(inout), target :: out${dim[rank]}$ + integer(c_int32_t), intent(in), target :: rcounts(:), rdispl(:) ${btype}$, pointer :: view_in(:), view_out(:) ${btype}$ :: mold integer(c_int32_t), pointer :: view_sc(:), view_sd(:) @@ -940,6 +940,19 @@ end subroutine !--------------------------------------------------------------------------------------- +subroutine make_c_string(in_string,out_string) + use, intrinsic :: iso_c_binding, only : c_char, c_null_char + character(len=*), intent(in) :: in_string + character(kind=c_char,len=1), allocatable, intent(out) :: out_string(:) + integer :: i + allocate(out_string(len(in_string)+1)) + out_string = "" + do i = 1, len(in_string) + out_string(i) = in_string(i:i) + end do + out_string(size(out_string)) = c_null_char +end subroutine make_c_string + subroutine broadcast_string(this,buffer,root) !! Broadcast a string ```buffer``` from MPI rank ```root``` @@ -955,14 +968,8 @@ subroutine broadcast_string(this,buffer,root) character(kind=c_char,len=1),allocatable :: c_string(:) integer :: j - allocate(c_string(len(buffer)+1)) - if (this%rank() == root) then - c_string(:)='' - do j=1,len_trim(buffer) - c_string(j) = buffer(j:j) - enddo - c_string(len(buffer)+1) = c_null_char - endif + + call make_c_string(buffer, c_string) call fckit__mpi__broadcast_string(this%CPTR_PGIBUG_A,c_string,int(len(buffer)+1,c_size_t),int(root,c_size_t)) do j=1,len(buffer) buffer(j:j) = c_string(j) @@ -975,7 +982,7 @@ end subroutine function broadcast_file(this,path,root) result(buffer) !! Read a file with given ```path``` on MPI rank ```root``` and broadcast as a ```fckit_buffer``` buffer - use, intrinsic :: iso_c_binding, only : c_int32_t, c_size_t, c_ptr, c_char + use, intrinsic :: iso_c_binding, only : c_int32_t, c_size_t, c_ptr, c_char, c_null_char use fckit_c_interop_module, only : c_str type(fckit_buffer) :: buffer @@ -986,8 +993,12 @@ function broadcast_file(this,path,root) result(buffer) !! File path of file to be broadcast integer(c_int32_t), intent(in) :: root !! MPI rank that reads and broadcasts file + character(kind=c_char,len=1),allocatable :: c_string(:) + integer :: j + + call make_c_string(path, c_string) - buffer = fckit_buffer( fckit__mpi__broadcast_file(this%CPTR_PGIBUG_A,c_str(path),int(root,c_size_t)), share=.true. ) + buffer = fckit_buffer( fckit__mpi__broadcast_file(this%CPTR_PGIBUG_A,c_string,int(root,c_size_t)), share=.true. ) call buffer%return() end function