xref: /petsc/src/dm/impls/plex/plexcoarsen.c (revision 31d78bcd2b98084dc1368b20eb1129c8b9fb39fe)
1 #include <petsc/private/dmpleximpl.h> /*I      "petscdmplex.h"   I*/
2 
DMCoarsen_Plex(DM dm,MPI_Comm comm,DM * dmCoarsened)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 }
11 
DMCoarsenHierarchy_Plex(DM dm,PetscInt nlevels,DM dmCoarsened[])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(PETSC_SUCCESS);
28 }
29