Esempio n. 1
0
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);
}
Esempio n. 2
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, &section);
        CHKERRQ(ierr);
        ierr = PetscSectionView(section, PETSC_VIEWER_STDOUT_SELF);
        CHKERRQ(ierr);
        ierr = PetscSFCreateSectionSF(sf, section, &sectionSF);
        CHKERRQ(ierr);
        ierr = PetscSFDestroy(&sectionSF);
        CHKERRQ(ierr);
        ierr = PetscSectionDestroy(&section);
        CHKERRQ(ierr);
    }
    ierr = PetscSFDestroy(&sf);
    CHKERRQ(ierr);
    ierr = DMDestroy(&dm);
    CHKERRQ(ierr);
    ierr = PetscFinalize();
    PetscFunctionReturn(0);
}