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