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