1*402df9f0SLisandro Dalcin static char help[] = "Tests DMPlex Gmsh reader.\n\n"; 2*402df9f0SLisandro Dalcin 3*402df9f0SLisandro Dalcin #include <petscdmplex.h> 4*402df9f0SLisandro Dalcin 5*402df9f0SLisandro Dalcin #if !defined(PETSC_GMSH_EXE) 6*402df9f0SLisandro Dalcin #define PETSC_GMSH_EXE "gmsh" 7*402df9f0SLisandro Dalcin #endif 8*402df9f0SLisandro Dalcin 9*402df9f0SLisandro Dalcin int main(int argc, char **argv) 10*402df9f0SLisandro Dalcin { 11*402df9f0SLisandro Dalcin DM dm; 12*402df9f0SLisandro Dalcin const char *const mshlist[] = {"seg", "tri", "qua", "tet", "wed", "hex"}; 13*402df9f0SLisandro Dalcin const char *const fmtlist[] = {"msh22", "msh40", "msh41"}; 14*402df9f0SLisandro Dalcin PetscInt msh = 5; 15*402df9f0SLisandro Dalcin PetscInt fmt = 2; 16*402df9f0SLisandro Dalcin PetscBool bin = PETSC_FALSE; 17*402df9f0SLisandro Dalcin PetscInt order = 2; 18*402df9f0SLisandro Dalcin 19*402df9f0SLisandro Dalcin const char cmdtemplate[] = "%s -3 -format %s %s -order %d %s -o %s"; 20*402df9f0SLisandro Dalcin char gmsh[PETSC_MAX_PATH_LEN] = PETSC_GMSH_EXE; 21*402df9f0SLisandro Dalcin char tag[PETSC_MAX_PATH_LEN], path[PETSC_MAX_PATH_LEN]; 22*402df9f0SLisandro Dalcin char geo[PETSC_MAX_PATH_LEN], geodir[PETSC_MAX_PATH_LEN] = "."; 23*402df9f0SLisandro Dalcin char out[PETSC_MAX_PATH_LEN], outdir[PETSC_MAX_PATH_LEN] = "."; 24*402df9f0SLisandro Dalcin char cmd[PETSC_MAX_PATH_LEN*4]; 25*402df9f0SLisandro Dalcin PetscBool set,flg; 26*402df9f0SLisandro Dalcin FILE *fp; 27*402df9f0SLisandro Dalcin PetscErrorCode ierr; 28*402df9f0SLisandro Dalcin 29*402df9f0SLisandro Dalcin ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr; 30*402df9f0SLisandro Dalcin 31*402df9f0SLisandro Dalcin ierr = PetscStrncpy(geodir, "${PETSC_DIR}/share/petsc/datafiles/meshes", sizeof(geodir));CHKERRQ(ierr); 32*402df9f0SLisandro Dalcin ierr = PetscOptionsGetenv(PETSC_COMM_SELF, "GMSH", path, sizeof(path), &set);CHKERRQ(ierr); 33*402df9f0SLisandro Dalcin if (set) {ierr = PetscStrncpy(gmsh, path, sizeof(gmsh));CHKERRQ(ierr);} 34*402df9f0SLisandro Dalcin ierr = PetscOptionsGetString(NULL, NULL, "-gmsh", gmsh, sizeof(gmsh), NULL);CHKERRQ(ierr); 35*402df9f0SLisandro Dalcin ierr = PetscOptionsGetString(NULL, NULL, "-dir", geodir, sizeof(geodir), NULL);CHKERRQ(ierr); 36*402df9f0SLisandro Dalcin ierr = PetscOptionsGetString(NULL, NULL, "-out", outdir, sizeof(outdir), NULL);CHKERRQ(ierr); 37*402df9f0SLisandro Dalcin ierr = PetscOptionsGetEList(NULL, NULL, "-msh", mshlist, 6, &msh, NULL);CHKERRQ(ierr); 38*402df9f0SLisandro Dalcin ierr = PetscOptionsGetEList(NULL, NULL, "-fmt", fmtlist, 3, &fmt, NULL);CHKERRQ(ierr); 39*402df9f0SLisandro Dalcin ierr = PetscOptionsGetBool(NULL, NULL, "-bin", &bin, NULL);CHKERRQ(ierr); 40*402df9f0SLisandro Dalcin ierr = PetscOptionsGetInt(NULL, NULL, "-order", &order, NULL);CHKERRQ(ierr); 41*402df9f0SLisandro Dalcin if (fmt == 1) bin = PETSC_FALSE; /* Recent Gmsh releases cannot generate msh40+binary format*/ 42*402df9f0SLisandro Dalcin 43*402df9f0SLisandro Dalcin { /* This test requires Gmsh >= 4.2.0 */ 44*402df9f0SLisandro Dalcin int inum = 0, major = 0, minor = 0, micro = 0; 45*402df9f0SLisandro Dalcin ierr = PetscSNPrintf(cmd, sizeof(cmd), "%s -info", gmsh);CHKERRQ(ierr); 46*402df9f0SLisandro Dalcin ierr = PetscPOpen(PETSC_COMM_SELF, NULL, cmd, "r", &fp);CHKERRQ(ierr); 47*402df9f0SLisandro Dalcin if (fp) {inum = fscanf(fp, "Version : %d.%d.%d", &major, &minor, µ);} 48*402df9f0SLisandro Dalcin ierr = PetscPClose(PETSC_COMM_SELF, fp);CHKERRQ(ierr); 49*402df9f0SLisandro Dalcin if (inum != 3 || major < 4 || (major == 4 && minor < 2)) { 50*402df9f0SLisandro Dalcin ierr = PetscPrintf(PETSC_COMM_SELF, "Gmsh>=4.2.0 not available\n");CHKERRQ(ierr); goto finish; 51*402df9f0SLisandro Dalcin } 52*402df9f0SLisandro Dalcin } 53*402df9f0SLisandro Dalcin 54*402df9f0SLisandro Dalcin ierr = PetscSNPrintf(tag, sizeof(tag), "%s-%d-%s%s", mshlist[msh], order, fmtlist[fmt], bin?"-bin":"");CHKERRQ(ierr); 55*402df9f0SLisandro Dalcin ierr = PetscSNPrintf(geo, sizeof(geo), "%s/gmsh-%s.geo", geodir, mshlist[msh]);CHKERRQ(ierr); 56*402df9f0SLisandro Dalcin ierr = PetscSNPrintf(out, sizeof(out), "%s/mesh-%s.msh", outdir, tag);CHKERRQ(ierr); 57*402df9f0SLisandro Dalcin ierr = PetscStrreplace(PETSC_COMM_SELF, geo, path, sizeof(path));CHKERRQ(ierr); 58*402df9f0SLisandro Dalcin ierr = PetscFixFilename(path, geo);CHKERRQ(ierr); 59*402df9f0SLisandro Dalcin ierr = PetscStrreplace(PETSC_COMM_SELF, out, path, sizeof(path));CHKERRQ(ierr); 60*402df9f0SLisandro Dalcin ierr = PetscFixFilename(path, out);CHKERRQ(ierr); 61*402df9f0SLisandro Dalcin ierr = PetscTestFile(geo, 'r', &flg);CHKERRQ(ierr); 62*402df9f0SLisandro Dalcin if (!flg) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_USER_INPUT, "File not found: %s", geo); 63*402df9f0SLisandro Dalcin 64*402df9f0SLisandro Dalcin ierr = PetscSNPrintf(cmd, sizeof(cmd), cmdtemplate, gmsh, fmtlist[fmt], bin?"-bin":"", order, geo, out);CHKERRQ(ierr); 65*402df9f0SLisandro Dalcin ierr = PetscPOpen(PETSC_COMM_SELF, NULL, cmd, "r", &fp);CHKERRQ(ierr); 66*402df9f0SLisandro Dalcin ierr = PetscPClose(PETSC_COMM_SELF, fp);CHKERRQ(ierr); 67*402df9f0SLisandro Dalcin 68*402df9f0SLisandro Dalcin ierr = DMPlexCreateFromFile(PETSC_COMM_SELF, out, PETSC_TRUE, &dm);CHKERRQ(ierr); 69*402df9f0SLisandro Dalcin ierr = PetscSNPrintf(tag, sizeof(tag), "mesh-%s", mshlist[msh]);CHKERRQ(ierr); 70*402df9f0SLisandro Dalcin ierr = PetscObjectSetName((PetscObject)dm, tag);CHKERRQ(ierr); 71*402df9f0SLisandro Dalcin ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr); 72*402df9f0SLisandro Dalcin ierr = DMSetFromOptions(dm);CHKERRQ(ierr); 73*402df9f0SLisandro Dalcin ierr = DMDestroy(&dm);CHKERRQ(ierr); 74*402df9f0SLisandro Dalcin 75*402df9f0SLisandro Dalcin finish: 76*402df9f0SLisandro Dalcin ierr = PetscFinalize(); 77*402df9f0SLisandro Dalcin return ierr; 78*402df9f0SLisandro Dalcin } 79*402df9f0SLisandro Dalcin 80*402df9f0SLisandro Dalcin /*TEST 81*402df9f0SLisandro Dalcin 82*402df9f0SLisandro Dalcin build: 83*402df9f0SLisandro Dalcin requires: define(PETSC_HAVE_POPEN) 84*402df9f0SLisandro Dalcin 85*402df9f0SLisandro Dalcin test: 86*402df9f0SLisandro Dalcin requires: define(PETSC_GMSH_EXE) 87*402df9f0SLisandro Dalcin args: -dir ${wPETSC_DIR}/share/petsc/datafiles/meshes 88*402df9f0SLisandro Dalcin args: -msh {{seg tri qua tet wed hex}separate_output} 89*402df9f0SLisandro Dalcin args: -order {{1 2 3 7}} 90*402df9f0SLisandro Dalcin args: -fmt {{msh22 msh40 msh41}} -bin {{0 1}} 91*402df9f0SLisandro Dalcin args: -dm_view ::ascii_info_detail 92*402df9f0SLisandro Dalcin args: -dm_plex_check_all 93*402df9f0SLisandro Dalcin 94*402df9f0SLisandro Dalcin TEST*/ 95