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 15d71ae5a4SJacob Faibussowitsch static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 16d71ae5a4SJacob Faibussowitsch { 17c4762a1bSJed Brown PetscFunctionBeginUser; 18c4762a1bSJed Brown options->filename[0] = '\0'; 19e6fc9eceSMatthew G. Knepley options->volumeMesh = PETSC_TRUE; 20c4762a1bSJed Brown 21d0609cedSBarry 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)); 24d0609cedSBarry Smith PetscOptionsEnd(); 253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 26c4762a1bSJed Brown } 27c4762a1bSJed Brown 28d71ae5a4SJacob Faibussowitsch static PetscErrorCode ComputeVolume(DM dm) 29d71ae5a4SJacob Faibussowitsch { 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)); 383ba16761SJacob Faibussowitsch if (dim < 2) PetscFunctionReturn(PETSC_SUCCESS); 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)); 623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 63e6fc9eceSMatthew G. Knepley } 64e6fc9eceSMatthew G. Knepley 65d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[]) 66d71ae5a4SJacob Faibussowitsch { 67e6fc9eceSMatthew G. Knepley DM surface, dm; 686f4f5c14SMatthew G. Knepley AppCtx ctx; 696f4f5c14SMatthew G. Knepley 70327415f7SBarry Smith PetscFunctionBeginUser; 719566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 729566063dSJacob Faibussowitsch PetscCall(ProcessOptions(PETSC_COMM_WORLD, &ctx)); 739566063dSJacob Faibussowitsch PetscCall(DMPlexCreateFromFile(PETSC_COMM_WORLD, ctx.filename, "ex37_plex", PETSC_TRUE, &surface)); 749566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)surface, "CAD Surface")); 759566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)surface, "sur_")); 769566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(surface)); 779566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(surface, NULL, "-dm_view")); 789566063dSJacob Faibussowitsch PetscCall(ComputeVolume(surface)); 796f4f5c14SMatthew G. Knepley 80e6fc9eceSMatthew G. Knepley if (ctx.volumeMesh) { 819566063dSJacob Faibussowitsch PetscCall(DMPlexGenerate(surface, "tetgen", PETSC_TRUE, &dm)); 829566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dm, "CAD Mesh")); 839566063dSJacob Faibussowitsch PetscCall(DMPlexSetRefinementUniform(dm, PETSC_TRUE)); 849566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(dm, NULL, "-pre_dm_view")); 85e6fc9eceSMatthew G. Knepley 869566063dSJacob Faibussowitsch PetscCall(DMPlexInflateToGeomModel(dm)); 879566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(dm, NULL, "-inf_dm_view")); 88c4762a1bSJed Brown 899566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(dm)); 909566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 919566063dSJacob Faibussowitsch PetscCall(ComputeVolume(dm)); 92e6fc9eceSMatthew G. Knepley } 93e6fc9eceSMatthew G. Knepley 949566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm)); 959566063dSJacob Faibussowitsch PetscCall(DMDestroy(&surface)); 969566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 97b122ec5aSJacob Faibussowitsch return 0; 98c4762a1bSJed Brown } 99c4762a1bSJed Brown 100c4762a1bSJed Brown /*TEST 101c4762a1bSJed Brown 102c4762a1bSJed Brown build: 103e6fc9eceSMatthew G. Knepley requires: egads tetgen 104c4762a1bSJed Brown 105c4762a1bSJed Brown test: 106c4762a1bSJed Brown suffix: sphere_0 107e6fc9eceSMatthew 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" 108e6fc9eceSMatthew G. Knepley 109e6fc9eceSMatthew G. Knepley test: 110e6fc9eceSMatthew G. Knepley suffix: sphere_egads 111e6fc9eceSMatthew 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" 112e6fc9eceSMatthew G. Knepley 113e6fc9eceSMatthew G. Knepley test: 114e6fc9eceSMatthew G. Knepley suffix: sphere_iges 115*0338c944SBarry Smith TODO: broken 116e6fc9eceSMatthew 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" 117e6fc9eceSMatthew G. Knepley 118e6fc9eceSMatthew G. Knepley test: 119e6fc9eceSMatthew G. Knepley suffix: sphere_step 120e6fc9eceSMatthew 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" 1216f4f5c14SMatthew G. Knepley 1226f4f5c14SMatthew G. Knepley test: 1236f4f5c14SMatthew G. Knepley suffix: nozzle_0 124e6fc9eceSMatthew G. Knepley args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egadslite -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all 125e6fc9eceSMatthew G. Knepley 126e6fc9eceSMatthew G. Knepley test: 127e6fc9eceSMatthew G. Knepley suffix: nozzle_egads 128e6fc9eceSMatthew G. Knepley args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.egads -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all 129e6fc9eceSMatthew G. Knepley 130e6fc9eceSMatthew G. Knepley test: 131e6fc9eceSMatthew G. Knepley suffix: nozzle_iges 132e6fc9eceSMatthew G. Knepley args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.igs -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all 133e6fc9eceSMatthew G. Knepley 134e6fc9eceSMatthew G. Knepley test: 135e6fc9eceSMatthew G. Knepley suffix: nozzle_step 136e6fc9eceSMatthew G. Knepley args: -filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/nozzle.stp -sur_dm_refine 1 -sur_dm_view -dm_plex_check_all 137c4762a1bSJed Brown 138c4762a1bSJed Brown TEST*/ 139