Actual source code: plexcoarsen.c

  1: #include <petsc/private/dmpleximpl.h>

  3: PetscErrorCode DMCoarsen_Plex(DM dm, MPI_Comm comm, DM *dmCoarsened)
  4: {
  5:   PetscFunctionBegin;
  6:   if (!dm->coarseMesh) PetscCall(DMPlexCoarsen_Internal(dm, NULL, NULL, NULL, &dm->coarseMesh));
  7:   PetscCall(PetscObjectReference((PetscObject)dm->coarseMesh));
  8:   *dmCoarsened = dm->coarseMesh;
  9:   PetscFunctionReturn(PETSC_SUCCESS);
 10: }

 12: PetscErrorCode DMCoarsenHierarchy_Plex(DM dm, PetscInt nlevels, DM dmCoarsened[])
 13: {
 14:   DM        rdm = dm;
 15:   PetscInt  c;
 16:   PetscBool localized;

 18:   PetscFunctionBegin;
 19:   PetscCall(DMGetCoordinatesLocalized(dm, &localized));
 20:   for (c = nlevels - 1; c >= 0; --c) {
 21:     PetscCall(DMCoarsen(rdm, PetscObjectComm((PetscObject)dm), &dmCoarsened[c]));
 22:     PetscCall(DMCopyDisc(rdm, dmCoarsened[c]));
 23:     if (localized) PetscCall(DMLocalizeCoordinates(dmCoarsened[c]));
 24:     PetscCall(DMSetCoarseDM(rdm, dmCoarsened[c]));
 25:     rdm = dmCoarsened[c];
 26:   }
 27:   PetscFunctionReturn(PETSC_SUCCESS);
 28: }