xref: /petsc/src/dm/impls/plex/tests/ex99.c (revision 066ea43f7f75752f012be6cd06b6107ebe84cc6d)
1402df9f0SLisandro Dalcin static char help[] = "Tests DMPlex Gmsh reader.\n\n";
2402df9f0SLisandro Dalcin 
3402df9f0SLisandro Dalcin #include <petscdmplex.h>
4402df9f0SLisandro Dalcin 
5402df9f0SLisandro Dalcin #if !defined(PETSC_GMSH_EXE)
6402df9f0SLisandro Dalcin #define PETSC_GMSH_EXE "gmsh"
7402df9f0SLisandro Dalcin #endif
8402df9f0SLisandro Dalcin 
9402df9f0SLisandro Dalcin int main(int argc, char **argv)
10402df9f0SLisandro Dalcin {
11402df9f0SLisandro Dalcin   DM                dm;
12402df9f0SLisandro Dalcin   const char *const mshlist[] = {"seg", "tri", "qua", "tet", "wed", "hex"};
13402df9f0SLisandro Dalcin   const char *const fmtlist[] = {"msh22", "msh40", "msh41"};
14402df9f0SLisandro Dalcin   PetscInt          msh = 5;
15402df9f0SLisandro Dalcin   PetscInt          fmt = 2;
16402df9f0SLisandro Dalcin   PetscBool         bin = PETSC_FALSE;
17402df9f0SLisandro Dalcin   PetscInt          order = 2;
18402df9f0SLisandro Dalcin 
19402df9f0SLisandro Dalcin   const char        cmdtemplate[] = "%s -3 -format %s %s -order %d %s -o %s";
20402df9f0SLisandro Dalcin   char              gmsh[PETSC_MAX_PATH_LEN] = PETSC_GMSH_EXE;
21402df9f0SLisandro Dalcin   char              tag[PETSC_MAX_PATH_LEN], path[PETSC_MAX_PATH_LEN];
22402df9f0SLisandro Dalcin   char              geo[PETSC_MAX_PATH_LEN], geodir[PETSC_MAX_PATH_LEN] = ".";
23402df9f0SLisandro Dalcin   char              out[PETSC_MAX_PATH_LEN], outdir[PETSC_MAX_PATH_LEN] = ".";
24402df9f0SLisandro Dalcin   char              cmd[PETSC_MAX_PATH_LEN*4];
25402df9f0SLisandro Dalcin   PetscBool         set,flg;
26402df9f0SLisandro Dalcin   FILE              *fp;
27402df9f0SLisandro Dalcin   PetscErrorCode    ierr;
28402df9f0SLisandro Dalcin 
29402df9f0SLisandro Dalcin   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
30402df9f0SLisandro Dalcin 
31402df9f0SLisandro Dalcin   ierr = PetscStrncpy(geodir, "${PETSC_DIR}/share/petsc/datafiles/meshes", sizeof(geodir));CHKERRQ(ierr);
32402df9f0SLisandro Dalcin   ierr = PetscOptionsGetenv(PETSC_COMM_SELF, "GMSH", path, sizeof(path), &set);CHKERRQ(ierr);
33402df9f0SLisandro Dalcin   if (set) {ierr = PetscStrncpy(gmsh, path, sizeof(gmsh));CHKERRQ(ierr);}
34402df9f0SLisandro Dalcin   ierr = PetscOptionsGetString(NULL, NULL, "-gmsh", gmsh, sizeof(gmsh), NULL);CHKERRQ(ierr);
35402df9f0SLisandro Dalcin   ierr = PetscOptionsGetString(NULL, NULL, "-dir", geodir, sizeof(geodir), NULL);CHKERRQ(ierr);
36402df9f0SLisandro Dalcin   ierr = PetscOptionsGetString(NULL, NULL, "-out", outdir, sizeof(outdir), NULL);CHKERRQ(ierr);
37402df9f0SLisandro Dalcin   ierr = PetscOptionsGetEList(NULL, NULL, "-msh", mshlist, 6, &msh, NULL);CHKERRQ(ierr);
38402df9f0SLisandro Dalcin   ierr = PetscOptionsGetEList(NULL, NULL, "-fmt", fmtlist, 3, &fmt, NULL);CHKERRQ(ierr);
39402df9f0SLisandro Dalcin   ierr = PetscOptionsGetBool(NULL, NULL, "-bin", &bin, NULL);CHKERRQ(ierr);
40402df9f0SLisandro Dalcin   ierr = PetscOptionsGetInt(NULL, NULL, "-order", &order, NULL);CHKERRQ(ierr);
41402df9f0SLisandro Dalcin   if (fmt == 1) bin = PETSC_FALSE; /* Recent Gmsh releases cannot generate msh40+binary format*/
42402df9f0SLisandro Dalcin 
43402df9f0SLisandro Dalcin   { /* This test requires Gmsh >= 4.2.0 */
44402df9f0SLisandro Dalcin     int inum = 0, major = 0, minor = 0, micro = 0;
45402df9f0SLisandro Dalcin     ierr = PetscSNPrintf(cmd, sizeof(cmd), "%s -info", gmsh);CHKERRQ(ierr);
46402df9f0SLisandro Dalcin     ierr = PetscPOpen(PETSC_COMM_SELF, NULL, cmd, "r", &fp);CHKERRQ(ierr);
47402df9f0SLisandro Dalcin     if (fp) {inum = fscanf(fp, "Version : %d.%d.%d", &major, &minor, &micro);}
48402df9f0SLisandro Dalcin     ierr = PetscPClose(PETSC_COMM_SELF, fp);CHKERRQ(ierr);
49402df9f0SLisandro Dalcin     if (inum != 3 || major < 4 || (major == 4 && minor < 2)) {
50402df9f0SLisandro Dalcin       ierr = PetscPrintf(PETSC_COMM_SELF, "Gmsh>=4.2.0 not available\n");CHKERRQ(ierr); goto finish;
51402df9f0SLisandro Dalcin     }
52402df9f0SLisandro Dalcin   }
53402df9f0SLisandro Dalcin 
54402df9f0SLisandro Dalcin   ierr = PetscSNPrintf(tag, sizeof(tag), "%s-%d-%s%s", mshlist[msh], order, fmtlist[fmt], bin?"-bin":"");CHKERRQ(ierr);
55402df9f0SLisandro Dalcin   ierr = PetscSNPrintf(geo, sizeof(geo), "%s/gmsh-%s.geo", geodir, mshlist[msh]);CHKERRQ(ierr);
56402df9f0SLisandro Dalcin   ierr = PetscSNPrintf(out, sizeof(out), "%s/mesh-%s.msh", outdir, tag);CHKERRQ(ierr);
57402df9f0SLisandro Dalcin   ierr = PetscStrreplace(PETSC_COMM_SELF, geo, path, sizeof(path));CHKERRQ(ierr);
58402df9f0SLisandro Dalcin   ierr = PetscFixFilename(path, geo);CHKERRQ(ierr);
59402df9f0SLisandro Dalcin   ierr = PetscStrreplace(PETSC_COMM_SELF, out, path, sizeof(path));CHKERRQ(ierr);
60402df9f0SLisandro Dalcin   ierr = PetscFixFilename(path, out);CHKERRQ(ierr);
61402df9f0SLisandro Dalcin   ierr = PetscTestFile(geo, 'r', &flg);CHKERRQ(ierr);
62402df9f0SLisandro Dalcin   if (!flg) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_USER_INPUT, "File not found: %s", geo);
63402df9f0SLisandro Dalcin 
64402df9f0SLisandro Dalcin   ierr = PetscSNPrintf(cmd, sizeof(cmd), cmdtemplate, gmsh, fmtlist[fmt], bin?"-bin":"", order, geo, out);CHKERRQ(ierr);
65402df9f0SLisandro Dalcin   ierr = PetscPOpen(PETSC_COMM_SELF, NULL, cmd, "r", &fp);CHKERRQ(ierr);
66402df9f0SLisandro Dalcin   ierr = PetscPClose(PETSC_COMM_SELF, fp);CHKERRQ(ierr);
67402df9f0SLisandro Dalcin 
68402df9f0SLisandro Dalcin   ierr = DMPlexCreateFromFile(PETSC_COMM_SELF, out, PETSC_TRUE, &dm);CHKERRQ(ierr);
69402df9f0SLisandro Dalcin   ierr = PetscSNPrintf(tag, sizeof(tag), "mesh-%s", mshlist[msh]);CHKERRQ(ierr);
70402df9f0SLisandro Dalcin   ierr = PetscObjectSetName((PetscObject)dm, tag);CHKERRQ(ierr);
71402df9f0SLisandro Dalcin   ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr);
72402df9f0SLisandro Dalcin   ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
73402df9f0SLisandro Dalcin   ierr = DMDestroy(&dm);CHKERRQ(ierr);
74402df9f0SLisandro Dalcin 
75402df9f0SLisandro Dalcin finish:
76402df9f0SLisandro Dalcin   ierr = PetscFinalize();
77402df9f0SLisandro Dalcin   return ierr;
78402df9f0SLisandro Dalcin }
79402df9f0SLisandro Dalcin 
80402df9f0SLisandro Dalcin /*TEST
81402df9f0SLisandro Dalcin 
82402df9f0SLisandro Dalcin   build:
83402df9f0SLisandro Dalcin     requires: define(PETSC_HAVE_POPEN)
84402df9f0SLisandro Dalcin 
85402df9f0SLisandro Dalcin   test:
86402df9f0SLisandro Dalcin     requires: define(PETSC_GMSH_EXE)
87402df9f0SLisandro Dalcin     args: -dir ${wPETSC_DIR}/share/petsc/datafiles/meshes
88402df9f0SLisandro Dalcin     args: -msh {{seg tri qua tet wed hex}separate_output}
89402df9f0SLisandro Dalcin     args: -order {{1 2 3 7}}
90402df9f0SLisandro Dalcin     args: -fmt {{msh22 msh40 msh41}} -bin {{0 1}}
91402df9f0SLisandro Dalcin     args: -dm_view ::ascii_info_detail
92402df9f0SLisandro Dalcin     args: -dm_plex_check_all
93*066ea43fSLisandro Dalcin     args: -dm_plex_gmsh_highorder false
94402df9f0SLisandro Dalcin 
95402df9f0SLisandro Dalcin TEST*/
96