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