1 #include <petsc/private/dmpleximpl.h> /*I "petscdmplex.h" I*/ 2 3 PetscErrorCode DMCoarsen_Plex(DM dm, MPI_Comm comm, DM *dmCoarsened) 4 { 5 PetscErrorCode ierr; 6 7 PetscFunctionBegin; 8 if (!dm->coarseMesh) {ierr = DMPlexCoarsen_Internal(dm, NULL, &dm->coarseMesh);CHKERRQ(ierr);} 9 ierr = PetscObjectReference((PetscObject) dm->coarseMesh);CHKERRQ(ierr); 10 *dmCoarsened = dm->coarseMesh; 11 PetscFunctionReturn(0); 12 } 13 14 PetscErrorCode DMCoarsenHierarchy_Plex(DM dm, PetscInt nlevels, DM dmCoarsened[]) 15 { 16 DM rdm = dm; 17 PetscInt c; 18 PetscBool localized; 19 PetscErrorCode ierr; 20 21 PetscFunctionBegin; 22 ierr = DMGetCoordinatesLocalized(dm, &localized);CHKERRQ(ierr); 23 for (c = nlevels-1; c >= 0; --c) { 24 ierr = DMCoarsen(rdm, PetscObjectComm((PetscObject) dm), &dmCoarsened[c]);CHKERRQ(ierr); 25 ierr = DMCopyDisc(rdm, dmCoarsened[c]);CHKERRQ(ierr); 26 if (localized) {ierr = DMLocalizeCoordinates(dmCoarsened[c]);CHKERRQ(ierr);} 27 ierr = DMSetCoarseDM(rdm, dmCoarsened[c]);CHKERRQ(ierr); 28 rdm = dmCoarsened[c]; 29 } 30 PetscFunctionReturn(0); 31 } 32