1919ab0a2SMatthew G. Knepley #include <petsc/private/dmpleximpl.h> /*I "petscdmplex.h" I*/ 29f3102b2SMatthew G. Knepley 3919ab0a2SMatthew G. Knepley PetscErrorCode DMCoarsen_Plex(DM dm, MPI_Comm comm, DM *dmCoarsened) 4919ab0a2SMatthew G. Knepley { 5919ab0a2SMatthew G. Knepley PetscErrorCode ierr; 6919ab0a2SMatthew G. Knepley 7919ab0a2SMatthew G. Knepley PetscFunctionBegin; 8*0d1cd5e0SMatthew G. Knepley if (!dm->coarseMesh) {ierr = DMPlexCoarsen_Internal(dm, NULL, &dm->coarseMesh);CHKERRQ(ierr);} 9a8fb8f29SToby Isaac ierr = PetscObjectReference((PetscObject) dm->coarseMesh);CHKERRQ(ierr); 10a8fb8f29SToby Isaac *dmCoarsened = dm->coarseMesh; 11919ab0a2SMatthew G. Knepley PetscFunctionReturn(0); 12919ab0a2SMatthew G. Knepley } 13b653a561SMatthew G. Knepley 14b653a561SMatthew G. Knepley PetscErrorCode DMCoarsenHierarchy_Plex(DM dm, PetscInt nlevels, DM dmCoarsened[]) 15b653a561SMatthew G. Knepley { 16b653a561SMatthew G. Knepley DM rdm = dm; 17b653a561SMatthew G. Knepley PetscInt c; 18*0d1cd5e0SMatthew G. Knepley PetscBool localized; 19b653a561SMatthew G. Knepley PetscErrorCode ierr; 20b653a561SMatthew G. Knepley 21b653a561SMatthew G. Knepley PetscFunctionBegin; 22*0d1cd5e0SMatthew G. Knepley ierr = DMGetCoordinatesLocalized(dm, &localized);CHKERRQ(ierr); 23b653a561SMatthew G. Knepley for (c = nlevels-1; c >= 0; --c) { 24b653a561SMatthew G. Knepley ierr = DMCoarsen(rdm, PetscObjectComm((PetscObject) dm), &dmCoarsened[c]);CHKERRQ(ierr); 25a6ba4734SToby Isaac ierr = DMCopyBoundary(rdm, dmCoarsened[c]);CHKERRQ(ierr); 26*0d1cd5e0SMatthew G. Knepley if (localized) {ierr = DMLocalizeCoordinates(dmCoarsened[c]);CHKERRQ(ierr);} 27a8fb8f29SToby Isaac ierr = DMSetCoarseDM(rdm, dmCoarsened[c]);CHKERRQ(ierr); 28b653a561SMatthew G. Knepley rdm = dmCoarsened[c]; 29b653a561SMatthew G. Knepley } 30b653a561SMatthew G. Knepley PetscFunctionReturn(0); 31b653a561SMatthew G. Knepley } 32