xref: /petsc/src/dm/impls/plex/tests/ex44.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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) */
149371c9d4SSatish Balay PetscErrorCode pyramidNormal(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt r, PetscScalar u[], void *ctx) {
15503c0ea9SMatthew G. Knepley   PetscReal apex[3] = {0.5, 0.5, -1.0};
16503c0ea9SMatthew G. Knepley   PetscInt  d;
17503c0ea9SMatthew G. Knepley 
18503c0ea9SMatthew G. Knepley   for (d = 0; d < dim; ++d) u[d] = x[d] - apex[d];
19503c0ea9SMatthew G. Knepley   for (d = dim; d < 3; ++d) u[d] = 0.0 - apex[d];
20503c0ea9SMatthew G. Knepley   return 0;
21503c0ea9SMatthew G. Knepley }
22503c0ea9SMatthew G. Knepley 
239371c9d4SSatish Balay static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) {
24503c0ea9SMatthew G. Knepley   PetscInt  n = 64;
25503c0ea9SMatthew G. Knepley   PetscBool flg;
26503c0ea9SMatthew G. Knepley 
27503c0ea9SMatthew G. Knepley   PetscFunctionBeginUser;
28503c0ea9SMatthew G. Knepley   PetscCall(PetscStrcpy(options->bdLabel, "marker"));
29d0609cedSBarry Smith   PetscOptionsBegin(comm, "", "Parallel Mesh Adaptation Options", "DMPLEX");
30503c0ea9SMatthew G. Knepley   PetscCall(PetscOptionsString("-label", "The boundary label name", "ex44.c", options->bdLabel, options->bdLabel, sizeof(options->bdLabel), NULL));
31503c0ea9SMatthew G. Knepley   PetscCall(PetscOptionsIntArray("-bd", "The boundaries to be extruded", "ex44.c", options->bd, &n, &flg));
32503c0ea9SMatthew G. Knepley   options->Nbd = flg ? n : 0;
33d0609cedSBarry Smith   PetscOptionsEnd();
34503c0ea9SMatthew G. Knepley   PetscFunctionReturn(0);
35503c0ea9SMatthew G. Knepley }
36503c0ea9SMatthew G. Knepley 
379371c9d4SSatish Balay static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *ctx, DM *dm) {
38503c0ea9SMatthew G. Knepley   PetscFunctionBegin;
39503c0ea9SMatthew G. Knepley   PetscCall(DMCreate(comm, dm));
40503c0ea9SMatthew G. Knepley   PetscCall(DMSetType(*dm, DMPLEX));
41503c0ea9SMatthew G. Knepley   PetscCall(DMSetFromOptions(*dm));
42503c0ea9SMatthew G. Knepley   PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
43503c0ea9SMatthew G. Knepley   PetscFunctionReturn(0);
44503c0ea9SMatthew G. Knepley }
45503c0ea9SMatthew G. Knepley 
469371c9d4SSatish Balay static PetscErrorCode CreateAdaptLabel(DM dm, AppCtx *ctx, DMLabel *adaptLabel) {
47503c0ea9SMatthew G. Knepley   DMLabel  label;
48503c0ea9SMatthew G. Knepley   PetscInt b;
49503c0ea9SMatthew G. Knepley 
50503c0ea9SMatthew G. Knepley   PetscFunctionBegin;
519371c9d4SSatish Balay   if (!ctx->Nbd) {
529371c9d4SSatish Balay     *adaptLabel = NULL;
539371c9d4SSatish Balay     PetscFunctionReturn(0);
549371c9d4SSatish Balay   }
55503c0ea9SMatthew G. Knepley   PetscCall(DMGetLabel(dm, ctx->bdLabel, &label));
56503c0ea9SMatthew G. Knepley   PetscCall(DMLabelCreate(PETSC_COMM_SELF, "Adaptation Label", adaptLabel));
57503c0ea9SMatthew G. Knepley   for (b = 0; b < ctx->Nbd; ++b) {
58503c0ea9SMatthew G. Knepley     IS              bdIS;
59503c0ea9SMatthew G. Knepley     const PetscInt *points;
60503c0ea9SMatthew G. Knepley     PetscInt        n, i;
61503c0ea9SMatthew G. Knepley 
62503c0ea9SMatthew G. Knepley     PetscCall(DMLabelGetStratumIS(label, ctx->bd[b], &bdIS));
63503c0ea9SMatthew G. Knepley     if (!bdIS) continue;
64503c0ea9SMatthew G. Knepley     PetscCall(ISGetLocalSize(bdIS, &n));
65503c0ea9SMatthew G. Knepley     PetscCall(ISGetIndices(bdIS, &points));
66*48a46eb9SPierre Jolivet     for (i = 0; i < n; ++i) PetscCall(DMLabelSetValue(*adaptLabel, points[i], DM_ADAPT_REFINE));
67503c0ea9SMatthew G. Knepley     PetscCall(ISRestoreIndices(bdIS, &points));
68503c0ea9SMatthew G. Knepley     PetscCall(ISDestroy(&bdIS));
69503c0ea9SMatthew G. Knepley   }
70503c0ea9SMatthew G. Knepley   PetscFunctionReturn(0);
71503c0ea9SMatthew G. Knepley }
72503c0ea9SMatthew G. Knepley 
739371c9d4SSatish Balay int main(int argc, char **argv) {
74503c0ea9SMatthew G. Knepley   DM      dm, dma;
75503c0ea9SMatthew G. Knepley   DMLabel adaptLabel;
76503c0ea9SMatthew G. Knepley   AppCtx  ctx;
77503c0ea9SMatthew G. Knepley 
78327415f7SBarry Smith   PetscFunctionBeginUser;
79503c0ea9SMatthew G. Knepley   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
80503c0ea9SMatthew G. Knepley   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &ctx));
81503c0ea9SMatthew G. Knepley   PetscCall(CreateMesh(PETSC_COMM_WORLD, &ctx, &dm));
82503c0ea9SMatthew G. Knepley   PetscCall(CreateAdaptLabel(dm, &ctx, &adaptLabel));
839371c9d4SSatish Balay   if (adaptLabel) {
849371c9d4SSatish Balay     PetscCall(DMAdaptLabel(dm, adaptLabel, &dma));
859371c9d4SSatish Balay   } else {
869371c9d4SSatish Balay     PetscCall(DMExtrude(dm, 3, &dma));
879371c9d4SSatish Balay   }
88503c0ea9SMatthew G. Knepley   PetscCall(PetscObjectSetName((PetscObject)dma, "Adapted Mesh"));
89503c0ea9SMatthew G. Knepley   PetscCall(DMLabelDestroy(&adaptLabel));
90503c0ea9SMatthew G. Knepley   PetscCall(DMDestroy(&dm));
91503c0ea9SMatthew G. Knepley   PetscCall(DMViewFromOptions(dma, NULL, "-adapt_dm_view"));
92503c0ea9SMatthew G. Knepley   PetscCall(DMDestroy(&dma));
93503c0ea9SMatthew G. Knepley   PetscCall(PetscFinalize());
94503c0ea9SMatthew G. Knepley   return 0;
95503c0ea9SMatthew G. Knepley }
96503c0ea9SMatthew G. Knepley 
97503c0ea9SMatthew G. Knepley /*TEST
98503c0ea9SMatthew G. Knepley 
99503c0ea9SMatthew G. Knepley   test:
100503c0ea9SMatthew G. Knepley     suffix: tri_tensor_0
101503c0ea9SMatthew G. Knepley     requires: triangle
102503c0ea9SMatthew G. Knepley     args: -dm_plex_transform_extrude_use_tensor {{0 1}separate output} \
103503c0ea9SMatthew G. Knepley           -dm_view -adapt_dm_view -dm_plex_check_all
104503c0ea9SMatthew G. Knepley 
105503c0ea9SMatthew G. Knepley   test:
106503c0ea9SMatthew G. Knepley     suffix: quad_tensor_0
107503c0ea9SMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_transform_extrude_use_tensor {{0 1}separate output} \
108503c0ea9SMatthew G. Knepley           -dm_view -adapt_dm_view -dm_plex_check_all
109503c0ea9SMatthew G. Knepley 
110503c0ea9SMatthew G. Knepley   test:
111503c0ea9SMatthew G. Knepley     suffix: quad_normal_0
112503c0ea9SMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_transform_extrude_normal 0,1,1 \
113503c0ea9SMatthew G. Knepley           -dm_view -adapt_dm_view -dm_plex_check_all
114503c0ea9SMatthew G. Knepley 
115503c0ea9SMatthew G. Knepley   test:
116503c0ea9SMatthew G. Knepley     suffix: quad_normal_1
117503c0ea9SMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_transform_extrude_normal_function pyramidNormal \
118503c0ea9SMatthew G. Knepley           -dm_view -adapt_dm_view -dm_plex_check_all
119503c0ea9SMatthew G. Knepley 
120503c0ea9SMatthew G. Knepley   test:
121503c0ea9SMatthew G. Knepley     suffix: quad_symmetric_0
122503c0ea9SMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_transform_extrude_symmetric \
123503c0ea9SMatthew G. Knepley           -dm_view -adapt_dm_view -dm_plex_check_all
124503c0ea9SMatthew G. Knepley 
125503c0ea9SMatthew G. Knepley   testset:
126503c0ea9SMatthew G. Knepley     args: -dm_adaptor cellrefiner -dm_plex_transform_type extrude \
127503c0ea9SMatthew G. Knepley           -dm_view -adapt_dm_view
128503c0ea9SMatthew G. Knepley 
129503c0ea9SMatthew G. Knepley     test:
130503c0ea9SMatthew G. Knepley       suffix: quad_adapt_0
131230bd717SMatthew G. Knepley       args: -dm_plex_simplex 0 -dm_plex_box_faces 2,2 -dm_plex_separate_marker -bd 1,3 \
132230bd717SMatthew G. Knepley             -dm_plex_transform_extrude_thickness 0.5
133503c0ea9SMatthew G. Knepley 
13479a429efSMatthew G. Knepley     test:
13579a429efSMatthew G. Knepley       suffix: tet_adapt_0
13679a4bf6cSMatthew G. Knepley       requires: ctetgen
13779a429efSMatthew G. Knepley       args: -dm_plex_dim 3 -dm_plex_box_faces 2,2,2 -dm_plex_separate_marker -bd 1,3 \
13879a429efSMatthew G. Knepley             -dm_plex_transform_extrude_thickness 0.5
13979a429efSMatthew G. Knepley 
14079a429efSMatthew G. Knepley     test:
14179a429efSMatthew G. Knepley       suffix: hex_adapt_0
14279a429efSMatthew 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 \
14379a429efSMatthew G. Knepley             -dm_plex_transform_extrude_thickness 0.5
14479a429efSMatthew G. Knepley 
145503c0ea9SMatthew G. Knepley TEST*/
146