From 9594b992c5137500c12564874a3b14a0a2defa06 Mon Sep 17 00:00:00 2001 From: Gaurav Dhingra Date: Mon, 31 Mar 2025 12:07:25 +0530 Subject: [PATCH] remove C MPI wrapper function for MPI_Cart_create --- src/mpi.f90 | 26 ++++++++++++++++++++------ src/mpi_c_bindings.f90 | 18 +++++++++++++----- src/mpi_wrapper.c | 7 ------- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/mpi.f90 b/src/mpi.f90 index eedccb0..b1eba4e 100644 --- a/src/mpi.f90 +++ b/src/mpi.f90 @@ -400,15 +400,20 @@ subroutine MPI_Ssend_proc(buf, count, datatype, dest, tag, comm, ierror) call c_mpi_ssend(buf, count, datatype, dest, tag, comm, ierror) end subroutine - subroutine MPI_Cart_create_proc(comm, ndims, dims, periods, reorder, newcomm, ierror) - use mpi_c_bindings, only: c_mpi_cart_create - use iso_c_binding, only: c_int + subroutine MPI_Cart_create_proc(comm_old, ndims, dims, periods, reorder, comm_cart, ierror) + use iso_c_binding, only: c_int, c_ptr + use mpi_c_bindings, only: c_mpi_cart_create, c_mpi_comm_f2c, c_mpi_comm_c2f integer, intent(in) :: ndims, dims(ndims) logical, intent(in) :: periods(ndims), reorder - integer, intent(in) :: comm - integer, intent(out) :: newcomm + integer, intent(in) :: comm_old + integer, intent(out) :: comm_cart integer, optional, intent(out) :: ierror integer(c_int) :: ndims_c, reorder_c, dims_c(ndims), periods_c(ndims) + type(c_ptr) :: c_comm_old + type(c_ptr) :: c_comm_cart + integer(c_int) :: local_ierr + + c_comm_old = c_mpi_comm_f2c(comm_old) ndims_c = ndims if (reorder) then reorder_c = 1 @@ -421,7 +426,16 @@ subroutine MPI_Cart_create_proc(comm, ndims, dims, periods, reorder, newcomm, ie elsewhere periods_c = 0 end where - call c_mpi_cart_create(comm, ndims, dims_c, periods_c, reorder_c, newcomm, ierror) + local_ierr = c_mpi_cart_create(c_comm_old, ndims, dims_c, periods_c, reorder_c, c_comm_cart) + comm_cart = c_mpi_comm_c2f(c_comm_cart) + + if (present(ierror)) then + ierror = local_ierr + else + if (local_ierr /= MPI_SUCCESS) then + print *, "MPI_Cart_create failed with error code: ", local_ierr + end if + end if end subroutine subroutine MPI_Cart_coords_proc(comm, rank, maxdims, coords, ierror) diff --git a/src/mpi_c_bindings.f90 b/src/mpi_c_bindings.f90 index f39b868..4e5f8db 100644 --- a/src/mpi_c_bindings.f90 +++ b/src/mpi_c_bindings.f90 @@ -8,6 +8,12 @@ function c_mpi_comm_f2c(comm_f) bind(C, name="get_c_comm_from_fortran") type(c_ptr) :: c_mpi_comm_f2c ! MPI_Comm as pointer end function c_mpi_comm_f2c + function c_mpi_comm_c2f(comm_c) bind(C, name="MPI_Comm_c2f") + use iso_c_binding, only: c_int, c_ptr + type(c_ptr), value :: comm_c + integer :: c_mpi_comm_c2f + end function + function c_mpi_init(argc, argv) bind(C, name="MPI_Init") use iso_c_binding, only : c_int, c_ptr !> TODO: is the intent need to be explicitly specified @@ -188,12 +194,14 @@ subroutine c_mpi_ssend(buf, count, datatype, dest, tag, comm, ierror) bind(C, na integer(c_int), optional, intent(out) :: ierror end subroutine - subroutine c_mpi_cart_create(comm, ndims, dims, periods, reorder, newcomm, ierror) bind(C, name="mpi_cart_create_wrapper") - use iso_c_binding, only: c_int - integer(c_int), intent(in) :: comm, ndims, reorder + function c_mpi_cart_create(comm_old, ndims, dims, periods, reorder, comm_cart) bind(C, name="MPI_Cart_create") + use iso_c_binding, only: c_int, c_ptr + type(c_ptr), value :: comm_old + integer(c_int), value :: ndims, reorder integer(c_int), intent(in) :: dims(*), periods(*) - integer(c_int), intent(out) :: newcomm, ierror - end subroutine + type(c_ptr), intent(out) :: comm_cart + integer(c_int) :: c_mpi_cart_create + end function function c_mpi_cart_coords(comm, rank, maxdims, coords) bind(C, name="MPI_Cart_coords") use iso_c_binding, only: c_int, c_ptr diff --git a/src/mpi_wrapper.c b/src/mpi_wrapper.c index 7a540ad..cb4b91c 100644 --- a/src/mpi_wrapper.c +++ b/src/mpi_wrapper.c @@ -206,13 +206,6 @@ void mpi_ssend_wrapper(double *buf, int *count, int *datatype_f, int *dest, *ierror = MPI_Ssend(buf, *count, datatype, *dest, *tag, comm); } -void mpi_cart_create_wrapper(int * comm_f, int * ndims, int * dims, int * periods, int * reorder, int * newcomm_f, int * ierror){ - MPI_Comm newcomm = MPI_COMM_NULL; - MPI_Comm comm = get_c_comm_from_fortran(*comm_f); - *ierror = MPI_Cart_create(comm, *ndims, dims, periods, *reorder, &newcomm); - *newcomm_f = MPI_Comm_c2f(newcomm); -} - void mpi_cart_shift_wrapper(int * comm_f, int * dir, int * disp, int * rank_source, int * rank_dest, int * ierror) { MPI_Comm comm = get_c_comm_from_fortran(*comm_f);