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