1e7c9d70eSJeremy Theler static const char help[] = "Test for non-manifold interpolation";
2e7c9d70eSJeremy Theler
3e7c9d70eSJeremy Theler #include <petscdmplex.h>
4e7c9d70eSJeremy Theler
5e7c9d70eSJeremy Theler /*
6*b629e4b4SMatthew G. Knepley Test 0:
7*b629e4b4SMatthew G. Knepley
8e7c9d70eSJeremy Theler 3-------------7
9e7c9d70eSJeremy Theler /| /|
10e7c9d70eSJeremy Theler / | / |
11e7c9d70eSJeremy Theler / | / |
12e7c9d70eSJeremy Theler 1-------------5 |
13e7c9d70eSJeremy Theler | | | |
14e7c9d70eSJeremy Theler | | | |
15e7c9d70eSJeremy Theler | | | |
16e7c9d70eSJeremy Theler | | | |
17e7c9d70eSJeremy Theler z 4---------|---8
18e7c9d70eSJeremy Theler ^ / | /
19e7c9d70eSJeremy Theler | y | /
20e7c9d70eSJeremy Theler |/ |/
21e7c9d70eSJeremy Theler 2--->-x-------6-------------9
22*b629e4b4SMatthew G. Knepley
23*b629e4b4SMatthew G. Knepley Test 1:
24*b629e4b4SMatthew G. Knepley
25*b629e4b4SMatthew G. Knepley 3-------------7
26*b629e4b4SMatthew G. Knepley /| /|
27*b629e4b4SMatthew G. Knepley / | / |
28*b629e4b4SMatthew G. Knepley / | / |
29*b629e4b4SMatthew G. Knepley 1-------------5 |
30*b629e4b4SMatthew G. Knepley | | | |
31*b629e4b4SMatthew G. Knepley | | | |
32*b629e4b4SMatthew G. Knepley | | | |
33*b629e4b4SMatthew G. Knepley | | | |
34*b629e4b4SMatthew G. Knepley z 4---------|---8
35*b629e4b4SMatthew G. Knepley ^ / | / \
36*b629e4b4SMatthew G. Knepley | y | / \
37*b629e4b4SMatthew G. Knepley |/ |/ \
38*b629e4b4SMatthew G. Knepley 2--->-x-------6-------9
39e7c9d70eSJeremy Theler */
main(int argc,char ** argv)40e7c9d70eSJeremy Theler int main(int argc, char **argv)
41e7c9d70eSJeremy Theler {
42e7c9d70eSJeremy Theler DM dm, idm;
43e7c9d70eSJeremy Theler DMLabel ctLabel;
44*b629e4b4SMatthew G. Knepley PetscInt testNum = 0;
45e7c9d70eSJeremy Theler
46*b629e4b4SMatthew G. Knepley PetscFunctionBeginUser;
47*b629e4b4SMatthew G. Knepley PetscCall(PetscInitialize(&argc, &argv, NULL, help));
48*b629e4b4SMatthew G. Knepley PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "Non-Manifold Options", "ex66");
49*b629e4b4SMatthew G. Knepley PetscCall(PetscOptionsInt("-test_num", "Test number", "", testNum, &testNum, NULL));
50*b629e4b4SMatthew G. Knepley PetscOptionsEnd();
51*b629e4b4SMatthew G. Knepley
52*b629e4b4SMatthew G. Knepley PetscCall(DMCreate(PETSC_COMM_WORLD, &dm));
53*b629e4b4SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, "cubeline-fromdag"));
54*b629e4b4SMatthew G. Knepley PetscCall(DMSetType(dm, DMPLEX));
55*b629e4b4SMatthew G. Knepley PetscCall(DMSetDimension(dm, 3));
56*b629e4b4SMatthew G. Knepley
57*b629e4b4SMatthew G. Knepley switch (testNum) {
58*b629e4b4SMatthew G. Knepley case 0: {
59e7c9d70eSJeremy Theler // 9 vertices
60e7c9d70eSJeremy Theler // 1 edge
61e7c9d70eSJeremy Theler // 0 faces
62e7c9d70eSJeremy Theler // 1 volume
63e7c9d70eSJeremy Theler PetscInt num_points[4] = {9, 1, 0, 1};
64e7c9d70eSJeremy Theler
65e7c9d70eSJeremy Theler // point 0 = hexahedron (defined by 8 vertices)
66e7c9d70eSJeremy Theler // points 1-9 = vertices
67e7c9d70eSJeremy Theler // point 10 = edged (defined by 2 vertices)
68e7c9d70eSJeremy Theler PetscInt cone_size[11] = {8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2};
69e7c9d70eSJeremy Theler
70e7c9d70eSJeremy Theler // hexahedron defined by points
71e7c9d70eSJeremy Theler PetscInt cones[11] = {3, 4, 2, 1, 7, 5, 6, 8, 6, 9};
72e7c9d70eSJeremy Theler PetscInt cone_orientations[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
73e7c9d70eSJeremy Theler PetscScalar vertex_coords[3 * 9] = {0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 2, 0, 0};
74e7c9d70eSJeremy Theler
75*b629e4b4SMatthew G. Knepley PetscCall(DMPlexCreateFromDAG(dm, 3, num_points, cone_size, cones, cone_orientations, vertex_coords));
76*b629e4b4SMatthew G. Knepley } break;
77*b629e4b4SMatthew G. Knepley case 1: {
78*b629e4b4SMatthew G. Knepley // 9 vertices
79*b629e4b4SMatthew G. Knepley // 0 edges
80*b629e4b4SMatthew G. Knepley // 1 face
81*b629e4b4SMatthew G. Knepley // 1 volume
82*b629e4b4SMatthew G. Knepley PetscInt num_points[4] = {9, 0, 1, 1};
83e7c9d70eSJeremy Theler
84*b629e4b4SMatthew G. Knepley // point 0 = hexahedron (defined by 8 vertices)
85*b629e4b4SMatthew G. Knepley // points 1-9 = vertices
86*b629e4b4SMatthew G. Knepley // point 10 = triangle (defined by 3 vertices)
87*b629e4b4SMatthew G. Knepley PetscInt cone_size[11] = {8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3};
88*b629e4b4SMatthew G. Knepley
89*b629e4b4SMatthew G. Knepley // hexahedron defined by 8 points (point 0)
90*b629e4b4SMatthew G. Knepley PetscInt cones[11] = {3, 4, 2, 1, 7, 5, 6, 8, 6, 9, 8};
91*b629e4b4SMatthew G. Knepley PetscInt cone_orientations[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
92*b629e4b4SMatthew G. Knepley PetscScalar vertex_coords[3 * 9] = {0, 0, 1, // point 1
93*b629e4b4SMatthew G. Knepley 0, 0, 0, // point 2
94*b629e4b4SMatthew G. Knepley 0, 1, 1, // point 3
95*b629e4b4SMatthew G. Knepley 0, 1, 0, // point 4
96*b629e4b4SMatthew G. Knepley 1, 0, 1, // point 5
97*b629e4b4SMatthew G. Knepley 1, 0, 0, // point 6
98*b629e4b4SMatthew G. Knepley 1, 1, 1, // point 7
99*b629e4b4SMatthew G. Knepley 1, 1, 0, // point 8
100*b629e4b4SMatthew G. Knepley 2, 0, 0}; // point 9
101e7c9d70eSJeremy Theler
102e7c9d70eSJeremy Theler PetscCall(DMPlexCreateFromDAG(dm, 3, num_points, cone_size, cones, cone_orientations, vertex_coords));
103*b629e4b4SMatthew G. Knepley } break;
104*b629e4b4SMatthew G. Knepley default:
105*b629e4b4SMatthew G. Knepley SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Invalid test number %" PetscInt_FMT, testNum);
106*b629e4b4SMatthew G. Knepley }
107e7c9d70eSJeremy Theler PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
108e7c9d70eSJeremy Theler
109e7c9d70eSJeremy Theler // TODO: make it work with a DM made from a msh file
110e7c9d70eSJeremy Theler // PetscCall(DMPlexCreateGmshFromFile(PETSC_COMM_WORLD, "cube-line.msh", PETSC_FALSE, &dm));
111e7c9d70eSJeremy Theler // PetscCall(PetscObjectSetName((PetscObject)dm, "msh"));
112e7c9d70eSJeremy Theler
113e7c9d70eSJeremy Theler // Must set cell types
114e7c9d70eSJeremy Theler PetscCall(DMPlexGetCellTypeLabel(dm, &ctLabel));
115*b629e4b4SMatthew G. Knepley switch (testNum) {
116*b629e4b4SMatthew G. Knepley case 0:
117e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 0, DM_POLYTOPE_HEXAHEDRON));
118e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 1, DM_POLYTOPE_POINT));
119e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 2, DM_POLYTOPE_POINT));
120e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 3, DM_POLYTOPE_POINT));
121e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 4, DM_POLYTOPE_POINT));
122e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 5, DM_POLYTOPE_POINT));
123e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 6, DM_POLYTOPE_POINT));
124e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 7, DM_POLYTOPE_POINT));
125e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 8, DM_POLYTOPE_POINT));
126e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 9, DM_POLYTOPE_POINT));
127e7c9d70eSJeremy Theler PetscCall(DMLabelSetValue(ctLabel, 10, DM_POLYTOPE_SEGMENT));
128*b629e4b4SMatthew G. Knepley break;
129*b629e4b4SMatthew G. Knepley case 1:
130*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 0, DM_POLYTOPE_HEXAHEDRON));
131*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 1, DM_POLYTOPE_POINT));
132*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 2, DM_POLYTOPE_POINT));
133*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 3, DM_POLYTOPE_POINT));
134*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 4, DM_POLYTOPE_POINT));
135*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 5, DM_POLYTOPE_POINT));
136*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 6, DM_POLYTOPE_POINT));
137*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 7, DM_POLYTOPE_POINT));
138*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 8, DM_POLYTOPE_POINT));
139*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 9, DM_POLYTOPE_POINT));
140*b629e4b4SMatthew G. Knepley PetscCall(DMLabelSetValue(ctLabel, 10, DM_POLYTOPE_TRIANGLE));
141*b629e4b4SMatthew G. Knepley break;
142*b629e4b4SMatthew G. Knepley default:
143*b629e4b4SMatthew G. Knepley SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Invalid test number %" PetscInt_FMT, testNum);
144*b629e4b4SMatthew G. Knepley }
145e7c9d70eSJeremy Theler
146e7c9d70eSJeremy Theler // interpolate (make sure to use -interp_dm_plex_stratify_celltype)
147e7c9d70eSJeremy Theler PetscCall(PetscObjectSetOptionsPrefix((PetscObject)dm, "interp_"));
148e7c9d70eSJeremy Theler PetscCall(DMPlexInterpolate(dm, &idm));
149e7c9d70eSJeremy Theler PetscCall(DMDestroy(&dm));
150e7c9d70eSJeremy Theler dm = idm;
151e7c9d70eSJeremy Theler
152e7c9d70eSJeremy Theler PetscCall(DMSetFromOptions(dm));
153e7c9d70eSJeremy Theler PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
154e7c9d70eSJeremy Theler
155e7c9d70eSJeremy Theler PetscCall(DMDestroy(&dm));
156e7c9d70eSJeremy Theler PetscCall(PetscFinalize());
157e7c9d70eSJeremy Theler return 0;
158e7c9d70eSJeremy Theler }
159e7c9d70eSJeremy Theler
160e7c9d70eSJeremy Theler /*TEST
161*b629e4b4SMatthew G. Knepley
162*b629e4b4SMatthew G. Knepley testset:
163*b629e4b4SMatthew G. Knepley args: -interp_dm_plex_stratify_celltype -dm_view ::ascii_info_detail -interp_dm_view ::ascii_info_detail
164*b629e4b4SMatthew G. Knepley
165e7c9d70eSJeremy Theler test:
166e7c9d70eSJeremy Theler suffix: 0
167*b629e4b4SMatthew G. Knepley test:
168*b629e4b4SMatthew G. Knepley suffix: 1
169*b629e4b4SMatthew G. Knepley args: -test_num 1
170e7c9d70eSJeremy Theler
171e7c9d70eSJeremy Theler TEST*/
172