Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 25 additions & 14 deletions src/fckit/module/fckit_mpi.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -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(:)
Expand All @@ -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```

Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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

Expand Down
Loading