Actual source code: ex37.c

  1: static const char help[] = "Test of CAD functionality";

  3: #include <petscdmplex.h>

  5: /* TODO
  6:   - Fix IGES
  7:   - Test tessellation using -dm_plex_egads_with_tess
  8: */

 10: typedef struct {
 11:   char      filename[PETSC_MAX_PATH_LEN];
 12:   PetscBool volumeMesh;
 13: } AppCtx;

 15: static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
 16: {
 17:   PetscFunctionBeginUser;
 18:   options->filename[0] = '\0';
 19:   options->volumeMesh  = PETSC_TRUE;

 21:   PetscOptionsBegin(comm, "", "EGADSPlex Problem Options", "EGADSLite");
 22:   PetscCall(PetscOptionsString("-filename", "The CAD file", "ex37.c", options->filename, options->filename, sizeof(options->filename), NULL));
 23:   PetscCall(PetscOptionsBool("-volume_mesh", "Create a volume mesh", "ex37.c", options->volumeMesh, &options->volumeMesh, NULL));
 24:   PetscOptionsEnd();
 25:   PetscFunctionReturn(PETSC_SUCCESS);
 26: }

 28: static PetscErrorCode ComputeVolume(DM dm)
 29: {
 30:   PetscObject obj = (PetscObject)dm;
 31:   DMLabel     bodyLabel, faceLabel, edgeLabel;
 32:   double      surface = 0., volume = 0., vol;
 33:   PetscInt    dim, pStart, pEnd, p, pid;
 34:   const char *name;

 36:   PetscFunctionBeginUser;
 37:   PetscCall(DMGetDimension(dm, &dim));
 38:   if (dim < 2) PetscFunctionReturn(PETSC_SUCCESS);
 39:   PetscCall(DMGetLabel(dm, "EGADS Body ID", &bodyLabel));
 40:   PetscCall(DMGetLabel(dm, "EGADS Face ID", &faceLabel));
 41:   PetscCall(DMGetLabel(dm, "EGADS Edge ID", &edgeLabel));

 43:   PetscCall(DMPlexGetHeightStratum(dm, 0, &pStart, &pEnd));
 44:   for (p = pStart; p < pEnd; ++p) {
 45:     PetscCall(DMLabelGetValue(dim == 2 ? faceLabel : bodyLabel, p, &pid));
 46:     if (pid >= 0) {
 47:       PetscCall(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL));
 48:       volume += vol;
 49:     }
 50:   }
 51:   PetscCall(DMPlexGetHeightStratum(dm, 1, &pStart, &pEnd));
 52:   for (p = pStart; p < pEnd; ++p) {
 53:     PetscCall(DMLabelGetValue(dim == 2 ? edgeLabel : faceLabel, p, &pid));
 54:     if (pid >= 0) {
 55:       PetscCall(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL));
 56:       surface += vol;
 57:     }
 58:   }

 60:   PetscCall(PetscObjectGetName(obj, &name));
 61:   PetscCall(PetscPrintf(PetscObjectComm(obj), "DM %s: Surface Area = %.6e Volume = %.6e\n", name ? name : "", surface, volume));
 62:   PetscFunctionReturn(PETSC_SUCCESS);
 63: }

 65: int main(int argc, char *argv[])
 66: {
 67:   DM     surface, dm;
 68:   AppCtx ctx;

 70:   PetscFunctionBeginUser;
 71:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 72:   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &ctx));
 73:   PetscCall(DMPlexCreateFromFile(PETSC_COMM_WORLD, ctx.filename, "ex37_plex", PETSC_TRUE, &surface));
 74:   PetscCall(PetscObjectSetName((PetscObject)surface, "CAD Surface"));
 75:   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)surface, "sur_"));
 76:   PetscCall(DMSetFromOptions(surface));
 77:   PetscCall(DMViewFromOptions(surface, NULL, "-dm_view"));
 78:   PetscCall(ComputeVolume(surface));

 80:   if (ctx.volumeMesh) {
 81:     PetscCall(DMPlexGenerate(surface, "tetgen", PETSC_TRUE, &dm));
 82:     PetscCall(PetscObjectSetName((PetscObject)dm, "CAD Mesh"));
 83:     PetscCall(DMPlexSetRefinementUniform(dm, PETSC_TRUE));
 84:     PetscCall(DMViewFromOptions(dm, NULL, "-pre_dm_view"));

 86:     PetscCall(DMPlexInflateToGeomModel(dm));
 87:     PetscCall(DMViewFromOptions(dm, NULL, "-inf_dm_view"));

 89:     PetscCall(DMSetFromOptions(dm));
 90:     PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
 91:     PetscCall(ComputeVolume(dm));
 92:   }

 94:   PetscCall(DMDestroy(&dm));
 95:   PetscCall(DMDestroy(&surface));
 96:   PetscCall(PetscFinalize());
 97:   return 0;
 98: }

100: /*TEST

102:   build:
103:     requires: egads tetgen

105:   test:
106:     suffix: sphere_0
107:     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"

109:   test:
110:     suffix: sphere_egads
111:     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"

113:   test:
114:     suffix: sphere_iges
115:     requires: broken
116:     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"

118:   test:
119:     suffix: sphere_step
120:     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"

122:   test:
123:     suffix: nozzle_0
124:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egadslite -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all

126:   test:
127:     suffix: nozzle_egads
128:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egads -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all

130:   test:
131:     suffix: nozzle_iges
132:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.igs -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all

134:   test:
135:     suffix: nozzle_step
136:     args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.stp -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all

138: TEST*/