1 static char help[] = "Tests for coarsening\n\n"; 2 3 #include <petscdmplex.h> 4 5 typedef struct { 6 PetscInt debug; /* The debugging level */ 7 PetscInt dim; /* The topological mesh dimension */ 8 PetscInt testNum; /* The particular mesh to test */ 9 PetscBool uninterpolate; /* Uninterpolate the mesh at the end */ 10 char filename[2048]; /* The optional mesh file */ 11 } AppCtx; 12 13 PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 14 { 15 PetscErrorCode ierr; 16 17 PetscFunctionBegin; 18 options->debug = 0; 19 options->dim = 2; 20 options->testNum = 0; 21 options->uninterpolate = PETSC_FALSE; 22 options->filename[0] = '\0'; 23 24 ierr = PetscOptionsBegin(comm, "", "Meshing Problem Options", "DMPLEX");CHKERRQ(ierr); 25 ierr = PetscOptionsBoundedInt("-debug", "The debugging level", "ex14.c", options->debug, &options->debug, NULL,0);CHKERRQ(ierr); 26 ierr = PetscOptionsRangeInt("-dim", "The topological mesh dimension", "ex14.c", options->dim, &options->dim, NULL,1,3);CHKERRQ(ierr); 27 ierr = PetscOptionsBoundedInt("-test_num", "The particular mesh to test", "ex14.c", options->testNum, &options->testNum, NULL,0);CHKERRQ(ierr); 28 ierr = PetscOptionsBool("-uninterpolate", "Uninterpolate the mesh at the end", "ex14.c", options->uninterpolate, &options->uninterpolate, NULL);CHKERRQ(ierr); 29 ierr = PetscOptionsString("-f", "Filename to read", "ex14.c", options->filename, options->filename, sizeof(options->filename), NULL);CHKERRQ(ierr); 30 ierr = PetscOptionsEnd(); 31 PetscFunctionReturn(0); 32 } 33 34 PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm) 35 { 36 const char *filename = user->filename; 37 PetscInt dim = user->dim; 38 size_t len; 39 PetscErrorCode ierr; 40 41 PetscFunctionBegin; 42 ierr = PetscStrlen(filename, &len);CHKERRQ(ierr); 43 if (!len) {ierr = DMPlexCreateBoxMesh(comm, dim, PETSC_TRUE, NULL, NULL, NULL, NULL, PETSC_TRUE, dm);CHKERRQ(ierr);} 44 else {ierr = DMPlexCreateFromFile(comm, filename, PETSC_TRUE, dm);CHKERRQ(ierr);} 45 ierr = DMViewFromOptions(*dm, NULL, "-orig_dm_view");CHKERRQ(ierr); 46 { 47 DM distributedMesh = NULL; 48 49 ierr = DMPlexDistribute(*dm, 0, NULL, &distributedMesh);CHKERRQ(ierr); 50 if (distributedMesh) { 51 ierr = DMDestroy(dm);CHKERRQ(ierr); 52 *dm = distributedMesh; 53 ierr = DMViewFromOptions(*dm, NULL, "-dist_dm_view");CHKERRQ(ierr); 54 } 55 } 56 ierr = DMSetFromOptions(*dm);CHKERRQ(ierr); 57 if (user->uninterpolate) { 58 DM udm = NULL; 59 60 ierr = DMPlexUninterpolate(*dm, &udm);CHKERRQ(ierr); 61 ierr = DMDestroy(dm);CHKERRQ(ierr); 62 *dm = udm; 63 ierr = DMViewFromOptions(*dm, NULL, "-un_dm_view");CHKERRQ(ierr); 64 } 65 ierr = PetscObjectSetName((PetscObject) *dm, "Test Mesh");CHKERRQ(ierr); 66 ierr = DMViewFromOptions(*dm, NULL, "-dm_view");CHKERRQ(ierr); 67 PetscFunctionReturn(0); 68 } 69 70 int main(int argc, char **argv) 71 { 72 DM dm; 73 AppCtx user; 74 PetscErrorCode ierr; 75 76 ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr; 77 ierr = ProcessOptions(PETSC_COMM_WORLD, &user);CHKERRQ(ierr); 78 ierr = CreateMesh(PETSC_COMM_WORLD, &user, &dm);CHKERRQ(ierr); 79 ierr = DMDestroy(&dm);CHKERRQ(ierr); 80 ierr = PetscFinalize(); 81 return ierr; 82 } 83 84 /*TEST 85 test: 86 suffix: 0 87 requires: triangle 88 args: -dm_view -dm_refine 1 -dm_coarsen -dm_plex_check_symmetry -dm_plex_check_skeleton -dm_plex_check_faces 89 90 TEST*/ 91