1 static char help[] = "Demonstrate standard DMStag operations.\n\n";
2
3 #include <petscdm.h>
4 #include <petscdmstag.h>
5
6 static PetscErrorCode TestFields(DM dmstag);
7
main(int argc,char ** argv)8 int main(int argc, char **argv)
9 {
10 DM dmstag;
11 PetscInt dim;
12 PetscBool setSizes;
13
14 /* Initialize PETSc and process command line arguments */
15 PetscFunctionBeginUser;
16 PetscCall(PetscInitialize(&argc, &argv, NULL, help));
17 dim = 2;
18 PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &dim, NULL));
19 setSizes = PETSC_FALSE;
20 PetscCall(PetscOptionsGetBool(NULL, NULL, "-setsizes", &setSizes, NULL));
21
22 /* Creation (normal) */
23 if (!setSizes) {
24 switch (dim) {
25 case 1:
26 PetscCall(DMStagCreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 3, 1, 1, DMSTAG_STENCIL_BOX, 1, NULL, &dmstag));
27 break;
28 case 2:
29 PetscCall(DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 3, 2, PETSC_DECIDE, PETSC_DECIDE, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, NULL, NULL, &dmstag));
30 break;
31 case 3:
32 PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 3, 2, 4, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 1, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, NULL, NULL, NULL, &dmstag));
33 break;
34 default:
35 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "No support for dimension %" PetscInt_FMT, dim);
36 }
37 } else {
38 /* Creation (test providing decomp exactly)*/
39 PetscMPIInt size;
40 PetscInt lx[4] = {1, 2, 3}, ranksx = 3, mx = 6;
41 PetscInt ly[3] = {4, 5}, ranksy = 2, my = 9;
42 PetscInt lz[2] = {6, 7}, ranksz = 2, mz = 13;
43
44 PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
45 switch (dim) {
46 case 1:
47 PetscCheck(size == ranksx, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Must run on %" PetscInt_FMT " ranks with -dim 1 -setSizes", ranksx);
48 PetscCall(DMStagCreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, mx, 1, 1, DMSTAG_STENCIL_BOX, 1, lx, &dmstag));
49 break;
50 case 2:
51 PetscCheck(size == ranksx * ranksy, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Must run on %" PetscInt_FMT " ranks with -dim 2 -setSizes", ranksx * ranksy);
52 PetscCall(DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, mx, my, ranksx, ranksy, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, lx, ly, &dmstag));
53 break;
54 case 3:
55 PetscCheck(size == ranksx * ranksy * ranksz, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Must run on %" PetscInt_FMT " ranks with -dim 3 -setSizes", ranksx * ranksy * ranksz);
56 PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, mx, my, mz, ranksx, ranksy, ranksz, 1, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, lx, ly, lz, &dmstag));
57 break;
58 default:
59 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "No support for dimension %" PetscInt_FMT, dim);
60 }
61 }
62
63 /* Setup */
64 PetscCall(DMSetFromOptions(dmstag));
65 PetscCall(DMSetUp(dmstag));
66
67 /* Field Creation */
68 PetscCall(TestFields(dmstag));
69
70 /* Clean up and finalize PETSc */
71 PetscCall(DMDestroy(&dmstag));
72 PetscCall(PetscFinalize());
73 return 0;
74 }
75
TestFields(DM dmstag)76 static PetscErrorCode TestFields(DM dmstag)
77 {
78 Vec vecLocal, vecGlobal;
79 PetscReal norm2;
80
81 PetscFunctionBeginUser;
82 PetscCall(DMCreateLocalVector(dmstag, &vecLocal));
83 PetscCall(DMCreateGlobalVector(dmstag, &vecGlobal));
84 PetscCall(VecSet(vecLocal, 1.0));
85 PetscCall(DMLocalToGlobalBegin(dmstag, vecLocal, INSERT_VALUES, vecGlobal));
86 PetscCall(DMLocalToGlobalEnd(dmstag, vecLocal, INSERT_VALUES, vecGlobal));
87 PetscCall(VecSet(vecGlobal, 2.0));
88 PetscCall(DMGlobalToLocalBegin(dmstag, vecGlobal, INSERT_VALUES, vecLocal));
89 PetscCall(DMGlobalToLocalEnd(dmstag, vecGlobal, INSERT_VALUES, vecLocal));
90 PetscCall(VecNorm(vecGlobal, NORM_2, &norm2));
91 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "2 Norm of test vector: %g\n", (double)norm2));
92 PetscCall(VecDestroy(&vecLocal));
93 PetscCall(VecDestroy(&vecGlobal));
94 PetscFunctionReturn(PETSC_SUCCESS);
95 }
96
97 /*TEST
98
99 test:
100 suffix: basic_1
101 nsize: 8
102 args: -dm_view -dim 1 -stag_grid_x 37 -stag_stencil_type none -stag_stencil_width 2
103
104 test:
105 suffix: basic_2
106 nsize: 14
107 args: -dm_view -dim 2 -stag_grid_x 11 -stag_grid_y 7 -stag_stencil_type star
108
109 test:
110 suffix: basic_3
111 nsize: 27
112 args: -dm_view -dim 3 -stag_grid_x 4 -stag_grid_y 5 -stag_grid_z 6 -stag_stencil_type star -stag_ranks_x 3 -stag_ranks_y 3 -stag_ranks_z 3
113
114 test:
115 suffix: multidof_1
116 nsize: 3
117 args: -dm_view -dim 1 -stag_dof_0 2 -stag_dof_1 7
118
119 test:
120 suffix: multidof_2
121 nsize: 9
122 args: -dm_view -dim 2 -stag_grid_x 3 -stag_grid_y 3 -stag_dof_0 3 -stag_dof_1 4 -stag_dof_2 5
123
124 test:
125 suffix: multidof_3
126 nsize: 27
127 args: -dm_view -dim 3 -stag_grid_x 6 -stag_grid_y 5 -stag_grid_z 4 -stag_ranks_x 3 -stag_ranks_y 3 -stag_ranks_z 3 -stag_dof_0 3 -stag_dof_1 4 -stag_dof_2 2 -stag_dof_3 5
128
129 test:
130 suffix: zerodof_1
131 nsize: 3
132 args: -dm_view -dim 1 -stag_dof_0 0 -stag_dof_1 0
133
134 test:
135 suffix: zerodof_2
136 nsize: 9
137 args: -dm_view -dim 2 -stag_grid_x 3 -stag_grid_y 3 -stag_dof_0 0 -stag_dof_1 0 -stag_dof_2 0
138
139 test:
140 suffix: zerodof_3
141 nsize: 27
142 args: -dm_view -dim 3 -stag_grid_x 4 -stag_grid_y 5 -stag_grid_z 6 -stag_ranks_x 3 -stag_ranks_y 3 -stag_ranks_z 3 -stag_dof_0 0 -stag_dof_1 4 -stag_dof_2 0 -stag_dof_3 0
143
144 test:
145 suffix: sizes_1
146 nsize: 3
147 args: -dm_view -dim 1 -setSizes
148
149 test:
150 suffix: sizes_2
151 nsize: 6
152 args: -dm_view -dim 2 -setSizes
153
154 test:
155 suffix: sizes_3
156 nsize: 12
157 args: -dm_view -dim 3 -setSizes
158
159 test:
160 suffix: stencil_none_1
161 nsize: 6
162 args: -dm_view -dim 2 -stag_grid_x 4 -stag_grid_y 5 -stag_stencil_type none -stag_stencil_width 0
163
164 test:
165 suffix: stencil_none_2
166 nsize: 8
167 args: -dm_view -dim 3 -stag_grid_x 4 -stag_grid_y 5 -stag_grid_z 3 -stag_stencil_type none -stag_stencil_width 0
168
169 test:
170 suffix: ghosted_zerowidth_seq_1
171 nsize: 1
172 args: -dm_view -dim 1 -stag_grid_x 4 -stag_boundary_type_x ghosted -stag_stencil_width 0
173
174 test:
175 suffix: ghosted_zerowidth_par_1
176 nsize: 3
177 args: -dm_view -dim 1 -setsizes -stag_boundary_type_x ghosted -stag_stencil_width 0
178
179 test:
180 suffix: ghosted_zerowidth_seq_2
181 nsize: 1
182 args: -dm_view -dim 2 -stag_grid_x 3 -stag_grid_y 5 -stag_boundary_type_x ghosted -stag_boundary_type_y ghosted -stag_stencil_width 0
183
184 test:
185 suffix: ghosted_zerowidth_par_2
186 nsize: 6
187 args: -dm_view -dim 2 -setsizes -stag_boundary_type_x ghosted -stag_boundary_type_y ghosted -stag_stencil_width 0
188
189 test:
190 suffix: ghosted_zerowidth_seq_3
191 nsize: 1
192 args: -dm_view -dim 3 -stag_grid_x 3 -stag_grid_y 5 -stag_grid_z 4 -stag_boundary_type_x ghosted -stag_boundary_type_y ghosted -stag_boundary_type_z ghosted -stag_stencil_width 0
193
194 test:
195 suffix: ghosted_zerowidth_par_3
196 nsize: 12
197 args: -dm_view -dim 3 -setsizes -stag_boundary_type_x ghosted -stag_boundary_type_y ghosted -stag_boundary_type_z ghosted -stag_stencil_width 0
198
199 testset:
200 suffix: periodic_skinny_1
201 nsize: 1
202 args: -dm_view -dim 1 -stag_grid_x 4 -stag_boundary_type_x periodic -stag_stencil_width {{0 1 2}separate output}
203
204 testset:
205 suffix: periodic_skinny_2
206 nsize: 1
207 args: -dm_view -dim 2 -stag_grid_x 4 -stag_grid_y 5 -stag_boundary_type_x periodic -stag_boundary_type_y periodic -stag_stencil_width {{0 1 2}separate output}
208
209 testset:
210 suffix: periodic_skinny_3
211 nsize: 1
212 args: -dm_view -dim 3 -stag_grid_x 4 -stag_grid_y 5 -stag_grid_z 3 -stag_boundary_type_x periodic -stag_boundary_type_y periodic -stag_boundary_type_z periodic -stag_stencil_width {{0 1 2}separate output}
213
214 TEST*/
215