xref: /petsc/src/dm/impls/plex/tests/ex44.c (revision bb21c8c56107d6a8a2c4826cbecbb59f932ee453)
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