1919ab0a2SMatthew G. Knepley #include <petsc/private/dmpleximpl.h> /*I "petscdmplex.h" I*/ 29f3102b2SMatthew G. Knepley 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 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