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