1*5552b385SBrandon static const char help[] = "Test of CAD functionality"; 2*5552b385SBrandon 3*5552b385SBrandon #include <petscdmplexegads.h> 4*5552b385SBrandon 5*5552b385SBrandon static PetscErrorCode ComputeVolume(DM dm) 6*5552b385SBrandon { 7*5552b385SBrandon DMLabel bodyLabel, faceLabel, edgeLabel; 8*5552b385SBrandon double surface = 0., volume = 0., vol; 9*5552b385SBrandon PetscInt dim, pStart, pEnd, pid; 10*5552b385SBrandon const char *name; 11*5552b385SBrandon 12*5552b385SBrandon PetscFunctionBeginUser; 13*5552b385SBrandon PetscCall(DMGetDimension(dm, &dim)); 14*5552b385SBrandon if (dim < 2) PetscFunctionReturn(0); 15*5552b385SBrandon PetscCall(DMGetCoordinatesLocalSetUp(dm)); 16*5552b385SBrandon PetscCall(DMGetLabel(dm, "EGADS Body ID", &bodyLabel)); 17*5552b385SBrandon PetscCall(DMGetLabel(dm, "EGADS Face ID", &faceLabel)); 18*5552b385SBrandon PetscCall(DMGetLabel(dm, "EGADS Edge ID", &edgeLabel)); 19*5552b385SBrandon 20*5552b385SBrandon PetscCall(DMPlexGetHeightStratum(dm, 0, &pStart, &pEnd)); 21*5552b385SBrandon for (PetscInt p = pStart; p < pEnd; ++p) { 22*5552b385SBrandon PetscCall(DMLabelGetValue(dim == 2 ? faceLabel : bodyLabel, p, &pid)); 23*5552b385SBrandon if (pid >= 0) { 24*5552b385SBrandon PetscCall(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL)); 25*5552b385SBrandon volume += vol; 26*5552b385SBrandon } 27*5552b385SBrandon } 28*5552b385SBrandon PetscCall(DMPlexGetHeightStratum(dm, 1, &pStart, &pEnd)); 29*5552b385SBrandon for (PetscInt p = pStart; p < pEnd; ++p) { 30*5552b385SBrandon PetscCall(DMLabelGetValue(dim == 2 ? edgeLabel : faceLabel, p, &pid)); 31*5552b385SBrandon if (pid >= 0) { 32*5552b385SBrandon PetscCall(DMPlexComputeCellGeometryFVM(dm, p, &vol, NULL, NULL)); 33*5552b385SBrandon surface += vol; 34*5552b385SBrandon } 35*5552b385SBrandon } 36*5552b385SBrandon 37*5552b385SBrandon PetscCall(PetscObjectGetName((PetscObject)dm, &name)); 38*5552b385SBrandon PetscCall(PetscPrintf(PetscObjectComm((PetscObject)dm), "DM %s: Surface Area = %.6e Volume = %.6e\n", name ? name : "", surface, volume)); 39*5552b385SBrandon PetscFunctionReturn(0); 40*5552b385SBrandon } 41*5552b385SBrandon 42*5552b385SBrandon int main(int argc, char *argv[]) 43*5552b385SBrandon { 44*5552b385SBrandon DM dm; 45*5552b385SBrandon 46*5552b385SBrandon PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 47*5552b385SBrandon PetscCall(DMCreate(PETSC_COMM_WORLD, &dm)); 48*5552b385SBrandon PetscCall(DMSetType(dm, DMPLEX)); 49*5552b385SBrandon PetscCall(DMSetFromOptions(dm)); 50*5552b385SBrandon PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 51*5552b385SBrandon 52*5552b385SBrandon PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "ref1_")); 53*5552b385SBrandon PetscCall(DMSetFromOptions(dm)); 54*5552b385SBrandon PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 55*5552b385SBrandon 56*5552b385SBrandon PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "inf1_")); 57*5552b385SBrandon PetscCall(DMPlexInflateToGeomModel(dm, PETSC_TRUE)); 58*5552b385SBrandon PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 59*5552b385SBrandon 60*5552b385SBrandon PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "ref2_")); 61*5552b385SBrandon PetscCall(DMSetFromOptions(dm)); 62*5552b385SBrandon PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 63*5552b385SBrandon 64*5552b385SBrandon PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "inf2_")); 65*5552b385SBrandon PetscCall(DMPlexInflateToGeomModel(dm, PETSC_TRUE)); 66*5552b385SBrandon PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 67*5552b385SBrandon 68*5552b385SBrandon PetscCall(ComputeVolume(dm)); 69*5552b385SBrandon PetscCall(DMDestroy(&dm)); 70*5552b385SBrandon 71*5552b385SBrandon PetscCall(PetscFinalize()); 72*5552b385SBrandon return 0; 73*5552b385SBrandon } 74*5552b385SBrandon 75*5552b385SBrandon /*TEST 76*5552b385SBrandon 77*5552b385SBrandon build: 78*5552b385SBrandon requires: egads tetgen 79*5552b385SBrandon 80*5552b385SBrandon testset: 81*5552b385SBrandon requires: datafilespath 82*5552b385SBrandon args: -bd_dm_distribute 0 -bd_dm_plex_name "CAD Surface" -bd_dm_plex_check_all -dm_plex_geom_print_model \ 83*5552b385SBrandon -bd_dm_view -bd_dm_plex_view_labels "EGADS Body ID","EGADS Face ID","EGADS Edge ID" \ 84*5552b385SBrandon -bd_dm_generator tetgen -dm_plex_name "CAD Mesh" -dm_view hdf5:sphere_volume.h5 \ 85*5552b385SBrandon -ref1_dm_refine 1 -ref1_dm_view hdf5:sphere_volume.h5 \ 86*5552b385SBrandon -inf1_dm_view hdf5:sphere_volume_inflate1.h5 \ 87*5552b385SBrandon -ref2_dm_refine 1 -ref2_dm_view hdf5:sphere_volume.h5 \ 88*5552b385SBrandon -inf2_dm_view hdf5:sphere_volume_inflate2.h5 89*5552b385SBrandon 90*5552b385SBrandon test: 91*5552b385SBrandon suffix: sphere_egadslite 92*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egadslite 93*5552b385SBrandon 94*5552b385SBrandon test: 95*5552b385SBrandon suffix: sphere_egadslite_tess 96*5552b385SBrandon TODO: broken 97*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egadslite \ 98*5552b385SBrandon -dm_plex_geom_tess_model 1 99*5552b385SBrandon 100*5552b385SBrandon test: 101*5552b385SBrandon suffix: sphere_egads 102*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egads 103*5552b385SBrandon 104*5552b385SBrandon test: 105*5552b385SBrandon suffix: sphere_egads_tess 106*5552b385SBrandon TODO: broken 107*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/sphere_example.egads \ 108*5552b385SBrandon -dm_plex_geom_tess_model 1 109*5552b385SBrandon 110*5552b385SBrandon test: 111*5552b385SBrandon suffix: cylinder_egads 112*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/cylinder_example.egads 113*5552b385SBrandon 114*5552b385SBrandon test: 115*5552b385SBrandon suffix: cylinder_igs 116*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/cylinder_example.igs 117*5552b385SBrandon 118*5552b385SBrandon test: 119*5552b385SBrandon suffix: cylinder_igs_tess 120*5552b385SBrandon TODO: broken 121*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/cylinder_example.igs \ 122*5552b385SBrandon -dm_plex_geom_tess_model 1 -ref1_dm_refine 0 -ref2_dm_refine 0 -bd_dm_plex_view_labels 123*5552b385SBrandon 124*5552b385SBrandon test: 125*5552b385SBrandon suffix: nozzle_stp 126*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.stp 127*5552b385SBrandon 128*5552b385SBrandon test: 129*5552b385SBrandon suffix: nozzle_stp_tess 130*5552b385SBrandon TODO: broken 131*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.stp \ 132*5552b385SBrandon -dm_plex_geom_tess_model 1 -ref1_dm_refine 0 -ref2_dm_refine 0 -bd_dm_plex_view_labels 133*5552b385SBrandon 134*5552b385SBrandon test: 135*5552b385SBrandon suffix: nozzle_igs 136*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.igs 137*5552b385SBrandon 138*5552b385SBrandon test: 139*5552b385SBrandon suffix: nozzle_igs_tess 140*5552b385SBrandon TODO: broken 141*5552b385SBrandon args: -dm_plex_boundary_filename ${DATAFILESPATH}/meshes/cad/nozzle_example.igs \ 142*5552b385SBrandon -dm_plex_geom_tess_model 1 -ref1_dm_refine 0 -ref2_dm_refine 0 -bd_dm_plex_view_labels 143*5552b385SBrandon 144*5552b385SBrandon TEST*/ 145