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