xref: /petsc/src/dm/impls/plex/tests/ex37.c (revision d0609ced746bc51b019815ca91d747429db24893)
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 
15c4762a1bSJed Brown static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
16c4762a1bSJed Brown {
17c4762a1bSJed Brown   PetscFunctionBeginUser;
18c4762a1bSJed Brown   options->filename[0] = '\0';
19e6fc9eceSMatthew G. Knepley   options->volumeMesh  = PETSC_TRUE;
20c4762a1bSJed Brown 
21*d0609cedSBarry Smith   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));
24*d0609cedSBarry Smith   PetscOptionsEnd();
25c4762a1bSJed Brown   PetscFunctionReturn(0);
26c4762a1bSJed Brown }
27c4762a1bSJed Brown 
28e6fc9eceSMatthew G. Knepley static PetscErrorCode ComputeVolume(DM dm)
29e6fc9eceSMatthew G. Knepley {
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));
38e6fc9eceSMatthew G. Knepley   if (dim < 2) PetscFunctionReturn(0);
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));
62e6fc9eceSMatthew G. Knepley   PetscFunctionReturn(0);
63e6fc9eceSMatthew G. Knepley }
64e6fc9eceSMatthew G. Knepley 
656f4f5c14SMatthew G. Knepley int main(int argc, char *argv[])
666f4f5c14SMatthew G. Knepley {
67e6fc9eceSMatthew G. Knepley   DM             surface, dm;
686f4f5c14SMatthew G. Knepley   AppCtx         ctx;
696f4f5c14SMatthew G. Knepley 
709566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
719566063dSJacob Faibussowitsch   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &ctx));
729566063dSJacob Faibussowitsch   PetscCall(DMPlexCreateFromFile(PETSC_COMM_WORLD, ctx.filename, "ex37_plex", PETSC_TRUE, &surface));
739566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject) surface, "CAD Surface"));
749566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject) surface, "sur_"));
759566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(surface));
769566063dSJacob Faibussowitsch   PetscCall(DMViewFromOptions(surface, NULL, "-dm_view"));
779566063dSJacob Faibussowitsch   PetscCall(ComputeVolume(surface));
786f4f5c14SMatthew G. Knepley 
79e6fc9eceSMatthew G. Knepley   if (ctx.volumeMesh) {
809566063dSJacob Faibussowitsch     PetscCall(DMPlexGenerate(surface, "tetgen", PETSC_TRUE, &dm));
819566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject) dm, "CAD Mesh"));
829566063dSJacob Faibussowitsch     PetscCall(DMPlexSetRefinementUniform(dm, PETSC_TRUE));
839566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(dm, NULL, "-pre_dm_view"));
84e6fc9eceSMatthew G. Knepley 
859566063dSJacob Faibussowitsch     PetscCall(DMPlexInflateToGeomModel(dm));
869566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(dm, NULL, "-inf_dm_view"));
87c4762a1bSJed Brown 
889566063dSJacob Faibussowitsch     PetscCall(DMSetFromOptions(dm));
899566063dSJacob Faibussowitsch     PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
909566063dSJacob Faibussowitsch     PetscCall(ComputeVolume(dm));
91e6fc9eceSMatthew G. Knepley   }
92e6fc9eceSMatthew G. Knepley 
939566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dm));
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:
102e6fc9eceSMatthew G. Knepley     requires: egads tetgen
103c4762a1bSJed Brown 
104c4762a1bSJed Brown   test:
105c4762a1bSJed Brown     suffix: sphere_0
106e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.egadslite -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_egads_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
110e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.egads -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_egads_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
114e6fc9eceSMatthew G. Knepley     requires: broken
115e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.igs -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_egads_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
119e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/unit_sphere.stp -dm_refine 1 -sur_dm_view -dm_plex_check_all -dm_plex_egads_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
123e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/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
127e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/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
131e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/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
135e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.stp -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
136c4762a1bSJed Brown 
137c4762a1bSJed Brown TEST*/
138