#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; rcoordinates && !dm->coordinatesLocal) SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "DM coordinates must be set"); ierr = PetscSFSetUp(sf);CHKERRQ(ierr); ierr = PetscSFGetRootRanks(sf, &nranks, &ranks, &roffset, &rmine, &rremote);CHKERRQ(ierr); /* Expand sent cones per rank */ ierr = SortByRemote_Private(sf, &rmine1, &rremote1);CHKERRQ(ierr); ierr = GetRecursiveConeCoordinatesPerRank_Private(dm, sf, rmine1, &sntCoordinatesPerRank);CHKERRQ(ierr); /* Create inverse SF */ ierr = PetscSFGetMultiSF(sf,&msf);CHKERRQ(ierr); ierr = PetscSFCreateInverseSF(msf,&imsf);CHKERRQ(ierr); ierr = PetscSFSetUp(imsf);CHKERRQ(ierr); ierr = PetscSFGetGraph(imsf, NULL, &nileaves, NULL, NULL);CHKERRQ(ierr); ierr = PetscSFGetRootRanks(imsf, &niranks, &iranks, &iroffset, &irmine, &irremote);CHKERRQ(ierr); /* Compute original numbering of multi-roots (referenced points) */ ierr = PetscSFComputeMultiRootOriginalNumberingByRank_Private(sf, imsf, &mine_orig_numbering);CHKERRQ(ierr); /* Expand coordinates of the referred cones per rank */ ierr = GetRecursiveConeCoordinatesPerRank_Private(dm, imsf, mine_orig_numbering, &refCoordinatesPerRank);CHKERRQ(ierr); /* Send the coordinates */ ierr = ExchangeVecByRank_Private((PetscObject)sf, nranks, ranks, sntCoordinatesPerRank, niranks, iranks, &recCoordinatesPerRank);CHKERRQ(ierr); /* verbose output */ ierr = PetscOptionsGetBool(((PetscObject)dm)->options, ((PetscObject)dm)->prefix, "-dm_plex_check_cones_conform_on_interfaces_verbose", &verbose, NULL);CHKERRQ(ierr); if (verbose) { PetscViewer sv, v = PETSC_VIEWER_STDOUT_WORLD; ierr = PetscViewerASCIIPrintf(v, "============\nDMPlexCheckInterfaceCones output\n============\n");CHKERRQ(ierr); ierr = PetscViewerASCIIPushSynchronized(v);CHKERRQ(ierr); ierr = PetscViewerASCIISynchronizedPrintf(v, "[%d] --------\n", myrank);CHKERRQ(ierr); for (r=0; r