PetscErrorCode DistributeCoordinates(DM dm, PetscSF pointSF, DM parallelDM) { PetscSF coordSF; PetscSection originalCoordSection, newCoordSection; Vec coordinates, newCoordinates; PetscScalar *coords, *newCoords; PetscInt *remoteOffsets, coordSize; PetscErrorCode ierr; PetscFunctionBegin; ierr = DMMeshGetCoordinateSection(dm, &originalCoordSection);CHKERRQ(ierr); ierr = DMMeshGetCoordinateSection(parallelDM, &newCoordSection);CHKERRQ(ierr); ierr = PetscSFDistributeSection(pointSF, originalCoordSection, &remoteOffsets, newCoordSection);CHKERRQ(ierr); ierr = DMMeshGetCoordinateVec(dm, &coordinates);CHKERRQ(ierr); ierr = DMMeshGetCoordinateVec(parallelDM, &newCoordinates);CHKERRQ(ierr); ierr = PetscSectionGetStorageSize(newCoordSection, &coordSize);CHKERRQ(ierr); ierr = VecSetSizes(newCoordinates, coordSize, PETSC_DETERMINE);CHKERRQ(ierr); ierr = VecSetFromOptions(newCoordinates);CHKERRQ(ierr); ierr = VecGetArray(coordinates, &coords);CHKERRQ(ierr); ierr = VecGetArray(newCoordinates, &newCoords);CHKERRQ(ierr); ierr = PetscSFCreateSectionSF(pointSF, originalCoordSection, remoteOffsets, newCoordSection, &coordSF);CHKERRQ(ierr); ierr = PetscSFBcastBegin(coordSF, MPIU_SCALAR, coords, newCoords);CHKERRQ(ierr); ierr = PetscSFBcastEnd(coordSF, MPIU_SCALAR, coords, newCoords);CHKERRQ(ierr); ierr = PetscSFDestroy(&coordSF);CHKERRQ(ierr); ierr = VecRestoreArray(newCoordinates, &newCoords);CHKERRQ(ierr); ierr = VecRestoreArray(coordinates, &coords);CHKERRQ(ierr); PetscFunctionReturn(0); }
int main(int argc, char *argv[]) { MPI_Comm comm; DM dm; PetscSF sf; AppCtx user; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscInitialize(&argc, &argv, (char*) 0, help); CHKERRQ(ierr); comm = PETSC_COMM_WORLD; ierr = ProcessOptions(comm, &user); CHKERRQ(ierr); ierr = CreateMesh(comm, &user, &dm); CHKERRQ(ierr); ierr = DMMeshConvertOverlapToSF(dm, &sf); CHKERRQ(ierr); { PetscSection section; PetscSF sectionSF; ierr = DMMeshGetCoordinateSection(dm, §ion); CHKERRQ(ierr); ierr = PetscSectionView(section, PETSC_VIEWER_STDOUT_SELF); CHKERRQ(ierr); ierr = PetscSFCreateSectionSF(sf, section, §ionSF); CHKERRQ(ierr); ierr = PetscSFDestroy(§ionSF); CHKERRQ(ierr); ierr = PetscSectionDestroy(§ion); CHKERRQ(ierr); } ierr = PetscSFDestroy(&sf); CHKERRQ(ierr); ierr = DMDestroy(&dm); CHKERRQ(ierr); ierr = PetscFinalize(); PetscFunctionReturn(0); }