From 1634354583845c3fc9c1274466a3f63331d02450 Mon Sep 17 00:00:00 2001 From: DJDavies2 Date: Sat, 4 Apr 2026 13:45:14 +0100 Subject: [PATCH 1/6] Fix cargo-culted from broadcast_string --- src/fckit/module/fckit_mpi.fypp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/fckit/module/fckit_mpi.fypp b/src/fckit/module/fckit_mpi.fypp index 462acb4..e85b7b7 100644 --- a/src/fckit/module/fckit_mpi.fypp +++ b/src/fckit/module/fckit_mpi.fypp @@ -975,7 +975,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 +986,18 @@ 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 + allocate(c_string(len(path)+1)) + if (this%rank() == root) then + c_string(:)='' + do j=1,len_trim(path) + c_string(j) = path(j:j) + enddo + c_string(len(path)+1) = c_null_char + endif - 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 From 26b0f4a85438866e5423cb798fa11da7f42b2765 Mon Sep 17 00:00:00 2001 From: DJDavies2 Date: Sat, 4 Apr 2026 15:43:27 +0100 Subject: [PATCH 2/6] Create subroutine --- src/fckit/module/fckit_mpi.fypp | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/fckit/module/fckit_mpi.fypp b/src/fckit/module/fckit_mpi.fypp index e85b7b7..c4e9908 100644 --- a/src/fckit/module/fckit_mpi.fypp +++ b/src/fckit/module/fckit_mpi.fypp @@ -940,6 +940,18 @@ end subroutine !--------------------------------------------------------------------------------------- +subroutine make_c_string(f_string,c_string) + use, intrinsic :: iso_c_binding, only : c_char, c_null_char + character(len=*), intent(in) :: f_string + character(kind=c_char,len=1), allocatable, intent(out) :: c_string + integer :: i + allocate(c_string(len_trim(f_string)+1)) + do i = 1, len_trim(f_string) + c_string(i) = f_string(i:i) + end do + c_string(size(c_string)) = c_null_char +end subroutine make_c_string + subroutine broadcast_string(this,buffer,root) !! Broadcast a string ```buffer``` from MPI rank ```root``` @@ -954,15 +966,9 @@ subroutine broadcast_string(this,buffer,root) !! MPI rank that broadcasts 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) @@ -987,15 +993,9 @@ function broadcast_file(this,path,root) result(buffer) 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 - allocate(c_string(len(path)+1)) - if (this%rank() == root) then - c_string(:)='' - do j=1,len_trim(path) - c_string(j) = path(j:j) - enddo - c_string(len(path)+1) = c_null_char - endif + + call make_c_string(path, c_string) + buffer = fckit_buffer( fckit__mpi__broadcast_file(this%CPTR_PGIBUG_A,c_string,int(root,c_size_t)), share=.true. ) call buffer%return() From 72c034d2c5602a612d960d626b5641e9119a4660 Mon Sep 17 00:00:00 2001 From: DJDavies2 Date: Sat, 4 Apr 2026 16:23:24 +0100 Subject: [PATCH 3/6] Revert --- src/fckit/module/fckit_mpi.fypp | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/fckit/module/fckit_mpi.fypp b/src/fckit/module/fckit_mpi.fypp index c4e9908..e85b7b7 100644 --- a/src/fckit/module/fckit_mpi.fypp +++ b/src/fckit/module/fckit_mpi.fypp @@ -940,18 +940,6 @@ end subroutine !--------------------------------------------------------------------------------------- -subroutine make_c_string(f_string,c_string) - use, intrinsic :: iso_c_binding, only : c_char, c_null_char - character(len=*), intent(in) :: f_string - character(kind=c_char,len=1), allocatable, intent(out) :: c_string - integer :: i - allocate(c_string(len_trim(f_string)+1)) - do i = 1, len_trim(f_string) - c_string(i) = f_string(i:i) - end do - c_string(size(c_string)) = c_null_char -end subroutine make_c_string - subroutine broadcast_string(this,buffer,root) !! Broadcast a string ```buffer``` from MPI rank ```root``` @@ -966,9 +954,15 @@ subroutine broadcast_string(this,buffer,root) !! MPI rank that broadcasts character(kind=c_char,len=1),allocatable :: c_string(:) - - call make_c_string(buffer, 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 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) @@ -993,9 +987,15 @@ function broadcast_file(this,path,root) result(buffer) integer(c_int32_t), intent(in) :: root !! MPI rank that reads and broadcasts file character(kind=c_char,len=1),allocatable :: c_string(:) - - call make_c_string(path, c_string) - + integer :: j + allocate(c_string(len(path)+1)) + if (this%rank() == root) then + c_string(:)='' + do j=1,len_trim(path) + c_string(j) = path(j:j) + enddo + c_string(len(path)+1) = c_null_char + endif buffer = fckit_buffer( fckit__mpi__broadcast_file(this%CPTR_PGIBUG_A,c_string,int(root,c_size_t)), share=.true. ) call buffer%return() From 3bf694bc997226afa0d67422c6706b65c12951cd Mon Sep 17 00:00:00 2001 From: DJDavies2 Date: Sat, 4 Apr 2026 19:19:52 +0100 Subject: [PATCH 4/6] Use subroutine --- src/fckit/module/fckit_mpi.fypp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/fckit/module/fckit_mpi.fypp b/src/fckit/module/fckit_mpi.fypp index e85b7b7..0c8a20e 100644 --- a/src/fckit/module/fckit_mpi.fypp +++ b/src/fckit/module/fckit_mpi.fypp @@ -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) @@ -988,14 +995,8 @@ function broadcast_file(this,path,root) result(buffer) !! MPI rank that reads and broadcasts file character(kind=c_char,len=1),allocatable :: c_string(:) integer :: j - allocate(c_string(len(path)+1)) - if (this%rank() == root) then - c_string(:)='' - do j=1,len_trim(path) - c_string(j) = path(j:j) - enddo - c_string(len(path)+1) = c_null_char - endif + + call make_c_string(path, c_string) buffer = fckit_buffer( fckit__mpi__broadcast_file(this%CPTR_PGIBUG_A,c_string,int(root,c_size_t)), share=.true. ) call buffer%return() From 08b11332ebec40fdd141991cd56974170f8a1f05 Mon Sep 17 00:00:00 2001 From: DJDavies2 Date: Fri, 15 May 2026 17:40:20 +0100 Subject: [PATCH 5/6] Add more targets --- src/fckit/module/fckit_mpi.fypp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fckit/module/fckit_mpi.fypp b/src/fckit/module/fckit_mpi.fypp index 0c8a20e..9d712ea 100644 --- a/src/fckit/module/fckit_mpi.fypp +++ b/src/fckit/module/fckit_mpi.fypp @@ -917,9 +917,9 @@ subroutine alltoallv_${dtype}$_r${rank}$(this,in,scounts,sdispl,out,rcounts,rdis 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(:) + integer(c_int32_t), intent(in), target :: scounts(:), sdispl(:) ${ftype}$, intent(inout) :: out${dim[rank]}$ - integer(c_int32_t), intent(in) :: rcounts(:), rdispl(:) + 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(:) From e244e7bb4605e81ccb2a400974ea73cd8ab8893d Mon Sep 17 00:00:00 2001 From: DJDavies2 Date: Fri, 22 May 2026 17:10:08 +0100 Subject: [PATCH 6/6] More targets --- src/fckit/module/fckit_mpi.fypp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fckit/module/fckit_mpi.fypp b/src/fckit/module/fckit_mpi.fypp index 9d712ea..ef3e421 100644 --- a/src/fckit/module/fckit_mpi.fypp +++ b/src/fckit/module/fckit_mpi.fypp @@ -916,9 +916,9 @@ 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]}$ + ${ftype}$, intent(in), target :: in${dim[rank]}$ integer(c_int32_t), intent(in), target :: scounts(:), sdispl(:) - ${ftype}$, intent(inout) :: out${dim[rank]}$ + ${ftype}$, intent(inout), target :: out${dim[rank]}$ integer(c_int32_t), intent(in), target :: rcounts(:), rdispl(:) ${btype}$, pointer :: view_in(:), view_out(:) ${btype}$ :: mold