1503c0ea9SMatthew G. Knepley static const char help[] = "Tests for mesh extrusion"; 2503c0ea9SMatthew G. Knepley 3503c0ea9SMatthew G. Knepley #include <petscdmplex.h> 4503c0ea9SMatthew G. Knepley 5503c0ea9SMatthew G. Knepley typedef struct { 6503c0ea9SMatthew G. Knepley char bdLabel[PETSC_MAX_PATH_LEN]; /* The boundary label name */ 7503c0ea9SMatthew G. Knepley PetscInt Nbd; /* The number of boundary markers to extrude, 0 for all */ 8503c0ea9SMatthew G. Knepley PetscInt bd[64]; /* The boundary markers to be extruded */ 9503c0ea9SMatthew G. Knepley } AppCtx; 10503c0ea9SMatthew G. Knepley 11503c0ea9SMatthew G. Knepley PETSC_EXTERN PetscErrorCode pyramidNormal(PetscInt, PetscReal, const PetscReal[], PetscInt, PetscScalar[], void *); 12503c0ea9SMatthew G. Knepley 13503c0ea9SMatthew G. Knepley /* The pyramid apex is at (0.5, 0.5, -1) */ 14d71ae5a4SJacob Faibussowitsch PetscErrorCode pyramidNormal(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt r, PetscScalar u[], void *ctx) 15d71ae5a4SJacob Faibussowitsch { 16503c0ea9SMatthew G. Knepley PetscReal apex[3] = {0.5, 0.5, -1.0}; 17503c0ea9SMatthew G. Knepley PetscInt d; 18503c0ea9SMatthew G. Knepley 19503c0ea9SMatthew G. Knepley for (d = 0; d < dim; ++d) u[d] = x[d] - apex[d]; 20503c0ea9SMatthew G. Knepley for (d = dim; d < 3; ++d) u[d] = 0.0 - apex[d]; 213ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 22503c0ea9SMatthew G. Knepley } 23503c0ea9SMatthew G. Knepley 24d71ae5a4SJacob Faibussowitsch static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 25d71ae5a4SJacob Faibussowitsch { 26503c0ea9SMatthew G. Knepley PetscInt n = 64; 27503c0ea9SMatthew G. Knepley PetscBool flg; 28503c0ea9SMatthew G. Knepley 29503c0ea9SMatthew G. Knepley PetscFunctionBeginUser; 30c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->bdLabel, "marker", sizeof(options->bdLabel))); 31d0609cedSBarry Smith PetscOptionsBegin(comm, "", "Parallel Mesh Adaptation Options", "DMPLEX"); 32503c0ea9SMatthew G. Knepley PetscCall(PetscOptionsString("-label", "The boundary label name", "ex44.c", options->bdLabel, options->bdLabel, sizeof(options->bdLabel), NULL)); 33503c0ea9SMatthew G. Knepley PetscCall(PetscOptionsIntArray("-bd", "The boundaries to be extruded", "ex44.c", options->bd, &n, &flg)); 34503c0ea9SMatthew G. Knepley options->Nbd = flg ? n : 0; 35d0609cedSBarry Smith PetscOptionsEnd(); 363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 37503c0ea9SMatthew G. Knepley } 38503c0ea9SMatthew G. Knepley 39d71ae5a4SJacob Faibussowitsch static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *ctx, DM *dm) 40d71ae5a4SJacob Faibussowitsch { 41503c0ea9SMatthew G. Knepley PetscFunctionBegin; 42503c0ea9SMatthew G. Knepley PetscCall(DMCreate(comm, dm)); 43503c0ea9SMatthew G. Knepley PetscCall(DMSetType(*dm, DMPLEX)); 44503c0ea9SMatthew G. Knepley PetscCall(DMSetFromOptions(*dm)); 45503c0ea9SMatthew G. Knepley PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view")); 463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 47503c0ea9SMatthew G. Knepley } 48503c0ea9SMatthew G. Knepley 49d71ae5a4SJacob Faibussowitsch static PetscErrorCode CreateAdaptLabel(DM dm, AppCtx *ctx, DMLabel *adaptLabel) 50d71ae5a4SJacob Faibussowitsch { 51503c0ea9SMatthew G. Knepley DMLabel label; 52503c0ea9SMatthew G. Knepley PetscInt b; 53503c0ea9SMatthew G. Knepley 54503c0ea9SMatthew G. Knepley PetscFunctionBegin; 559371c9d4SSatish Balay if (!ctx->Nbd) { 569371c9d4SSatish Balay *adaptLabel = NULL; 573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 589371c9d4SSatish Balay } 59503c0ea9SMatthew G. Knepley PetscCall(DMGetLabel(dm, ctx->bdLabel, &label)); 60503c0ea9SMatthew G. Knepley PetscCall(DMLabelCreate(PETSC_COMM_SELF, "Adaptation Label", adaptLabel)); 61503c0ea9SMatthew G. Knepley for (b = 0; b < ctx->Nbd; ++b) { 62503c0ea9SMatthew G. Knepley IS bdIS; 63503c0ea9SMatthew G. Knepley const PetscInt *points; 64503c0ea9SMatthew G. Knepley PetscInt n, i; 65503c0ea9SMatthew G. Knepley 66503c0ea9SMatthew G. Knepley PetscCall(DMLabelGetStratumIS(label, ctx->bd[b], &bdIS)); 67503c0ea9SMatthew G. Knepley if (!bdIS) continue; 68503c0ea9SMatthew G. Knepley PetscCall(ISGetLocalSize(bdIS, &n)); 69503c0ea9SMatthew G. Knepley PetscCall(ISGetIndices(bdIS, &points)); 7048a46eb9SPierre Jolivet for (i = 0; i < n; ++i) PetscCall(DMLabelSetValue(*adaptLabel, points[i], DM_ADAPT_REFINE)); 71503c0ea9SMatthew G. Knepley PetscCall(ISRestoreIndices(bdIS, &points)); 72503c0ea9SMatthew G. Knepley PetscCall(ISDestroy(&bdIS)); 73503c0ea9SMatthew G. Knepley } 743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 75503c0ea9SMatthew G. Knepley } 76503c0ea9SMatthew G. Knepley 77d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 78d71ae5a4SJacob Faibussowitsch { 79503c0ea9SMatthew G. Knepley DM dm, dma; 80503c0ea9SMatthew G. Knepley DMLabel adaptLabel; 81503c0ea9SMatthew G. Knepley AppCtx ctx; 82503c0ea9SMatthew G. Knepley 83327415f7SBarry Smith PetscFunctionBeginUser; 84503c0ea9SMatthew G. Knepley PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 85503c0ea9SMatthew G. Knepley PetscCall(ProcessOptions(PETSC_COMM_WORLD, &ctx)); 86503c0ea9SMatthew G. Knepley PetscCall(CreateMesh(PETSC_COMM_WORLD, &ctx, &dm)); 87503c0ea9SMatthew G. Knepley PetscCall(CreateAdaptLabel(dm, &ctx, &adaptLabel)); 889371c9d4SSatish Balay if (adaptLabel) { 899371c9d4SSatish Balay PetscCall(DMAdaptLabel(dm, adaptLabel, &dma)); 909371c9d4SSatish Balay } else { 919371c9d4SSatish Balay PetscCall(DMExtrude(dm, 3, &dma)); 929371c9d4SSatish Balay } 93503c0ea9SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dma, "Adapted Mesh")); 94503c0ea9SMatthew G. Knepley PetscCall(DMLabelDestroy(&adaptLabel)); 95503c0ea9SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 96503c0ea9SMatthew G. Knepley PetscCall(DMViewFromOptions(dma, NULL, "-adapt_dm_view")); 97503c0ea9SMatthew G. Knepley PetscCall(DMDestroy(&dma)); 98503c0ea9SMatthew G. Knepley PetscCall(PetscFinalize()); 99503c0ea9SMatthew G. Knepley return 0; 100503c0ea9SMatthew G. Knepley } 101503c0ea9SMatthew G. Knepley 102503c0ea9SMatthew G. Knepley /*TEST 103503c0ea9SMatthew G. Knepley 104503c0ea9SMatthew G. Knepley test: 105c403ad25SMatthew G. Knepley suffix: seg_periodic_0 106c403ad25SMatthew G. Knepley args: -dm_plex_dim 1 -dm_plex_box_faces 3 -dm_plex_transform_extrude_periodic -dm_plex_transform_extrude_use_tensor 0 \ 107c403ad25SMatthew G. Knepley -dm_view -adapt_dm_view -dm_plex_check_all 108c403ad25SMatthew G. Knepley 109c403ad25SMatthew G. Knepley test: 110503c0ea9SMatthew G. Knepley suffix: tri_tensor_0 111503c0ea9SMatthew G. Knepley requires: triangle 112503c0ea9SMatthew G. Knepley args: -dm_plex_transform_extrude_use_tensor {{0 1}separate output} \ 113503c0ea9SMatthew G. Knepley -dm_view -adapt_dm_view -dm_plex_check_all 114503c0ea9SMatthew G. Knepley 115503c0ea9SMatthew G. Knepley test: 116503c0ea9SMatthew G. Knepley suffix: quad_tensor_0 117503c0ea9SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_transform_extrude_use_tensor {{0 1}separate output} \ 118503c0ea9SMatthew G. Knepley -dm_view -adapt_dm_view -dm_plex_check_all 119503c0ea9SMatthew G. Knepley 120503c0ea9SMatthew G. Knepley test: 121503c0ea9SMatthew G. Knepley suffix: quad_normal_0 122503c0ea9SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_transform_extrude_normal 0,1,1 \ 123503c0ea9SMatthew G. Knepley -dm_view -adapt_dm_view -dm_plex_check_all 124503c0ea9SMatthew G. Knepley 125503c0ea9SMatthew G. Knepley test: 126503c0ea9SMatthew G. Knepley suffix: quad_normal_1 127503c0ea9SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_transform_extrude_normal_function pyramidNormal \ 128503c0ea9SMatthew G. Knepley -dm_view -adapt_dm_view -dm_plex_check_all 129503c0ea9SMatthew G. Knepley 130503c0ea9SMatthew G. Knepley test: 131503c0ea9SMatthew G. Knepley suffix: quad_symmetric_0 132503c0ea9SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_transform_extrude_symmetric \ 133503c0ea9SMatthew G. Knepley -dm_view -adapt_dm_view -dm_plex_check_all 134503c0ea9SMatthew G. Knepley 135533617b7SMatthew G. Knepley test: 136533617b7SMatthew G. Knepley suffix: quad_label 137533617b7SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_transform_label_replica_inc {{0 100}separate output} \ 138533617b7SMatthew G. Knepley -dm_view -adapt_dm_view -dm_plex_check_all 139533617b7SMatthew G. Knepley 140c403ad25SMatthew G. Knepley test: 141c403ad25SMatthew G. Knepley suffix: quad_periodic_0 142c403ad25SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_transform_extrude_periodic -dm_plex_transform_extrude_use_tensor 0 \ 143c403ad25SMatthew G. Knepley -dm_view -adapt_dm_view -dm_plex_check_all 144c403ad25SMatthew G. Knepley 145503c0ea9SMatthew G. Knepley testset: 146503c0ea9SMatthew G. Knepley args: -dm_adaptor cellrefiner -dm_plex_transform_type extrude \ 147503c0ea9SMatthew G. Knepley -dm_view -adapt_dm_view 148503c0ea9SMatthew G. Knepley 149503c0ea9SMatthew G. Knepley test: 150503c0ea9SMatthew G. Knepley suffix: quad_adapt_0 151230bd717SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 2,2 -dm_plex_separate_marker -bd 1,3 \ 152230bd717SMatthew G. Knepley -dm_plex_transform_extrude_thickness 0.5 153503c0ea9SMatthew G. Knepley 15479a429efSMatthew G. Knepley test: 155*bb21c8c5SMatthew G. Knepley suffix: quad_adapt_1 156*bb21c8c5SMatthew G. Knepley nsize: 2 157*bb21c8c5SMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 2,2 -bd 1 \ 158*bb21c8c5SMatthew G. Knepley -dm_plex_transform_extrude_thickness 0.5 -petscpartitioner_type simple 159*bb21c8c5SMatthew G. Knepley 160*bb21c8c5SMatthew G. Knepley test: 16179a429efSMatthew G. Knepley suffix: tet_adapt_0 16279a4bf6cSMatthew G. Knepley requires: ctetgen 16379a429efSMatthew G. Knepley args: -dm_plex_dim 3 -dm_plex_box_faces 2,2,2 -dm_plex_separate_marker -bd 1,3 \ 16479a429efSMatthew G. Knepley -dm_plex_transform_extrude_thickness 0.5 16579a429efSMatthew G. Knepley 16679a429efSMatthew G. Knepley test: 16779a429efSMatthew G. Knepley suffix: hex_adapt_0 16879a429efSMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_dim 3 -dm_plex_box_faces 2,2,2 -dm_plex_separate_marker -bd 1,3 \ 16979a429efSMatthew G. Knepley -dm_plex_transform_extrude_thickness 0.5 17079a429efSMatthew G. Knepley 171503c0ea9SMatthew G. Knepley TEST*/ 172