xref: /petsc/src/dm/impls/plex/tests/ex37.c (revision 98921bda46e76d7aaed9e0138c5ff9d0ce93f355)
1 static const char help[] = "Test of CAD functionality";
2 
3 #include <petscdmplex.h>
4 
5 /* TODO
6   - Fix IGES
7   - Test tessellation using -dm_plex_egads_with_tess
8 */
9 
10 typedef struct {
11   char      filename[PETSC_MAX_PATH_LEN];
12   PetscBool volumeMesh;
13 } AppCtx;
14 
15 static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
16 {
17   PetscErrorCode ierr;
18 
19   PetscFunctionBeginUser;
20   options->filename[0] = '\0';
21   options->volumeMesh  = PETSC_TRUE;
22 
23   ierr = PetscOptionsBegin(comm, "", "EGADSPlex Problem Options", "EGADSLite");CHKERRQ(ierr);
24   ierr = PetscOptionsString("-filename", "The CAD file", "ex37.c", options->filename, options->filename, sizeof(options->filename), NULL);CHKERRQ(ierr);
25   ierr = PetscOptionsBool("-volume_mesh", "Create a volume mesh", "ex37.c", options->volumeMesh, &options->volumeMesh, NULL);CHKERRQ(ierr);
26   ierr = PetscOptionsEnd();CHKERRQ(ierr);
27   PetscFunctionReturn(0);
28 }
29 
30 static PetscErrorCode ComputeVolume(DM dm)
31 {
32   PetscObject    obj = (PetscObject) dm;
33   DMLabel        bodyLabel, faceLabel, edgeLabel;
34   double         surface = 0., volume = 0., vol;
35   PetscInt       dim, pStart, pEnd, p, pid;
36   const char    *name;
37   PetscErrorCode ierr;
38 
39   PetscFunctionBeginUser;
40   ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr);
41   if (dim < 2) PetscFunctionReturn(0);
42   ierr = DMGetLabel(dm, "EGADS Body ID", &bodyLabel);CHKERRQ(ierr);
43   ierr = DMGetLabel(dm, "EGADS Face ID", &faceLabel);CHKERRQ(ierr);
44   ierr = DMGetLabel(dm, "EGADS Edge ID", &edgeLabel);CHKERRQ(ierr);
45 
46   ierr = DMPlexGetHeightStratum(dm, 0, &pStart, &pEnd);CHKERRQ(ierr);
47   for (p = pStart; p < pEnd; ++p) {
48     ierr = DMLabelGetValue(dim == 2 ? faceLabel : bodyLabel, p, &pid);CHKERRQ(ierr);
49     if (pid >= 0) {
50       ierr = DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL);CHKERRQ(ierr);
51       volume += vol;
52     }
53   }
54   ierr = DMPlexGetHeightStratum(dm, 1, &pStart, &pEnd);CHKERRQ(ierr);
55   for (p = pStart; p < pEnd; ++p) {
56     ierr = DMLabelGetValue(dim == 2 ? edgeLabel : faceLabel, p, &pid);CHKERRQ(ierr);
57     if (pid >= 0) {
58       ierr = DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL);CHKERRQ(ierr);
59       surface += vol;
60     }
61   }
62 
63   ierr = PetscObjectGetName(obj, &name);CHKERRQ(ierr);
64   ierr = PetscPrintf(PetscObjectComm(obj), "DM %s: Surface Area = %.6e Volume = %.6e\n", name ? name : "", surface, volume);CHKERRQ(ierr);
65   PetscFunctionReturn(0);
66 }
67 
68 int main(int argc, char *argv[])
69 {
70   DM             surface, dm;
71   AppCtx         ctx;
72   PetscErrorCode ierr;
73 
74   ierr = PetscInitialize(&argc, &argv, NULL, help); if (ierr) return ierr;
75   ierr = ProcessOptions(PETSC_COMM_WORLD, &ctx);CHKERRQ(ierr);
76   ierr = DMPlexCreateFromFile(PETSC_COMM_WORLD, ctx.filename, "ex37_plex", PETSC_TRUE, &surface);CHKERRQ(ierr);
77   ierr = PetscObjectSetName((PetscObject) surface, "CAD Surface");CHKERRQ(ierr);
78   ierr = PetscObjectSetOptionsPrefix((PetscObject) surface, "sur_");CHKERRQ(ierr);
79   ierr = DMSetFromOptions(surface);CHKERRQ(ierr);
80   ierr = DMViewFromOptions(surface, NULL, "-dm_view");CHKERRQ(ierr);
81   ierr = ComputeVolume(surface);CHKERRQ(ierr);
82 
83   if (ctx.volumeMesh) {
84     ierr = DMPlexGenerate(surface, "tetgen", PETSC_TRUE, &dm);CHKERRQ(ierr);
85     ierr = PetscObjectSetName((PetscObject) dm, "CAD Mesh");CHKERRQ(ierr);
86     ierr = DMPlexSetRefinementUniform(dm, PETSC_TRUE);CHKERRQ(ierr);
87     ierr = DMViewFromOptions(dm, NULL, "-pre_dm_view");CHKERRQ(ierr);
88 
89     ierr = DMPlexInflateToGeomModel(dm);CHKERRQ(ierr);
90     ierr = DMViewFromOptions(dm, NULL, "-inf_dm_view");CHKERRQ(ierr);
91 
92     ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
93     ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr);
94     ierr = ComputeVolume(dm);CHKERRQ(ierr);
95   }
96 
97   ierr = DMDestroy(&dm);CHKERRQ(ierr);
98   ierr = DMDestroy(&surface);CHKERRQ(ierr);
99   ierr = PetscFinalize();
100   return ierr;
101 }
102 
103 /*TEST
104 
105   build:
106     requires: egads tetgen
107 
108   test:
109     suffix: sphere_0
110     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.egadslite -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_egads_print_model -sur_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID"
111 
112   test:
113     suffix: sphere_egads
114     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.egads -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_egads_print_model -sur_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID"
115 
116   test:
117     suffix: sphere_iges
118     requires: broken
119     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.igs -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_egads_print_model -sur_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID"
120 
121   test:
122     suffix: sphere_step
123     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.stp -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_egads_print_model -sur_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID"
124 
125   test:
126     suffix: nozzle_0
127     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egadslite -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
128 
129   test:
130     suffix: nozzle_egads
131     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egads -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
132 
133   test:
134     suffix: nozzle_iges
135     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.igs -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
136 
137   test:
138     suffix: nozzle_step
139     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.stp -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
140 
141 TEST*/
142