xref: /petsc/src/dm/impls/plex/tutorials/ex17.c (revision d8fefa7da374a7c9d9698b3d028f8bd47fd6d665)
1*5552b385SBrandon static const char help[] = "Test of CAD functionality";
2*5552b385SBrandon 
3*5552b385SBrandon #include <petscdmplexegads.h>
4*5552b385SBrandon 
ComputeVolume(DM dm)5*5552b385SBrandon static PetscErrorCode ComputeVolume(DM dm)
6*5552b385SBrandon {
7*5552b385SBrandon   DMLabel     bodyLabel, faceLabel, edgeLabel;
8*5552b385SBrandon   double      surface = 0., volume = 0., vol;
9*5552b385SBrandon   PetscInt    dim, pStart, pEnd, pid;
10*5552b385SBrandon   const char *name;
11*5552b385SBrandon 
12*5552b385SBrandon   PetscFunctionBeginUser;
13*5552b385SBrandon   PetscCall(DMGetDimension(dm, &dim));
14*5552b385SBrandon   if (dim < 2) PetscFunctionReturn(0);
15*5552b385SBrandon   PetscCall(DMGetCoordinatesLocalSetUp(dm));
16*5552b385SBrandon   PetscCall(DMGetLabel(dm, "EGADS Body ID", &bodyLabel));
17*5552b385SBrandon   PetscCall(DMGetLabel(dm, "EGADS Face ID", &faceLabel));
18*5552b385SBrandon   PetscCall(DMGetLabel(dm, "EGADS Edge ID", &edgeLabel));
19*5552b385SBrandon 
20*5552b385SBrandon   PetscCall(DMPlexGetHeightStratum(dm, 0, &pStart, &pEnd));
21*5552b385SBrandon   for (PetscInt p = pStart; p < pEnd; ++p) {
22*5552b385SBrandon     PetscCall(DMLabelGetValue(dim == 2 ? faceLabel : bodyLabel, p, &pid));
23*5552b385SBrandon     if (pid >= 0) {
24*5552b385SBrandon       PetscCall(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL));
25*5552b385SBrandon       volume += vol;
26*5552b385SBrandon     }
27*5552b385SBrandon   }
28*5552b385SBrandon   PetscCall(DMPlexGetHeightStratum(dm, 1, &pStart, &pEnd));
29*5552b385SBrandon   for (PetscInt p = pStart; p < pEnd; ++p) {
30*5552b385SBrandon     PetscCall(DMLabelGetValue(dim == 2 ? edgeLabel : faceLabel, p, &pid));
31*5552b385SBrandon     if (pid >= 0) {
32*5552b385SBrandon       PetscCall(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL));
33*5552b385SBrandon       surface += vol;
34*5552b385SBrandon     }
35*5552b385SBrandon   }
36*5552b385SBrandon 
37*5552b385SBrandon   PetscCall(PetscObjectGetName((PetscObject)dm, &name));
38*5552b385SBrandon   PetscCall(PetscPrintf(PetscObjectComm((PetscObject)dm), "DM %s: Surface Area = %.6e Volume = %.6e\n", name ? name : "", surface, volume));
39*5552b385SBrandon   PetscFunctionReturn(0);
40*5552b385SBrandon }
41*5552b385SBrandon 
main(int argc,char * argv[])42*5552b385SBrandon int main(int argc, char *argv[])
43*5552b385SBrandon {
44*5552b385SBrandon   DM dm;
45*5552b385SBrandon 
46*5552b385SBrandon   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
47*5552b385SBrandon   PetscCall(DMCreate(PETSC_COMM_WORLD, &dm));
48*5552b385SBrandon   PetscCall(DMSetType(dm, DMPLEX));
49*5552b385SBrandon   PetscCall(DMSetFromOptions(dm));
50*5552b385SBrandon   PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
51*5552b385SBrandon 
52*5552b385SBrandon   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "ref1_"));
53*5552b385SBrandon   PetscCall(DMSetFromOptions(dm));
54*5552b385SBrandon   PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
55*5552b385SBrandon 
56*5552b385SBrandon   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "inf1_"));
57*5552b385SBrandon   PetscCall(DMPlexInflateToGeomModel(dm, PETSC_TRUE));
58*5552b385SBrandon   PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
59*5552b385SBrandon 
60*5552b385SBrandon   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "ref2_"));
61*5552b385SBrandon   PetscCall(DMSetFromOptions(dm));
62*5552b385SBrandon   PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
63*5552b385SBrandon 
64*5552b385SBrandon   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "inf2_"));
65*5552b385SBrandon   PetscCall(DMPlexInflateToGeomModel(dm, PETSC_TRUE));
66*5552b385SBrandon   PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
67*5552b385SBrandon 
68*5552b385SBrandon   PetscCall(ComputeVolume(dm));
69*5552b385SBrandon   PetscCall(DMDestroy(&dm));
70*5552b385SBrandon 
71*5552b385SBrandon   PetscCall(PetscFinalize());
72*5552b385SBrandon   return 0;
73*5552b385SBrandon }
74*5552b385SBrandon 
75*5552b385SBrandon /*TEST
76*5552b385SBrandon 
77*5552b385SBrandon   build:
78*5552b385SBrandon     requires: egads tetgen
79*5552b385SBrandon 
80*5552b385SBrandon   testset:
81*5552b385SBrandon     requires: datafilespath
82*5552b385SBrandon     args: -bd_dm_distribute 0 -bd_dm_plex_name "CAD Surface" -bd_dm_plex_check_all -dm_plex_geom_print_model \
83*5552b385SBrandon           -bd_dm_view -bd_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID" \
84*5552b385SBrandon           -bd_dm_generator tetgen -dm_plex_name "CAD Mesh" -dm_view hdf5:sphere_volume.h5 \
85*5552b385SBrandon           -ref1_dm_refine 1 -ref1_dm_view hdf5:sphere_volume.h5 \
86*5552b385SBrandon           -inf1_dm_view hdf5:sphere_volume_inflate1.h5 \
87*5552b385SBrandon           -ref2_dm_refine 1 -ref2_dm_view hdf5:sphere_volume.h5 \
88*5552b385SBrandon           -inf2_dm_view hdf5:sphere_volume_inflate2.h5
89*5552b385SBrandon 
90*5552b385SBrandon     test:
91*5552b385SBrandon       suffix: sphere_egadslite
92*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egadslite
93*5552b385SBrandon 
94*5552b385SBrandon     test:
95*5552b385SBrandon       suffix: sphere_egadslite_tess
96*5552b385SBrandon       TODO: broken
97*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egadslite \
98*5552b385SBrandon             -dm_plex_geom_tess_model 1
99*5552b385SBrandon 
100*5552b385SBrandon     test:
101*5552b385SBrandon       suffix: sphere_egads
102*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egads
103*5552b385SBrandon 
104*5552b385SBrandon     test:
105*5552b385SBrandon       suffix: sphere_egads_tess
106*5552b385SBrandon       TODO: broken
107*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egads \
108*5552b385SBrandon             -dm_plex_geom_tess_model 1
109*5552b385SBrandon 
110*5552b385SBrandon     test:
111*5552b385SBrandon       suffix: cylinder_egads
112*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/cylinder_example.egads
113*5552b385SBrandon 
114*5552b385SBrandon     test:
115*5552b385SBrandon       suffix: cylinder_igs
116*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/cylinder_example.igs
117*5552b385SBrandon 
118*5552b385SBrandon     test:
119*5552b385SBrandon       suffix: cylinder_igs_tess
120*5552b385SBrandon       TODO: broken
121*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/cylinder_example.igs \
122*5552b385SBrandon             -dm_plex_geom_tess_model 1 -ref1_dm_refine 0 -ref2_dm_refine 0 -bd_dm_plex_view_labels
123*5552b385SBrandon 
124*5552b385SBrandon     test:
125*5552b385SBrandon       suffix: nozzle_stp
126*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.stp
127*5552b385SBrandon 
128*5552b385SBrandon     test:
129*5552b385SBrandon       suffix: nozzle_stp_tess
130*5552b385SBrandon       TODO: broken
131*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.stp \
132*5552b385SBrandon             -dm_plex_geom_tess_model 1 -ref1_dm_refine 0 -ref2_dm_refine 0 -bd_dm_plex_view_labels
133*5552b385SBrandon 
134*5552b385SBrandon     test:
135*5552b385SBrandon       suffix: nozzle_igs
136*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.igs
137*5552b385SBrandon 
138*5552b385SBrandon     test:
139*5552b385SBrandon       suffix: nozzle_igs_tess
140*5552b385SBrandon       TODO: broken
141*5552b385SBrandon       args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.igs \
142*5552b385SBrandon             -dm_plex_geom_tess_model 1 -ref1_dm_refine 0 -ref2_dm_refine 0 -bd_dm_plex_view_labels
143*5552b385SBrandon 
144*5552b385SBrandon TEST*/
145