From 427f7ea1d779a0a2ed98e4bc7d288a5e7d46d6ec Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Tue, 21 Jul 2026 22:24:33 +0000 Subject: [PATCH] Add explicit interfaces with unchecked buffer arguments for the MPI routines that take choice buffers so that gfortran no longer warns about type and rank mismatches between calls --- Makefile.in | 18 +++++++---- src/mpi/mpi_interfaces.f90 | 61 +++++++++++++++++++++++++++++++++++++ src/mpi/mpi_io.f90 | 3 +- src/mpi/mpi_io_template.f90 | 1 + src/mpi/mpi_routines.f90 | 1 + 5 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 src/mpi/mpi_interfaces.f90 diff --git a/Makefile.in b/Makefile.in index ad9522f9..94ea31b9 100644 --- a/Makefile.in +++ b/Makefile.in @@ -61,7 +61,8 @@ OBJECTS_CAR_SER = src/mpi/mpi_core_nompi.f90 \ src/mpi/mpi_routines_nompi.f90 \ $(OBJECTS3) -OBJECTS_CAR_MPI = src/mpi/mpi_core.f90 \ +OBJECTS_CAR_MPI = src/mpi/mpi_interfaces.f90 \ + src/mpi/mpi_core.f90 \ fortranlib/src/@posix_module_mpi@.f90 \ $(COMMON) \ src/core/core_lib.f90 \ @@ -95,7 +96,8 @@ OBJECTS_AMR_SER = src/mpi/mpi_core_nompi.f90 \ src/mpi/mpi_routines_nompi.f90 \ $(OBJECTS3) -OBJECTS_AMR_MPI = src/mpi/mpi_core.f90 \ +OBJECTS_AMR_MPI = src/mpi/mpi_interfaces.f90 \ + src/mpi/mpi_core.f90 \ fortranlib/src/@posix_module_mpi@.f90 \ $(COMMON) \ src/core/core_lib.f90 \ @@ -129,7 +131,8 @@ OBJECTS_OCT_SER = src/mpi/mpi_core_nompi.f90 \ src/mpi/mpi_routines_nompi.f90 \ $(OBJECTS3) -OBJECTS_OCT_MPI = src/mpi/mpi_core.f90 \ +OBJECTS_OCT_MPI = src/mpi/mpi_interfaces.f90 \ + src/mpi/mpi_core.f90 \ fortranlib/src/@posix_module_mpi@.f90 \ $(COMMON) \ src/core/core_lib.f90 \ @@ -164,7 +167,8 @@ OBJECTS_VOR_SER = src/mpi/mpi_core_nompi.f90 \ src/mpi/mpi_routines_nompi.f90 \ $(OBJECTS3) -OBJECTS_VOR_MPI = src/mpi/mpi_core.f90 \ +OBJECTS_VOR_MPI = src/mpi/mpi_interfaces.f90 \ + src/mpi/mpi_core.f90 \ fortranlib/src/@posix_module_mpi@.f90 \ $(COMMON) \ src/extern/kdtree2/kdtree2.f90 \ @@ -199,7 +203,8 @@ OBJECTS_SPH_SER = src/mpi/mpi_core_nompi.f90 \ src/mpi/mpi_routines_nompi.f90 \ $(OBJECTS3) -OBJECTS_SPH_MPI = src/mpi/mpi_core.f90 \ +OBJECTS_SPH_MPI = src/mpi/mpi_interfaces.f90 \ + src/mpi/mpi_core.f90 \ fortranlib/src/@posix_module_mpi@.f90 \ $(COMMON) \ src/core/core_lib.f90 \ @@ -233,7 +238,8 @@ OBJECTS_CYL_SER = src/mpi/mpi_core_nompi.f90 \ src/mpi/mpi_routines_nompi.f90 \ $(OBJECTS3) -OBJECTS_CYL_MPI = src/mpi/mpi_core.f90 \ +OBJECTS_CYL_MPI = src/mpi/mpi_interfaces.f90 \ + src/mpi/mpi_core.f90 \ fortranlib/src/@posix_module_mpi@.f90 \ $(COMMON) \ src/core/core_lib.f90 \ diff --git a/src/mpi/mpi_interfaces.f90 b/src/mpi/mpi_interfaces.f90 new file mode 100644 index 00000000..b64029dc --- /dev/null +++ b/src/mpi/mpi_interfaces.f90 @@ -0,0 +1,61 @@ +! Explicit interfaces for the MPI routines that take "choice" buffer +! arguments (buffers that can be of any type and rank). The mpich "mpi" +! module does not declare interfaces for these routines, so gfortran 10 and +! later warns about every pair of calls to the same routine with buffers of +! different types or ranks. The NO_ARG_CHECK attribute (supported by both +! gfortran and the Intel compilers, and ignored as a comment by others) +! reproduces the "ignore type, kind and rank" behaviour that MPI +! implementations themselves use for choice buffers, while keeping the +! non-buffer arguments type-checked. + +module mpi_interfaces + + implicit none + + interface + + subroutine mpi_bcast(buffer, count, datatype, root, comm, ierror) + !GCC$ ATTRIBUTES NO_ARG_CHECK :: buffer + !DEC$ ATTRIBUTES NO_ARG_CHECK :: buffer + type(*) :: buffer(*) + integer :: count, datatype, root, comm, ierror + end subroutine mpi_bcast + + subroutine mpi_reduce(sendbuf, recvbuf, count, datatype, op, root, comm, ierror) + !GCC$ ATTRIBUTES NO_ARG_CHECK :: sendbuf, recvbuf + !DEC$ ATTRIBUTES NO_ARG_CHECK :: sendbuf, recvbuf + type(*) :: sendbuf(*), recvbuf(*) + integer :: count, datatype, op, root, comm, ierror + end subroutine mpi_reduce + + subroutine mpi_allreduce(sendbuf, recvbuf, count, datatype, op, comm, ierror) + !GCC$ ATTRIBUTES NO_ARG_CHECK :: sendbuf, recvbuf + !DEC$ ATTRIBUTES NO_ARG_CHECK :: sendbuf, recvbuf + type(*) :: sendbuf(*), recvbuf(*) + integer :: count, datatype, op, comm, ierror + end subroutine mpi_allreduce + + subroutine mpi_recv(buf, count, datatype, source, tag, comm, status, ierror) + !GCC$ ATTRIBUTES NO_ARG_CHECK :: buf + !DEC$ ATTRIBUTES NO_ARG_CHECK :: buf + type(*) :: buf(*) + integer :: count, datatype, source, tag, comm, status(*), ierror + end subroutine mpi_recv + + subroutine mpi_isend(buf, count, datatype, dest, tag, comm, request, ierror) + !GCC$ ATTRIBUTES NO_ARG_CHECK :: buf + !DEC$ ATTRIBUTES NO_ARG_CHECK :: buf + type(*) :: buf(*) + integer :: count, datatype, dest, tag, comm, request, ierror + end subroutine mpi_isend + + subroutine mpi_irecv(buf, count, datatype, source, tag, comm, request, ierror) + !GCC$ ATTRIBUTES NO_ARG_CHECK :: buf + !DEC$ ATTRIBUTES NO_ARG_CHECK :: buf + type(*) :: buf(*) + integer :: count, datatype, source, tag, comm, request, ierror + end subroutine mpi_irecv + + end interface + +end module mpi_interfaces diff --git a/src/mpi/mpi_io.f90 b/src/mpi/mpi_io.f90 index 7b7c9b41..002efbf5 100644 --- a/src/mpi/mpi_io.f90 +++ b/src/mpi/mpi_io.f90 @@ -1,8 +1,9 @@ -! MD5 of template: d391eca44de1bf600f23e91f9dab6ebf +! MD5 of template: 1e1c708fb2055feec7cad222682bbe09 module mpi_hdf5_io use core_lib use mpi + use mpi_interfaces use mpi_core implicit none diff --git a/src/mpi/mpi_io_template.f90 b/src/mpi/mpi_io_template.f90 index e4714da7..59189739 100644 --- a/src/mpi/mpi_io_template.f90 +++ b/src/mpi/mpi_io_template.f90 @@ -2,6 +2,7 @@ module mpi_hdf5_io use core_lib use mpi + use mpi_interfaces use mpi_core implicit none diff --git a/src/mpi/mpi_routines.f90 b/src/mpi/mpi_routines.f90 index bb585432..a9220c2c 100644 --- a/src/mpi/mpi_routines.f90 +++ b/src/mpi/mpi_routines.f90 @@ -1,6 +1,7 @@ module mpi_routines use mpi + use mpi_interfaces use mpi_core use core_lib use grid_physics