Actual source code: ex17.c
1: static const char help[] = "Test of CAD functionality";
3: #include <petscdmplexegads.h>
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;
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));
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: }
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: }
42: int main(int argc, char *argv[])
43: {
44: DM dm;
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"));
52: PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "ref1_"));
53: PetscCall(DMSetFromOptions(dm));
54: PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
56: PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "inf1_"));
57: PetscCall(DMPlexInflateToGeomModel(dm, PETSC_TRUE));
58: PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
60: PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "ref2_"));
61: PetscCall(DMSetFromOptions(dm));
62: PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
64: PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "inf2_"));
65: PetscCall(DMPlexInflateToGeomModel(dm, PETSC_TRUE));
66: PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
68: PetscCall(ComputeVolume(dm));
69: PetscCall(DMDestroy(&dm));
71: PetscCall(PetscFinalize());
72: return 0;
73: }
75: /*TEST
77: build:
78: requires: egads tetgen
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
90: test:
91: suffix: sphere_egadslite
92: args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egadslite
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
100: test:
101: suffix: sphere_egads
102: args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egads
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
110: test:
111: suffix: cylinder_egads
112: args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/cylinder_example.egads
114: test:
115: suffix: cylinder_igs
116: args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/cylinder_example.igs
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
124: test:
125: suffix: nozzle_stp
126: args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.stp
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
134: test:
135: suffix: nozzle_igs
136: args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.igs
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
144: TEST*/