1 static char help[] = "Read in a mesh and test whether it is valid\n\n"; 2 3 #include <petscdmplex.h> 4 #if defined(PETSC_HAVE_CGNS) 5 #undef I /* Very old CGNS stupidly uses I as a variable, which fails when using complex. Curse you idiot package managers */ 6 #include <cgnslib.h> 7 #endif 8 #if defined(PETSC_HAVE_EXODUSII) 9 #include <exodusII.h> 10 #endif 11 12 typedef struct { 13 PetscBool interpolate; /* Generate intermediate mesh elements */ 14 char filename[PETSC_MAX_PATH_LEN]; /* Mesh filename */ 15 PetscInt dim; 16 PetscErrorCode (**bcFuncs)(PetscInt dim, const PetscReal x[], PetscInt Nf, PetscScalar *u, void *ctx); 17 } AppCtx; 18 19 static PetscErrorCode zero(PetscInt dim, const PetscReal x[], PetscInt Nf, PetscScalar *u, void *ctx) 20 { 21 PetscInt i; 22 for (i = 0; i < dim; ++i) u[i] = 0.0; 23 return 0; 24 } 25 26 static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 27 { 28 PetscErrorCode ierr; 29 30 PetscFunctionBeginUser; 31 options->interpolate = PETSC_TRUE; 32 options->filename[0] = '\0'; 33 options->dim = 2; 34 options->bcFuncs = NULL; 35 36 ierr = PetscOptionsBegin(comm, "", "Meshing Problem Options", "DMPLEX");CHKERRQ(ierr); 37 ierr = PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex2.c", options->interpolate, &options->interpolate, NULL);CHKERRQ(ierr); 38 ierr = PetscOptionsString("-filename", "The mesh file", "ex2.c", options->filename, options->filename, sizeof(options->filename), NULL);CHKERRQ(ierr); 39 ierr = PetscOptionsRangeInt("-dim", "The dimension of problem used for non-file mesh", "ex2.c", options->dim, &options->dim, NULL,1,3);CHKERRQ(ierr); 40 ierr = PetscOptionsEnd(); 41 PetscFunctionReturn(0); 42 } 43 44 static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm) 45 { 46 size_t len; 47 PetscErrorCode ierr; 48 49 PetscFunctionBeginUser; 50 ierr = PetscStrlen(user->filename, &len);CHKERRQ(ierr); 51 if (!len) { 52 DMLabel label; 53 PetscInt id = 1; 54 55 ierr = DMPlexCreateBoxMesh(comm, user->dim, PETSC_TRUE, NULL, NULL, NULL, NULL, user->interpolate, dm);CHKERRQ(ierr); 56 /* Mark boundary and set BC */ 57 ierr = DMCreateLabel(*dm, "boundary");CHKERRQ(ierr); 58 ierr = DMGetLabel(*dm, "boundary", &label);CHKERRQ(ierr); 59 ierr = DMPlexMarkBoundaryFaces(*dm, 1, label);CHKERRQ(ierr); 60 ierr = DMPlexLabelComplete(*dm, label);CHKERRQ(ierr); 61 ierr = PetscMalloc1(1, &user->bcFuncs);CHKERRQ(ierr); 62 user->bcFuncs[0] = zero; 63 ierr = DMAddBoundary(*dm, DM_BC_ESSENTIAL, "wall", "boundary", 0, 0, NULL, (void (*)(void)) user->bcFuncs[0], NULL, 1, &id, user);CHKERRQ(ierr); 64 } else { 65 ierr = DMPlexCreateFromFile(comm, user->filename, user->interpolate, dm);CHKERRQ(ierr); 66 } 67 ierr = PetscObjectSetName((PetscObject) *dm, "Mesh");CHKERRQ(ierr); 68 ierr = DMSetFromOptions(*dm);CHKERRQ(ierr); 69 ierr = DMViewFromOptions(*dm, NULL, "-dm_view");CHKERRQ(ierr); 70 PetscFunctionReturn(0); 71 } 72 73 int main(int argc, char **argv) 74 { 75 DM dm; 76 AppCtx user; 77 PetscErrorCode ierr; 78 79 ierr = PetscInitialize(&argc, &argv, NULL,help);if (ierr) return ierr; 80 ierr = ProcessOptions(PETSC_COMM_WORLD, &user);CHKERRQ(ierr); 81 ierr = CreateMesh(PETSC_COMM_WORLD, &user, &dm);CHKERRQ(ierr); 82 ierr = DMDestroy(&dm);CHKERRQ(ierr); 83 ierr = PetscFree(user.bcFuncs);CHKERRQ(ierr); 84 ierr = PetscFinalize(); 85 return ierr; 86 } 87 88 /*TEST 89 90 testset: 91 args: -dm_plex_check_symmetry -dm_plex_check_skeleton -dm_plex_check_faces -dm_plex_check_geometry 92 # CGNS meshes 0-1 93 test: 94 suffix: 0 95 requires: cgns 96 TODO: broken 97 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/tut21.cgns 98 test: 99 suffix: 1 100 requires: cgns 101 TODO: broken 102 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/grid_c.cgns 103 # Gmsh meshes 2-4 104 test: 105 suffix: 2 106 requires: double 107 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/doublet-tet.msh 108 test: 109 suffix: 3 110 requires: double 111 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square.msh 112 test: 113 suffix: 4 114 requires: double 115 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_bin.msh 116 # Exodus meshes 5-9 117 test: 118 suffix: 5 119 requires: exodusii 120 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/sevenside-quad.exo 121 test: 122 suffix: 6 123 requires: exodusii 124 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/sevenside-quad-15.exo 125 test: 126 suffix: 7 127 requires: exodusii 128 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/squaremotor-30.exo 129 test: 130 suffix: 8 131 requires: exodusii 132 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/blockcylinder-50.exo 133 test: 134 suffix: 9 135 requires: exodusii 136 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/simpleblock-100.exo 137 138 TEST*/ 139