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