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