1 static const char help[] = "Test of CAD functionality"; 2 3 #include <petscdmplex.h> 4 5 /* TODO 6 - Fix IGES 7 - Test tessellation using -dm_plex_egads_with_tess 8 */ 9 10 typedef struct { 11 char filename[PETSC_MAX_PATH_LEN]; 12 PetscBool volumeMesh; 13 } AppCtx; 14 15 static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 16 { 17 PetscErrorCode ierr; 18 19 PetscFunctionBeginUser; 20 options->filename[0] = '\0'; 21 options->volumeMesh = PETSC_TRUE; 22 23 ierr = PetscOptionsBegin(comm, "", "EGADSPlex Problem Options", "EGADSLite");CHKERRQ(ierr); 24 ierr = PetscOptionsString("-filename", "The CAD file", "ex37.c", options->filename, options->filename, sizeof(options->filename), NULL);CHKERRQ(ierr); 25 ierr = PetscOptionsBool("-volume_mesh", "Create a volume mesh", "ex37.c", options->volumeMesh, &options->volumeMesh, NULL);CHKERRQ(ierr); 26 ierr = PetscOptionsEnd();CHKERRQ(ierr); 27 PetscFunctionReturn(0); 28 } 29 30 static PetscErrorCode ComputeVolume(DM dm) 31 { 32 PetscObject obj = (PetscObject) dm; 33 DMLabel bodyLabel, faceLabel, edgeLabel; 34 double surface = 0., volume = 0., vol; 35 PetscInt dim, pStart, pEnd, p, pid; 36 const char *name; 37 PetscErrorCode ierr; 38 39 PetscFunctionBeginUser; 40 ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr); 41 if (dim < 2) PetscFunctionReturn(0); 42 ierr = DMGetLabel(dm, "EGADS Body ID", &bodyLabel);CHKERRQ(ierr); 43 ierr = DMGetLabel(dm, "EGADS Face ID", &faceLabel);CHKERRQ(ierr); 44 ierr = DMGetLabel(dm, "EGADS Edge ID", &edgeLabel);CHKERRQ(ierr); 45 46 ierr = DMPlexGetHeightStratum(dm, 0, &pStart, &pEnd);CHKERRQ(ierr); 47 for (p = pStart; p < pEnd; ++p) { 48 ierr = DMLabelGetValue(dim == 2 ? faceLabel : bodyLabel, p, &pid);CHKERRQ(ierr); 49 if (pid >= 0) { 50 ierr = DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL);CHKERRQ(ierr); 51 volume += vol; 52 } 53 } 54 ierr = DMPlexGetHeightStratum(dm, 1, &pStart, &pEnd);CHKERRQ(ierr); 55 for (p = pStart; p < pEnd; ++p) { 56 ierr = DMLabelGetValue(dim == 2 ? edgeLabel : faceLabel, p, &pid);CHKERRQ(ierr); 57 if (pid >= 0) { 58 ierr = DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL);CHKERRQ(ierr); 59 surface += vol; 60 } 61 } 62 63 ierr = PetscObjectGetName(obj, &name);CHKERRQ(ierr); 64 ierr = PetscPrintf(PetscObjectComm(obj), "DM %s: Surface Area = %.6e Volume = %.6e\n", name ? name : "", surface, volume);CHKERRQ(ierr); 65 PetscFunctionReturn(0); 66 } 67 68 int main(int argc, char *argv[]) 69 { 70 DM surface, dm; 71 AppCtx ctx; 72 PetscErrorCode ierr; 73 74 ierr = PetscInitialize(&argc, &argv, NULL, help); if (ierr) return ierr; 75 ierr = ProcessOptions(PETSC_COMM_WORLD, &ctx);CHKERRQ(ierr); 76 ierr = DMPlexCreateFromFile(PETSC_COMM_WORLD, ctx.filename, PETSC_TRUE, &surface);CHKERRQ(ierr); 77 ierr = PetscObjectSetName((PetscObject) surface, "CAD Surface");CHKERRQ(ierr); 78 ierr = PetscObjectSetOptionsPrefix((PetscObject) surface, "sur_");CHKERRQ(ierr); 79 ierr = DMSetFromOptions(surface);CHKERRQ(ierr); 80 ierr = DMViewFromOptions(surface, NULL, "-dm_view");CHKERRQ(ierr); 81 ierr = ComputeVolume(surface);CHKERRQ(ierr); 82 83 if (ctx.volumeMesh) { 84 ierr = DMPlexGenerate(surface, "tetgen", PETSC_TRUE, &dm);CHKERRQ(ierr); 85 ierr = PetscObjectSetName((PetscObject) dm, "CAD Mesh");CHKERRQ(ierr); 86 ierr = DMPlexSetRefinementUniform(dm, PETSC_TRUE);CHKERRQ(ierr); 87 ierr = DMViewFromOptions(dm, NULL, "-pre_dm_view");CHKERRQ(ierr); 88 89 ierr = DMPlexInflateToGeomModel(dm);CHKERRQ(ierr); 90 ierr = DMViewFromOptions(dm, NULL, "-inf_dm_view");CHKERRQ(ierr); 91 92 ierr = DMSetFromOptions(dm);CHKERRQ(ierr); 93 ierr = DMViewFromOptions(dm, NULL, "-dm_view");CHKERRQ(ierr); 94 ierr = ComputeVolume(dm);CHKERRQ(ierr); 95 } 96 97 ierr = DMDestroy(&dm);CHKERRQ(ierr); 98 ierr = DMDestroy(&surface);CHKERRQ(ierr); 99 ierr = PetscFinalize(); 100 return ierr; 101 } 102 103 /*TEST 104 105 build: 106 requires: egads tetgen 107 108 test: 109 suffix: sphere_0 110 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" 111 112 test: 113 suffix: sphere_egads 114 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" 115 116 test: 117 suffix: sphere_iges 118 requires: broken 119 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" 120 121 test: 122 suffix: sphere_step 123 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" 124 125 test: 126 suffix: nozzle_0 127 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egadslite -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all 128 129 test: 130 suffix: nozzle_egads 131 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egads -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all 132 133 test: 134 suffix: nozzle_iges 135 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.igs -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all 136 137 test: 138 suffix: nozzle_step 139 args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.stp -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all 140 141 TEST*/ 142