1!
2! Copyright (C) by Argonne National Laboratory
3!     See COPYRIGHT in top-level directory
4!
5
6subroutine MPI_Iallgatherv_f08ts(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, &
7    recvtype, comm, request, ierror)
8    use, intrinsic :: iso_c_binding, only : c_int
9    use :: mpi_f08, only : MPI_Datatype, MPI_Comm, MPI_Request
10    use :: mpi_c_interface, only : c_Datatype, c_Comm, c_Request
11    use :: mpi_c_interface, only : MPIR_Iallgatherv_cdesc, MPIR_Comm_size_c
12
13    implicit none
14
15    type(*), dimension(..), intent(in), asynchronous :: sendbuf
16    type(*), dimension(..), asynchronous :: recvbuf
17    integer, intent(in)  :: sendcount
18    integer, intent(in)  :: recvcounts(*)
19    integer, intent(in)  :: displs(*)
20    type(MPI_Datatype), intent(in)  :: sendtype
21    type(MPI_Datatype), intent(in)  :: recvtype
22    type(MPI_Comm), intent(in)  :: comm
23    type(MPI_Request), intent(out)  :: request
24    integer, optional, intent(out)  :: ierror
25
26    integer(c_int) :: sendcount_c
27    integer(c_int), allocatable :: recvcounts_c(:)
28    integer(c_int), allocatable :: displs_c(:)
29    integer(c_Datatype) :: sendtype_c
30    integer(c_Datatype) :: recvtype_c
31    integer(c_Comm) :: comm_c
32    integer(c_Request) :: request_c
33    integer(c_int) :: ierror_c
34    integer(c_int) :: err, length ! To get length of assumed-size arrays
35
36    if (c_int == kind(0)) then
37        ierror_c = MPIR_Iallgatherv_cdesc(sendbuf, sendcount, sendtype%MPI_VAL, recvbuf, recvcounts, displs, &
38                     recvtype%MPI_VAL, comm%MPI_VAL, request%MPI_VAL)
39    else
40        sendcount_c = sendcount
41        sendtype_c = sendtype%MPI_VAL
42        recvtype_c = recvtype%MPI_VAL
43        comm_c = comm%MPI_VAL
44        err = MPIR_Comm_size_c(comm_c, length)
45        recvcounts_c = recvcounts(1:length)
46        displs_c = displs(1:length)
47
48        ierror_c = MPIR_Iallgatherv_cdesc(sendbuf, sendcount_c, sendtype_c, recvbuf, recvcounts_c, displs_c, &
49                     recvtype_c, comm_c, request_c)
50         request%MPI_VAL = request_c
51    end if
52
53    if(present(ierror)) ierror = ierror_c
54
55end subroutine MPI_Iallgatherv_f08ts
56