1 #include <petsc/private/dmpleximpl.h> /*I "petscdmplex.h" I*/ 2 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(0); 10 } 11 12 PetscErrorCode DMCoarsenHierarchy_Plex(DM dm, PetscInt nlevels, DM dmCoarsened[]) 13 { 14 DM rdm = dm; 15 PetscInt c; 16 PetscBool localized; 17 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(0); 28 } 29