1e6fc9eceSMatthew G. Knepley static const char help[] = "Test of CAD functionality";
2c4762a1bSJed Brown
3c4762a1bSJed Brown #include <petscdmplex.h>
4c4762a1bSJed Brown
5e6fc9eceSMatthew G. Knepley /* TODO
6e6fc9eceSMatthew G. Knepley - Fix IGES
7e6fc9eceSMatthew G. Knepley - Test tessellation using -dm_plex_egads_with_tess
8e6fc9eceSMatthew G. Knepley */
9e6fc9eceSMatthew G. Knepley
10c4762a1bSJed Brown typedef struct {
11c4762a1bSJed Brown char filename[PETSC_MAX_PATH_LEN];
12e6fc9eceSMatthew G. Knepley PetscBool volumeMesh;
13c4762a1bSJed Brown } AppCtx;
14c4762a1bSJed Brown
ProcessOptions(MPI_Comm comm,AppCtx * options)15d71ae5a4SJacob Faibussowitsch static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
16d71ae5a4SJacob Faibussowitsch {
17c4762a1bSJed Brown PetscFunctionBeginUser;
18c4762a1bSJed Brown options->filename[0] = '\0';
19e6fc9eceSMatthew G. Knepley options->volumeMesh = PETSC_TRUE;
20c4762a1bSJed Brown
21*5552b385SBrandon PetscOptionsBegin(comm, "", "EGADSPlex Problem Options", "EGADSlite");
229566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-filename", "The CAD file", "ex37.c", options->filename, options->filename, sizeof(options->filename), NULL));
239566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-volume_mesh", "Create a volume mesh", "ex37.c", options->volumeMesh, &options->volumeMesh, NULL));
24d0609cedSBarry Smith PetscOptionsEnd();
253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
26c4762a1bSJed Brown }
27c4762a1bSJed Brown
ComputeVolume(DM dm)28d71ae5a4SJacob Faibussowitsch static PetscErrorCode ComputeVolume(DM dm)
29d71ae5a4SJacob Faibussowitsch {
30e6fc9eceSMatthew G. Knepley PetscObject obj = (PetscObject)dm;
31e6fc9eceSMatthew G. Knepley DMLabel bodyLabel, faceLabel, edgeLabel;
32e6fc9eceSMatthew G. Knepley double surface = 0., volume = 0., vol;
33e6fc9eceSMatthew G. Knepley PetscInt dim, pStart, pEnd, p, pid;
34e6fc9eceSMatthew G. Knepley const char *name;
35e6fc9eceSMatthew G. Knepley
36e6fc9eceSMatthew G. Knepley PetscFunctionBeginUser;
379566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim));
383ba16761SJacob Faibussowitsch if (dim < 2) PetscFunctionReturn(PETSC_SUCCESS);
399566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "EGADS Body ID", &bodyLabel));
409566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "EGADS Face ID", &faceLabel));
419566063dSJacob Faibussowitsch PetscCall(DMGetLabel(dm, "EGADS Edge ID", &edgeLabel));
42e6fc9eceSMatthew G. Knepley
439566063dSJacob Faibussowitsch PetscCall(DMPlexGetHeightStratum(dm, 0, &pStart, &pEnd));
44e6fc9eceSMatthew G. Knepley for (p = pStart; p < pEnd; ++p) {
459566063dSJacob Faibussowitsch PetscCall(DMLabelGetValue(dim == 2 ? faceLabel : bodyLabel, p, &pid));
46e6fc9eceSMatthew G. Knepley if (pid >= 0) {
479566063dSJacob Faibussowitsch PetscCall(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL));
48e6fc9eceSMatthew G. Knepley volume += vol;
49e6fc9eceSMatthew G. Knepley }
50e6fc9eceSMatthew G. Knepley }
519566063dSJacob Faibussowitsch PetscCall(DMPlexGetHeightStratum(dm, 1, &pStart, &pEnd));
52e6fc9eceSMatthew G. Knepley for (p = pStart; p < pEnd; ++p) {
539566063dSJacob Faibussowitsch PetscCall(DMLabelGetValue(dim == 2 ? edgeLabel : faceLabel, p, &pid));
54e6fc9eceSMatthew G. Knepley if (pid >= 0) {
559566063dSJacob Faibussowitsch PetscCall(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL));
56e6fc9eceSMatthew G. Knepley surface += vol;
57e6fc9eceSMatthew G. Knepley }
58e6fc9eceSMatthew G. Knepley }
59e6fc9eceSMatthew G. Knepley
609566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName(obj, &name));
619566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PetscObjectComm(obj), "DM %s: Surface Area = %.6e Volume = %.6e\n", name ? name : "", surface, volume));
623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
63e6fc9eceSMatthew G. Knepley }
64e6fc9eceSMatthew G. Knepley
main(int argc,char * argv[])65d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[])
66d71ae5a4SJacob Faibussowitsch {
67e6fc9eceSMatthew G. Knepley DM surface, dm;
686f4f5c14SMatthew G. Knepley AppCtx ctx;
696f4f5c14SMatthew G. Knepley
70327415f7SBarry Smith PetscFunctionBeginUser;
719566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help));
729566063dSJacob Faibussowitsch PetscCall(ProcessOptions(PETSC_COMM_WORLD, &ctx));
739566063dSJacob Faibussowitsch PetscCall(DMPlexCreateFromFile(PETSC_COMM_WORLD, ctx.filename, "ex37_plex", PETSC_TRUE, &surface));
749566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)surface, "CAD Surface"));
759566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)surface, "sur_"));
769566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(surface));
779566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(surface, NULL, "-dm_view"));
789566063dSJacob Faibussowitsch PetscCall(ComputeVolume(surface));
796f4f5c14SMatthew G. Knepley
80e6fc9eceSMatthew G. Knepley if (ctx.volumeMesh) {
819566063dSJacob Faibussowitsch PetscCall(DMPlexGenerate(surface, "tetgen", PETSC_TRUE, &dm));
829566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dm, "CAD Mesh"));
839566063dSJacob Faibussowitsch PetscCall(DMPlexSetRefinementUniform(dm, PETSC_TRUE));
849566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(dm, NULL, "-pre_dm_view"));
85e6fc9eceSMatthew G. Knepley
86*5552b385SBrandon PetscCall(DMPlexInflateToGeomModel(dm, PETSC_TRUE));
879566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(dm, NULL, "-inf_dm_view"));
88c4762a1bSJed Brown
899566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(dm));
909566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
919566063dSJacob Faibussowitsch PetscCall(ComputeVolume(dm));
929566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm));
93*5552b385SBrandon }
949566063dSJacob Faibussowitsch PetscCall(DMDestroy(&surface));
959566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
96b122ec5aSJacob Faibussowitsch return 0;
97c4762a1bSJed Brown }
98c4762a1bSJed Brown
99c4762a1bSJed Brown /*TEST
100c4762a1bSJed Brown
101c4762a1bSJed Brown build:
102*5552b385SBrandon requires: egads tetgen datafilespath
103c4762a1bSJed Brown
104c4762a1bSJed Brown test:
105c4762a1bSJed Brown suffix: sphere_0
106*5552b385SBrandon args: -filename ${DATAFILESPATH}/meshes/cad/sphere_example.egadslite -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_geom_print_model -sur_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID"
107e6fc9eceSMatthew G. Knepley
108e6fc9eceSMatthew G. Knepley test:
109e6fc9eceSMatthew G. Knepley suffix: sphere_egads
110*5552b385SBrandon args: -filename ${DATAFILESPATH}/meshes/cad/sphere_example.egads -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_geom_print_model -sur_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID"
111e6fc9eceSMatthew G. Knepley
112e6fc9eceSMatthew G. Knepley test:
113e6fc9eceSMatthew G. Knepley suffix: sphere_iges
1140338c944SBarry Smith TODO: broken
115*5552b385SBrandon args: -filename ${DATAFILESPATH}/meshes/cad/sphere_example.igs -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_geom_print_model -sur_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID"
116e6fc9eceSMatthew G. Knepley
117e6fc9eceSMatthew G. Knepley test:
118e6fc9eceSMatthew G. Knepley suffix: sphere_step
119*5552b385SBrandon args: -filename ${DATAFILESPATH}/meshes/cad/sphere_example.stp -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_geom_print_model -sur_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID"
1206f4f5c14SMatthew G. Knepley
1216f4f5c14SMatthew G. Knepley test:
1226f4f5c14SMatthew G. Knepley suffix: nozzle_0
123*5552b385SBrandon args: -filename ${DATAFILESPATH}/meshes/cad/nozzle.egadslite -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
124e6fc9eceSMatthew G. Knepley
125e6fc9eceSMatthew G. Knepley test:
126e6fc9eceSMatthew G. Knepley suffix: nozzle_egads
127*5552b385SBrandon args: -filename ${DATAFILESPATH}/meshes/cad/nozzle.egads -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
128e6fc9eceSMatthew G. Knepley
129e6fc9eceSMatthew G. Knepley test:
130e6fc9eceSMatthew G. Knepley suffix: nozzle_iges
131*5552b385SBrandon args: -filename ${DATAFILESPATH}/meshes/cad/nozzle.igs -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
132e6fc9eceSMatthew G. Knepley
133e6fc9eceSMatthew G. Knepley test:
134e6fc9eceSMatthew G. Knepley suffix: nozzle_step
135*5552b385SBrandon args: -filename ${DATAFILESPATH}/meshes/cad/nozzle.stp -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
136c4762a1bSJed Brown
137c4762a1bSJed Brown TEST*/
138