xref: /petsc/src/dm/impls/plex/tests/ex37.c (revision d8fefa7da374a7c9d9698b3d028f8bd47fd6d665)
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