+int PMPI_Iscatterv(const void* sendbuf, const int* sendcounts, const int* displs, MPI_Datatype sendtype, void* recvbuf, int recvcount,
+ MPI_Datatype recvtype, int root, MPI_Comm comm, MPI_Request* request)
+{
+ CHECK_ARGS(comm == MPI_COMM_NULL, MPI_ERR_COMM, "Iscatterv: the communicator cannot be MPI_COMM_NULL");
+ CHECK_ARGS((comm->rank() == root) && (sendcounts == nullptr), MPI_ERR_ARG,
+ "Iscatterv: param 2 sendcounts cannot be NULL on the root rank");
+ CHECK_ARGS((comm->rank() == root) && (displs == nullptr), MPI_ERR_ARG,
+ "Iscatterv: param 3 displs cannot be NULL on the root rank");
+ CHECK_ARGS((comm->rank() == root) && (sendtype == MPI_DATATYPE_NULL), MPI_ERR_TYPE,
+ "Iscatterv: The sendtype cannot be NULL on the root rank");
+ CHECK_ARGS((recvbuf != MPI_IN_PLACE) && (recvtype == MPI_DATATYPE_NULL), MPI_ERR_TYPE,
+ "Iscatterv: the recvtype cannot be NULL when not receiving in place");
+ CHECK_ARGS(request == nullptr, MPI_ERR_ARG, "Iscatterv: param 10 request cannot be NULL");
+ CHECK_ARGS(recvbuf != MPI_IN_PLACE && recvcount < 0, MPI_ERR_COUNT,
+ "Iscatterv: When not receiving in place, the recvcound cannot be negative");
+ CHECK_ARGS(root < 0, MPI_ERR_ROOT, "Iscatterv: root cannot be negative");
+ CHECK_ARGS(root >= comm->size(), MPI_ERR_ROOT, "Iscatterv: root (=%d) is larger than communicator size (=%d)", root,
+ comm->size());
+
+ if (comm->rank() == root) {