1 #include <petsc/private/dmpleximpl.h> /*I "petscdmplex.h" I*/ 2 3 PetscErrorCode DMCoarsen_Plex(DM dm, MPI_Comm comm, DM *dmCoarsened) { 4 PetscFunctionBegin; 5 if (!dm->coarseMesh) PetscCall(DMPlexCoarsen_Internal(dm, NULL, NULL, NULL, &dm->coarseMesh)); 6 PetscCall(PetscObjectReference((PetscObject)dm->coarseMesh)); 7 *dmCoarsened = dm->coarseMesh; 8 PetscFunctionReturn(0); 9 } 10 11 PetscErrorCode DMCoarsenHierarchy_Plex(DM dm, PetscInt nlevels, DM dmCoarsened[]) { 12 DM rdm = dm; 13 PetscInt c; 14 PetscBool localized; 15 16 PetscFunctionBegin; 17 PetscCall(DMGetCoordinatesLocalized(dm, &localized)); 18 for (c = nlevels - 1; c >= 0; --c) { 19 PetscCall(DMCoarsen(rdm, PetscObjectComm((PetscObject)dm), &dmCoarsened[c])); 20 PetscCall(DMCopyDisc(rdm, dmCoarsened[c])); 21 if (localized) PetscCall(DMLocalizeCoordinates(dmCoarsened[c])); 22 PetscCall(DMSetCoarseDM(rdm, dmCoarsened[c])); 23 rdm = dmCoarsened[c]; 24 } 25 PetscFunctionReturn(0); 26 } 27