#include /*I "petscdmplex.h" I*/ /* TODO PetscArrayExchangeBegin/End */ /* TODO blocksize */ /* TODO move to API ? */ static PetscErrorCode ExchangeArrayByRank_Private(PetscObject obj, MPI_Datatype dt, PetscInt nsranks, const PetscMPIInt sranks[], PetscInt ssize[], const void *sarr[], PetscInt nrranks, const PetscMPIInt rranks[], PetscInt *rsize_out[], void **rarr_out[]) { PetscInt r; PetscInt *rsize; void **rarr; MPI_Request *sreq, *rreq; PetscMPIInt tag, unitsize; MPI_Comm comm; PetscErrorCode ierr; PetscFunctionBegin; ierr = MPI_Type_size(dt, &unitsize);CHKERRQ(ierr); ierr = PetscObjectGetComm(obj, &comm);CHKERRQ(ierr); ierr = PetscMalloc2(nrranks, &rsize, nrranks, &rarr);CHKERRQ(ierr); ierr = PetscMalloc2(nrranks, &rreq, nsranks, &sreq);CHKERRQ(ierr); /* exchange array size */ ierr = PetscObjectGetNewTag(obj,&tag);CHKERRQ(ierr); for (r=0; r