xref: /petsc/src/dm/impls/plex/tests/ex37.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
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   PetscErrorCode ierr;
18c4762a1bSJed Brown 
19c4762a1bSJed Brown   PetscFunctionBeginUser;
20c4762a1bSJed Brown   options->filename[0] = '\0';
21e6fc9eceSMatthew G. Knepley   options->volumeMesh  = PETSC_TRUE;
22c4762a1bSJed Brown 
23c4762a1bSJed Brown   ierr = PetscOptionsBegin(comm, "", "EGADSPlex Problem Options", "EGADSLite");CHKERRQ(ierr);
245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsString("-filename", "The CAD file", "ex37.c", options->filename, options->filename, sizeof(options->filename), NULL));
255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-volume_mesh", "Create a volume mesh", "ex37.c", options->volumeMesh, &options->volumeMesh, NULL));
261e1ea65dSPierre Jolivet   ierr = PetscOptionsEnd();CHKERRQ(ierr);
27c4762a1bSJed Brown   PetscFunctionReturn(0);
28c4762a1bSJed Brown }
29c4762a1bSJed Brown 
30e6fc9eceSMatthew G. Knepley static PetscErrorCode ComputeVolume(DM dm)
31e6fc9eceSMatthew G. Knepley {
32e6fc9eceSMatthew G. Knepley   PetscObject    obj = (PetscObject) dm;
33e6fc9eceSMatthew G. Knepley   DMLabel        bodyLabel, faceLabel, edgeLabel;
34e6fc9eceSMatthew G. Knepley   double         surface = 0., volume = 0., vol;
35e6fc9eceSMatthew G. Knepley   PetscInt       dim, pStart, pEnd, p, pid;
36e6fc9eceSMatthew G. Knepley   const char    *name;
37e6fc9eceSMatthew G. Knepley   PetscErrorCode ierr;
38e6fc9eceSMatthew G. Knepley 
39e6fc9eceSMatthew G. Knepley   PetscFunctionBeginUser;
405f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetDimension(dm, &dim));
41e6fc9eceSMatthew G. Knepley   if (dim < 2) PetscFunctionReturn(0);
425f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetLabel(dm, "EGADS Body ID", &bodyLabel));
435f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetLabel(dm, "EGADS Face ID", &faceLabel));
445f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetLabel(dm, "EGADS Edge ID", &edgeLabel));
45e6fc9eceSMatthew G. Knepley 
465f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexGetHeightStratum(dm, 0, &pStart, &pEnd));
47e6fc9eceSMatthew G. Knepley   for (p = pStart; p < pEnd; ++p) {
485f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValue(dim == 2 ? faceLabel : bodyLabel, p, &pid));
49e6fc9eceSMatthew G. Knepley     if (pid >= 0) {
505f80ce2aSJacob Faibussowitsch       CHKERRQ(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL));
51e6fc9eceSMatthew G. Knepley       volume += vol;
52e6fc9eceSMatthew G. Knepley     }
53e6fc9eceSMatthew G. Knepley   }
545f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexGetHeightStratum(dm, 1, &pStart, &pEnd));
55e6fc9eceSMatthew G. Knepley   for (p = pStart; p < pEnd; ++p) {
565f80ce2aSJacob Faibussowitsch     CHKERRQ(DMLabelGetValue(dim == 2 ? edgeLabel : faceLabel, p, &pid));
57e6fc9eceSMatthew G. Knepley     if (pid >= 0) {
585f80ce2aSJacob Faibussowitsch       CHKERRQ(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL));
59e6fc9eceSMatthew G. Knepley       surface += vol;
60e6fc9eceSMatthew G. Knepley     }
61e6fc9eceSMatthew G. Knepley   }
62e6fc9eceSMatthew G. Knepley 
635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName(obj, &name));
645f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PetscObjectComm(obj), "DM %s: Surface Area = %.6e Volume = %.6e\n", name ? name : "", surface, volume));
65e6fc9eceSMatthew G. Knepley   PetscFunctionReturn(0);
66e6fc9eceSMatthew G. Knepley }
67e6fc9eceSMatthew G. Knepley 
686f4f5c14SMatthew G. Knepley int main(int argc, char *argv[])
696f4f5c14SMatthew G. Knepley {
70e6fc9eceSMatthew G. Knepley   DM             surface, dm;
716f4f5c14SMatthew G. Knepley   AppCtx         ctx;
726f4f5c14SMatthew G. Knepley   PetscErrorCode ierr;
736f4f5c14SMatthew G. Knepley 
74*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc, &argv, NULL, help));
755f80ce2aSJacob Faibussowitsch   CHKERRQ(ProcessOptions(PETSC_COMM_WORLD, &ctx));
765f80ce2aSJacob Faibussowitsch   CHKERRQ(DMPlexCreateFromFile(PETSC_COMM_WORLD, ctx.filename, "ex37_plex", PETSC_TRUE, &surface));
775f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject) surface, "CAD Surface"));
785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetOptionsPrefix((PetscObject) surface, "sur_"));
795f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(surface));
805f80ce2aSJacob Faibussowitsch   CHKERRQ(DMViewFromOptions(surface, NULL, "-dm_view"));
815f80ce2aSJacob Faibussowitsch   CHKERRQ(ComputeVolume(surface));
826f4f5c14SMatthew G. Knepley 
83e6fc9eceSMatthew G. Knepley   if (ctx.volumeMesh) {
845f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexGenerate(surface, "tetgen", PETSC_TRUE, &dm));
855f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject) dm, "CAD Mesh"));
865f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexSetRefinementUniform(dm, PETSC_TRUE));
875f80ce2aSJacob Faibussowitsch     CHKERRQ(DMViewFromOptions(dm, NULL, "-pre_dm_view"));
88e6fc9eceSMatthew G. Knepley 
895f80ce2aSJacob Faibussowitsch     CHKERRQ(DMPlexInflateToGeomModel(dm));
905f80ce2aSJacob Faibussowitsch     CHKERRQ(DMViewFromOptions(dm, NULL, "-inf_dm_view"));
91c4762a1bSJed Brown 
925f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSetFromOptions(dm));
935f80ce2aSJacob Faibussowitsch     CHKERRQ(DMViewFromOptions(dm, NULL, "-dm_view"));
945f80ce2aSJacob Faibussowitsch     CHKERRQ(ComputeVolume(dm));
95e6fc9eceSMatthew G. Knepley   }
96e6fc9eceSMatthew G. Knepley 
975f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&dm));
985f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&surface));
99*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
100*b122ec5aSJacob Faibussowitsch   return 0;
101c4762a1bSJed Brown }
102c4762a1bSJed Brown 
103c4762a1bSJed Brown /*TEST
104c4762a1bSJed Brown 
105c4762a1bSJed Brown   build:
106e6fc9eceSMatthew G. Knepley     requires: egads tetgen
107c4762a1bSJed Brown 
108c4762a1bSJed Brown   test:
109c4762a1bSJed Brown     suffix: sphere_0
110e6fc9eceSMatthew 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"
111e6fc9eceSMatthew G. Knepley 
112e6fc9eceSMatthew G. Knepley   test:
113e6fc9eceSMatthew G. Knepley     suffix: sphere_egads
114e6fc9eceSMatthew 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"
115e6fc9eceSMatthew G. Knepley 
116e6fc9eceSMatthew G. Knepley   test:
117e6fc9eceSMatthew G. Knepley     suffix: sphere_iges
118e6fc9eceSMatthew G. Knepley     requires: broken
119e6fc9eceSMatthew 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"
120e6fc9eceSMatthew G. Knepley 
121e6fc9eceSMatthew G. Knepley   test:
122e6fc9eceSMatthew G. Knepley     suffix: sphere_step
123e6fc9eceSMatthew 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"
1246f4f5c14SMatthew G. Knepley 
1256f4f5c14SMatthew G. Knepley   test:
1266f4f5c14SMatthew G. Knepley     suffix: nozzle_0
127e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egadslite -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
128e6fc9eceSMatthew G. Knepley 
129e6fc9eceSMatthew G. Knepley   test:
130e6fc9eceSMatthew G. Knepley     suffix: nozzle_egads
131e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egads -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
132e6fc9eceSMatthew G. Knepley 
133e6fc9eceSMatthew G. Knepley   test:
134e6fc9eceSMatthew G. Knepley     suffix: nozzle_iges
135e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.igs -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
136e6fc9eceSMatthew G. Knepley 
137e6fc9eceSMatthew G. Knepley   test:
138e6fc9eceSMatthew G. Knepley     suffix: nozzle_step
139e6fc9eceSMatthew G. Knepley     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.stp -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all
140c4762a1bSJed Brown 
141c4762a1bSJed Brown TEST*/
142