diff --git a/ompi/mpi/fortran/use-mpi-f08/alltoallw_f08.F90 b/ompi/mpi/fortran/use-mpi-f08/alltoallw_f08.F90 index 90bbe6c585..9654057730 100644 --- a/ompi/mpi/fortran/use-mpi-f08/alltoallw_f08.F90 +++ b/ompi/mpi/fortran/use-mpi-f08/alltoallw_f08.F90 @@ -1,6 +1,6 @@ ! -*- f90 -*- ! -! Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved. +! Copyright (c) 2009-2013 Cisco Systems, Inc. All rights reserved. ! Copyright (c) 2009-2012 Los Alamos National Security, LLC. ! All rights reserved. ! $COPYRIGHT$ @@ -14,14 +14,24 @@ subroutine MPI_Alltoallw_f08(sendbuf,sendcounts,sdispls,sendtypes,& implicit none OMPI_FORTRAN_IGNORE_TKR_TYPE, INTENT(IN) :: sendbuf, recvbuf INTEGER, INTENT(IN) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*) - TYPE(MPI_Datatype), INTENT(IN) :: sendtypes - TYPE(MPI_Datatype), INTENT(IN) :: recvtypes + TYPE(MPI_Datatype), INTENT(IN) :: sendtypes(*) + TYPE(MPI_Datatype), INTENT(IN) :: recvtypes(*) TYPE(MPI_Comm), INTENT(IN) :: comm INTEGER, OPTIONAL, INTENT(OUT) :: ierror integer :: c_ierror - call ompi_alltoallw_f(sendbuf,sendcounts,sdispls,sendtypes%MPI_VAL,& - recvbuf,recvcounts,rdispls,recvtypes%MPI_VAL,comm%MPI_VAL,c_ierror) + ! Note that we pass a scalar here for both the sendtypes and + ! recvtypes arguments, even though the real Alltoallw function + ! expects an array of integers. This is a hack: we know that + ! [send|recv]types(1)%MPI_VAL will pass the address of the first + ! integer in the array of Type(MPI_Datatype) derived types. And + ! since Type(MPI_Datatype) are exactly memory-equivalent to a + ! single INTEGER, passing the address of the first one is the same + ! as passing the address to an array of integers. To be clear: the + ! back-end ompi_alltoallw_f is expecting a pointer to an array of + ! integers. So it all works out (but is a hack :-\ ). + call ompi_alltoallw_f(sendbuf,sendcounts,sdispls,sendtypes(1)%MPI_VAL,& + recvbuf,recvcounts,rdispls,recvtypes(1)%MPI_VAL,comm%MPI_VAL,c_ierror) if (present(ierror)) ierror = c_ierror end subroutine MPI_Alltoallw_f08 diff --git a/ompi/mpi/fortran/use-mpi-f08/ialltoallw_f08.F90 b/ompi/mpi/fortran/use-mpi-f08/ialltoallw_f08.F90 index 86813e5f2a..f3ce01e643 100644 --- a/ompi/mpi/fortran/use-mpi-f08/ialltoallw_f08.F90 +++ b/ompi/mpi/fortran/use-mpi-f08/ialltoallw_f08.F90 @@ -1,6 +1,6 @@ ! -*- f90 -*- ! -! Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved. +! Copyright (c) 2009-2013 Cisco Systems, Inc. All rights reserved. ! Copyright (c) 2009-2012 Los Alamos National Security, LLC. ! All rights reserved. ! $COPYRIGHT$ @@ -14,15 +14,25 @@ subroutine MPI_Ialltoallw_f08(sendbuf,sendcounts,sdispls,sendtypes,& implicit none OMPI_FORTRAN_IGNORE_TKR_TYPE, INTENT(IN) :: sendbuf, recvbuf INTEGER, INTENT(IN) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*) - TYPE(MPI_Datatype), INTENT(IN) :: sendtypes - TYPE(MPI_Datatype), INTENT(IN) :: recvtypes + TYPE(MPI_Datatype), INTENT(IN) :: sendtypes(*) + TYPE(MPI_Datatype), INTENT(IN) :: recvtypes(*) TYPE(MPI_Comm), INTENT(IN) :: comm TYPE(MPI_Request), INTENT(OUT) :: request INTEGER, OPTIONAL, INTENT(OUT) :: ierror integer :: c_ierror - call ompi_ialltoallw_f(sendbuf,sendcounts,sdispls,sendtypes%MPI_VAL,& - recvbuf,recvcounts,rdispls,recvtypes%MPI_VAL,comm%MPI_VAL,request%MPI_VAL,c_ierror) + ! Note that we pass a scalar here for both the sendtypes and + ! recvtypes arguments, even though the real Alltoallw function + ! expects an array of integers. This is a hack: we know that + ! [send|recv]types(1)%MPI_VAL will pass the address of the first + ! integer in the array of Type(MPI_Datatype) derived types. And + ! since Type(MPI_Datatype) are exactly memory-equivalent to a + ! single INTEGER, passing the address of the first one is the same + ! as passing the address to an array of integers. To be clear: the + ! back-end ompi_alltoallw_f is expecting a pointer to an array of + ! integers. So it all works out (but is a hack :-\ ). + call ompi_ialltoallw_f(sendbuf,sendcounts,sdispls,sendtypes(1)%MPI_VAL,& + recvbuf,recvcounts,rdispls,recvtypes(1)%MPI_VAL,comm%MPI_VAL,request%MPI_VAL,c_ierror) if (present(ierror)) ierror = c_ierror end subroutine MPI_Ialltoallw_f08