141e3e744Sksagiyam static char help[] = "Tests for DMPlexMarkBoundaryFaces()\n\n"; 241e3e744Sksagiyam 341e3e744Sksagiyam #include <petscdmplex.h> 441e3e744Sksagiyam #include <petscsf.h> 541e3e744Sksagiyam 641e3e744Sksagiyam typedef struct { 741e3e744Sksagiyam PetscInt overlap; /* The overlap size used when partitioning */ 841e3e744Sksagiyam } AppCtx; 941e3e744Sksagiyam 1041e3e744Sksagiyam PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 1141e3e744Sksagiyam { 1241e3e744Sksagiyam PetscFunctionBegin; 1341e3e744Sksagiyam options->overlap = 0; 1441e3e744Sksagiyam 1541e3e744Sksagiyam PetscOptionsBegin(comm, "", "Options for DMPlexMarkBoundaryFaces() problem", "DMPLEX"); 1641e3e744Sksagiyam PetscCall(PetscOptionsBoundedInt("-overlap", "The overlap size used", "ex70.c", options->overlap, &options->overlap, NULL, 0)); 1741e3e744Sksagiyam PetscOptionsEnd(); 1841e3e744Sksagiyam PetscFunctionReturn(PETSC_SUCCESS); 1941e3e744Sksagiyam } 2041e3e744Sksagiyam 2141e3e744Sksagiyam static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm) 2241e3e744Sksagiyam { 2341e3e744Sksagiyam PetscFunctionBeginUser; 2441e3e744Sksagiyam { 2541e3e744Sksagiyam const PetscInt faces[2] = {2, 2}; 2641e3e744Sksagiyam 27*42108689Sksagiyam PetscCall(DMPlexCreateBoxMesh(comm, 2, PETSC_TRUE, faces, NULL, NULL, NULL, PETSC_TRUE, 0, PETSC_TRUE, dm)); 2841e3e744Sksagiyam } 2941e3e744Sksagiyam { 3041e3e744Sksagiyam PetscPartitioner part; 3141e3e744Sksagiyam PetscInt *sizes = NULL; 3241e3e744Sksagiyam PetscInt *points = NULL; 3341e3e744Sksagiyam PetscMPIInt rank, size; 3441e3e744Sksagiyam 3541e3e744Sksagiyam PetscCallMPI(MPI_Comm_rank(comm, &rank)); 3641e3e744Sksagiyam PetscCallMPI(MPI_Comm_size(comm, &size)); 3741e3e744Sksagiyam if (rank == 0) { 3841e3e744Sksagiyam PetscInt sizes1[2] = {4, 4}; 3941e3e744Sksagiyam PetscInt points1[8] = {3, 5, 6, 7, 0, 1, 2, 4}; 4041e3e744Sksagiyam 4141e3e744Sksagiyam PetscCall(PetscMalloc2(2, &sizes, 8, &points)); 4241e3e744Sksagiyam PetscCall(PetscArraycpy(sizes, sizes1, 2)); 4341e3e744Sksagiyam PetscCall(PetscArraycpy(points, points1, 8)); 4441e3e744Sksagiyam } 4541e3e744Sksagiyam PetscCall(DMPlexGetPartitioner(*dm, &part)); 4641e3e744Sksagiyam PetscCall(PetscPartitionerSetType(part, PETSCPARTITIONERSHELL)); 4741e3e744Sksagiyam PetscCall(PetscPartitionerShellSetPartition(part, size, sizes, points)); 4841e3e744Sksagiyam PetscCall(PetscFree2(sizes, points)); 4941e3e744Sksagiyam } 5041e3e744Sksagiyam { 5141e3e744Sksagiyam DM dmDist = NULL; 5241e3e744Sksagiyam 5341e3e744Sksagiyam PetscCall(DMSetAdjacency(*dm, -1, PETSC_FALSE, PETSC_TRUE)); 5441e3e744Sksagiyam PetscCall(DMPlexDistribute(*dm, user->overlap, NULL, &dmDist)); 5541e3e744Sksagiyam if (dmDist) { 5641e3e744Sksagiyam PetscCall(DMDestroy(dm)); 5741e3e744Sksagiyam *dm = dmDist; 5841e3e744Sksagiyam } 5941e3e744Sksagiyam } 6041e3e744Sksagiyam PetscFunctionReturn(PETSC_SUCCESS); 6141e3e744Sksagiyam } 6241e3e744Sksagiyam 6341e3e744Sksagiyam int main(int argc, char **argv) 6441e3e744Sksagiyam { 6541e3e744Sksagiyam DM dm; 6641e3e744Sksagiyam DMLabel extLabel; 6741e3e744Sksagiyam MPI_Comm comm; 6841e3e744Sksagiyam PetscMPIInt size; 6941e3e744Sksagiyam AppCtx user; 7041e3e744Sksagiyam 7141e3e744Sksagiyam PetscFunctionBeginUser; 7241e3e744Sksagiyam PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 7341e3e744Sksagiyam comm = PETSC_COMM_WORLD; 7441e3e744Sksagiyam PetscCallMPI(MPI_Comm_size(comm, &size)); 7541e3e744Sksagiyam if (size != 2) { 7641e3e744Sksagiyam PetscCall(PetscPrintf(comm, "This example is specifically designed for comm size == 2.\n")); 7741e3e744Sksagiyam PetscCall(PetscFinalize()); 7841e3e744Sksagiyam return 0; 7941e3e744Sksagiyam } 8041e3e744Sksagiyam PetscCall(ProcessOptions(comm, &user)); 8141e3e744Sksagiyam PetscCall(CreateMesh(comm, &user, &dm)); 8241e3e744Sksagiyam PetscCall(DMCreateLabel(dm, "exterior_facets")); 8341e3e744Sksagiyam PetscCall(DMGetLabel(dm, "exterior_facets", &extLabel)); 8441e3e744Sksagiyam PetscCall(DMPlexMarkBoundaryFaces(dm, 1, extLabel)); 8541e3e744Sksagiyam PetscCall(PetscObjectSetName((PetscObject)dm, "Example_DM")); 8641e3e744Sksagiyam PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 8741e3e744Sksagiyam PetscCall(DMDestroy(&dm)); 8841e3e744Sksagiyam PetscCall(PetscFinalize()); 8941e3e744Sksagiyam return 0; 9041e3e744Sksagiyam } 9141e3e744Sksagiyam 9241e3e744Sksagiyam /*TEST 9341e3e744Sksagiyam 9441e3e744Sksagiyam test: 9541e3e744Sksagiyam nsize: 2 9641e3e744Sksagiyam requires: triangle 9741e3e744Sksagiyam args: -overlap {{0 1}separate output} -dm_view ascii::ascii_info_detail 9841e3e744Sksagiyam 9941e3e744Sksagiyam TEST*/ 100