xref: /petsc/src/dm/impls/plex/plexcoarsen.c (revision 31d78bcd2b98084dc1368b20eb1129c8b9fb39fe)
1919ab0a2SMatthew G. Knepley #include <petsc/private/dmpleximpl.h> /*I      "petscdmplex.h"   I*/
29f3102b2SMatthew G. Knepley 
DMCoarsen_Plex(DM dm,MPI_Comm comm,DM * dmCoarsened)3d71ae5a4SJacob Faibussowitsch PetscErrorCode DMCoarsen_Plex(DM dm, MPI_Comm comm, DM *dmCoarsened)
4d71ae5a4SJacob Faibussowitsch {
5919ab0a2SMatthew G. Knepley   PetscFunctionBegin;
69566063dSJacob Faibussowitsch   if (!dm->coarseMesh) PetscCall(DMPlexCoarsen_Internal(dm, NULL, NULL, NULL, &dm->coarseMesh));
79566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)dm->coarseMesh));
8a8fb8f29SToby Isaac   *dmCoarsened = dm->coarseMesh;
9*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10919ab0a2SMatthew G. Knepley }
11b653a561SMatthew G. Knepley 
DMCoarsenHierarchy_Plex(DM dm,PetscInt nlevels,DM dmCoarsened[])12d71ae5a4SJacob Faibussowitsch PetscErrorCode DMCoarsenHierarchy_Plex(DM dm, PetscInt nlevels, DM dmCoarsened[])
13d71ae5a4SJacob Faibussowitsch {
14b653a561SMatthew G. Knepley   DM        rdm = dm;
15b653a561SMatthew G. Knepley   PetscInt  c;
160d1cd5e0SMatthew G. Knepley   PetscBool localized;
17b653a561SMatthew G. Knepley 
18b653a561SMatthew G. Knepley   PetscFunctionBegin;
199566063dSJacob Faibussowitsch   PetscCall(DMGetCoordinatesLocalized(dm, &localized));
20b653a561SMatthew G. Knepley   for (c = nlevels - 1; c >= 0; --c) {
219566063dSJacob Faibussowitsch     PetscCall(DMCoarsen(rdm, PetscObjectComm((PetscObject)dm), &dmCoarsened[c]));
229566063dSJacob Faibussowitsch     PetscCall(DMCopyDisc(rdm, dmCoarsened[c]));
239566063dSJacob Faibussowitsch     if (localized) PetscCall(DMLocalizeCoordinates(dmCoarsened[c]));
249566063dSJacob Faibussowitsch     PetscCall(DMSetCoarseDM(rdm, dmCoarsened[c]));
25b653a561SMatthew G. Knepley     rdm = dmCoarsened[c];
26b653a561SMatthew G. Knepley   }
27*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
28b653a561SMatthew G. Knepley }
29