xref: /petsc/src/dm/tutorials/ex19.c (revision 9566063d113dddea24716c546802770db7481bc0)
1c4762a1bSJed Brown /*
2c4762a1bSJed Brown      Demonstrates creating domain decomposition DAs and how to shuffle around data between the two
3c4762a1bSJed Brown  */
4c4762a1bSJed Brown 
5c4762a1bSJed Brown #include <petscdm.h>
6c4762a1bSJed Brown #include <petscdmda.h>
7c4762a1bSJed Brown 
8c4762a1bSJed Brown static char help[] = "Test for DMDA with overlap.\n\n";
9c4762a1bSJed Brown 
10c4762a1bSJed Brown int main(int argc,char **argv)
11c4762a1bSJed Brown {
12c4762a1bSJed Brown   DM             da;
13c4762a1bSJed Brown 
14*9566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc,&argv,(char*)0,help));
15c4762a1bSJed Brown   /* Build of the DMDA -- 1D -- boundary_none */
16*9566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"1D -- DM_BOUNDARY_NONE\n"));
17*9566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
18*9566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 1));
19*9566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 1, 1));
20*9566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE));
21*9566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 1));
22*9566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
23*9566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
24*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
25*9566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"n1d_"));
26*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
27*9566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
28*9566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
29*9566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
30c4762a1bSJed Brown 
31c4762a1bSJed Brown   /* Build of the DMDA -- 1D -- boundary_ghosted */
32*9566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"1D -- DM_BOUNDARY_GHOSTED\n"));
33*9566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
34*9566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 1));
35*9566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 1, 1));
36*9566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED));
37*9566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
38*9566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
39*9566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
40*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
41*9566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"g1d_"));
42*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
43*9566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
44*9566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
45*9566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
46c4762a1bSJed Brown 
47c4762a1bSJed Brown   /* Build of the DMDA -- 1D -- boundary_periodic */
48*9566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"1D -- DM_BOUNDARY_PERIODIC\n"));
49*9566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
50*9566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 1));
51*9566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 1, 1));
52*9566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC));
53*9566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
54*9566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
55*9566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
56*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
57*9566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"p1d_"));
58*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
59*9566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
60*9566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
61*9566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
62c4762a1bSJed Brown 
63c4762a1bSJed Brown   /* Build of the DMDA -- 2D -- boundary_none */
64*9566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"2D -- DM_BOUNDARY_NONE\n"));
65*9566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
66*9566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 2));
67*9566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 1));
68*9566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE));
69*9566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
70*9566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
71*9566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
72*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
73*9566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"n2d_"));
74*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
75*9566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
76*9566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
77*9566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
78c4762a1bSJed Brown 
79c4762a1bSJed Brown   /* Build of the DMDA -- 2D -- boundary_ghosted */
80*9566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"2D -- DM_BOUNDARY_GHOSTED\n"));
81*9566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
82*9566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 2));
83*9566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 1));
84*9566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED));
85*9566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
86*9566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
87*9566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
88*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
89*9566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"g2d_"));
90*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
91*9566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
92*9566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
93*9566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
94c4762a1bSJed Brown 
95c4762a1bSJed Brown   /* Build of the DMDA -- 2D -- boundary_periodic */
96*9566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"2D -- DM_BOUNDARY_PERIODIC\n"));
97*9566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
98*9566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 2));
99*9566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 1));
100*9566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC));
101*9566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
102*9566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
103*9566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
104*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
105*9566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"p2d_"));
106*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
107*9566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
108*9566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
109*9566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
110c4762a1bSJed Brown 
111c4762a1bSJed Brown   /* Build of the DMDA -- 3D -- boundary_none */
112*9566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"3D -- DM_BOUNDARY_NONE\n"));
113*9566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
114*9566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 3));
115*9566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 8));
116*9566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE));
117*9566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
118*9566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
119*9566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
120*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
121*9566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"n3d_"));
122*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
123*9566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
124*9566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
125*9566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
126c4762a1bSJed Brown 
127c4762a1bSJed Brown   /* Build of the DMDA -- 3D -- boundary_ghosted */
128*9566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"3D -- DM_BOUNDARY_GHOSTED\n"));
129*9566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
130*9566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 3));
131*9566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 8));
132*9566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED));
133*9566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
134*9566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
135*9566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
136*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
137*9566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"g3d_"));
138*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
139*9566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
140*9566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
141*9566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
142c4762a1bSJed Brown 
143c4762a1bSJed Brown   /* Build of the DMDA -- 3D -- boundary_periodic */
144*9566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"3D -- DM_BOUNDARY_PERIODIC\n"));
145*9566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
146*9566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 3));
147*9566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 8));
148*9566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC));
149*9566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
150*9566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
151*9566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
152*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
153*9566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"p3d_"));
154*9566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
155*9566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
156*9566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
157*9566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
158c4762a1bSJed Brown 
159c4762a1bSJed Brown   /* test moving data in and out */
160*9566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
161b122ec5aSJacob Faibussowitsch   return 0;
162c4762a1bSJed Brown }
163c4762a1bSJed Brown 
164c4762a1bSJed Brown /*TEST
165c4762a1bSJed Brown 
166c4762a1bSJed Brown    test:
167c4762a1bSJed Brown 
168c4762a1bSJed Brown TEST*/
169