1 static char help[] = "Test DMStag IS computation\n\n";
2
3 #include <petscdm.h>
4 #include <petscdmstag.h>
5
main(int argc,char ** argv)6 int main(int argc, char **argv)
7 {
8 DM dm;
9 PetscInt dim, dof0, dof1, dof2, dof3;
10 PetscBool flg;
11
12 /* Create a DMStag object */
13 PetscFunctionBeginUser;
14 PetscCall(PetscInitialize(&argc, &argv, NULL, help));
15 PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &dim, &flg));
16 if (!flg) {
17 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Supply -dim option\n"));
18 return 1;
19 }
20 if (dim == 1) {
21 PetscCall(DMStagCreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 8, 1, 1, DMSTAG_STENCIL_BOX, 1, NULL, &dm));
22 } else if (dim == 2) {
23 PetscCall(DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 4, 6, PETSC_DECIDE, PETSC_DECIDE, 0, 1, 1, DMSTAG_STENCIL_BOX, 1, NULL, NULL, &dm));
24 } else if (dim == 3) {
25 PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 2, 3, 3, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 1, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, NULL, NULL, NULL, &dm));
26 } else {
27 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Supply -dim option with value 1, 2, or 3\n"));
28 return 1;
29 }
30 PetscCall(DMSetFromOptions(dm));
31 PetscCall(DMSetUp(dm));
32 PetscCall(DMView(dm, PETSC_VIEWER_STDOUT_WORLD));
33 PetscCall(DMStagGetDOF(dm, &dof0, &dof1, &dof2, &dof3));
34
35 {
36 IS is;
37 DMStagStencil s;
38 s.c = 0;
39 s.loc = DMSTAG_ELEMENT;
40 PetscCall(DMStagCreateISFromStencils(dm, 1, &s, &is));
41 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Test 1\n"));
42 PetscCall(ISView(is, PETSC_VIEWER_STDOUT_WORLD));
43 PetscCall(ISDestroy(&is));
44 }
45 {
46 IS is;
47 DMStagStencil s;
48 s.c = 0;
49 s.loc = DMSTAG_RIGHT;
50 PetscCall(DMStagCreateISFromStencils(dm, 1, &s, &is));
51 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Test 2\n"));
52 PetscCall(ISView(is, PETSC_VIEWER_STDOUT_WORLD));
53 PetscCall(ISDestroy(&is));
54 }
55 if (dim > 1) {
56 IS is;
57 DMStagStencil s[2];
58 s[0].c = 0;
59 s[0].loc = DMSTAG_DOWN;
60 s[1].c = 0;
61 s[1].loc = DMSTAG_LEFT;
62 PetscCall(DMStagCreateISFromStencils(dm, 2, s, &is));
63 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Test 3\n"));
64 PetscCall(ISView(is, PETSC_VIEWER_STDOUT_WORLD));
65 PetscCall(ISDestroy(&is));
66 }
67 if (dim == 2 && dof1 > 1) {
68 IS is;
69 DMStagStencil s[5];
70 s[0].c = 0;
71 s[0].loc = DMSTAG_DOWN;
72 s[1].c = 0;
73 s[1].loc = DMSTAG_DOWN; /* redundant, should be ignored */
74 s[2].c = 0;
75 s[2].loc = DMSTAG_LEFT;
76 s[3].c = 0;
77 s[3].loc = DMSTAG_RIGHT; /* redundant, should be ignored */
78 s[4].c = 1;
79 s[4].loc = DMSTAG_RIGHT;
80 PetscCall(DMStagCreateISFromStencils(dm, 5, s, &is));
81 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Test 4\n"));
82 PetscCall(ISView(is, PETSC_VIEWER_STDOUT_WORLD));
83 PetscCall(ISDestroy(&is));
84 }
85 if (dim == 3 && dof0 > 1) {
86 IS is;
87 DMStagStencil s[3];
88 s[0].c = 0;
89 s[0].loc = DMSTAG_BACK_DOWN_LEFT;
90 s[1].c = 0;
91 s[1].loc = DMSTAG_FRONT_UP_RIGHT; /* redundant, should be ignored */
92 s[2].c = 1;
93 s[2].loc = DMSTAG_FRONT_DOWN_RIGHT;
94 PetscCall(DMStagCreateISFromStencils(dm, 3, s, &is));
95 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Test 5\n"));
96 PetscCall(ISView(is, PETSC_VIEWER_STDOUT_WORLD));
97 PetscCall(ISDestroy(&is));
98 }
99 if (dim == 3) {
100 IS is;
101 DMStagStencil s[4];
102
103 s[0].c = 0;
104 s[0].loc = DMSTAG_ELEMENT;
105 s[1].c = 0;
106 s[1].loc = DMSTAG_BACK_LEFT;
107 s[2].c = 0;
108 s[2].loc = DMSTAG_BACK_DOWN_LEFT;
109 s[3].c = 0;
110 s[3].loc = DMSTAG_DOWN;
111 PetscCall(DMStagCreateISFromStencils(dm, 4, s, &is));
112 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Test 6\n"));
113 PetscCall(ISView(is, PETSC_VIEWER_STDOUT_WORLD));
114 PetscCall(ISDestroy(&is));
115 }
116
117 PetscCall(DMDestroy(&dm));
118 PetscCall(PetscFinalize());
119 return 0;
120 }
121
122 /*TEST
123
124 test:
125 suffix: 1
126 nsize: 1
127 args: -dim 2
128
129 test:
130 suffix: 2
131 nsize: 1
132 args: -dim 2
133
134 test:
135 suffix: 3
136 nsize: 2
137 args: -dim 2 -stag_dof_1 2
138
139 test:
140 suffix: 4
141 nsize: 1
142 args: -dim 3 -stag_dof_0 3
143
144 test:
145 suffix: 5
146 nsize: 2
147 args: -dim 3 -stag_dof_0 2
148
149 test:
150 suffix: 6
151 nsize: 1
152 args: -dim 1
153
154 test:
155 suffix: 7
156 nsize: 2
157 args: -dim 1
158
159 TEST*/
160