static PetscErrorCode CreateBoundaryMesh(DM dm, DMLabel *bdLabel, DM *subdm, AppCtx *user) { DMLabel label; PetscInt dim; PetscErrorCode ierr; PetscFunctionBeginUser; ierr = DMLabelCreate(PETSC_COMM_SELF, "sub", &label);CHKERRQ(ierr); ierr = DMPlexMarkBoundaryFaces(dm, 1, label);CHKERRQ(ierr); ierr = DMPlexLabelComplete(dm, label);CHKERRQ(ierr); ierr = DMPlexCreateSubmesh(dm, label, 1, PETSC_TRUE, subdm);CHKERRQ(ierr); ierr = DMGetDimension(*subdm, &dim);CHKERRQ(ierr); ierr = SetupDiscretization(*subdm, dim, user->cellSimplex, user);CHKERRQ(ierr); ierr = PetscObjectSetName((PetscObject) *subdm, "boundary");CHKERRQ(ierr); ierr = DMViewFromOptions(*subdm, NULL, "-sub_dm_view");CHKERRQ(ierr); if (bdLabel) *bdLabel = label; else ierr = DMLabelDestroy(&label);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN void PETSC_STDCALL dmplexcreatesubmesh_(DM dm,DMLabel vertexLabel,PetscInt *value,DM *subdm, int *__ierr ){ *__ierr = DMPlexCreateSubmesh( (DM)PetscToPointer((dm) ), (DMLabel)PetscToPointer((vertexLabel) ),*value,subdm); }