xref: /petsc/src/dm/tutorials/ex19.c (revision 030f984af8d8bb4c203755d35bded3c05b3d83ce)
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   /* Build of the DMDA -- 2D -- boundary_periodic */
97   ierr = PetscPrintf(PETSC_COMM_WORLD,"2D -- DM_BOUNDARY_PERIODIC\n");CHKERRQ(ierr);
98   ierr = DMDACreate(PETSC_COMM_WORLD, &da);CHKERRQ(ierr);
99   ierr = DMSetDimension(da, 2);CHKERRQ(ierr);
100   ierr = DMDASetSizes(da, 8, 8, 1);CHKERRQ(ierr);
101   ierr = DMDASetBoundaryType(da, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC);CHKERRQ(ierr);
102   ierr = DMDASetDof(da, 2);CHKERRQ(ierr);
103   ierr = DMDASetStencilWidth(da, 1);CHKERRQ(ierr);
104   ierr = DMDASetOverlap(da,1,1,1);CHKERRQ(ierr);
105   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
106   ierr = DMSetOptionsPrefix(da,"p2d_");CHKERRQ(ierr);
107   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
108   ierr = DMSetUp(da);CHKERRQ(ierr);
109   ierr = DMView(da,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
110   ierr = DMDestroy(&da);CHKERRQ(ierr);
111 
112   /* Build of the DMDA -- 3D -- boundary_none */
113   ierr = PetscPrintf(PETSC_COMM_WORLD,"3D -- DM_BOUNDARY_NONE\n");CHKERRQ(ierr);
114   ierr = DMDACreate(PETSC_COMM_WORLD, &da);CHKERRQ(ierr);
115   ierr = DMSetDimension(da, 3);CHKERRQ(ierr);
116   ierr = DMDASetSizes(da, 8, 8, 8);CHKERRQ(ierr);
117   ierr = DMDASetBoundaryType(da, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE);CHKERRQ(ierr);
118   ierr = DMDASetDof(da, 2);CHKERRQ(ierr);
119   ierr = DMDASetStencilWidth(da, 1);CHKERRQ(ierr);
120   ierr = DMDASetOverlap(da,1,1,1);CHKERRQ(ierr);
121   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
122   ierr = DMSetOptionsPrefix(da,"n3d_");CHKERRQ(ierr);
123   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
124   ierr = DMSetUp(da);CHKERRQ(ierr);
125   ierr = DMView(da,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
126   ierr = DMDestroy(&da);CHKERRQ(ierr);
127 
128   /* Build of the DMDA -- 3D -- boundary_ghosted */
129   ierr = PetscPrintf(PETSC_COMM_WORLD,"3D -- DM_BOUNDARY_GHOSTED\n");CHKERRQ(ierr);
130   ierr = DMDACreate(PETSC_COMM_WORLD, &da);CHKERRQ(ierr);
131   ierr = DMSetDimension(da, 3);CHKERRQ(ierr);
132   ierr = DMDASetSizes(da, 8, 8, 8);CHKERRQ(ierr);
133   ierr = DMDASetBoundaryType(da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED);CHKERRQ(ierr);
134   ierr = DMDASetDof(da, 2);CHKERRQ(ierr);
135   ierr = DMDASetStencilWidth(da, 1);CHKERRQ(ierr);
136   ierr = DMDASetOverlap(da,1,1,1);CHKERRQ(ierr);
137   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
138   ierr = DMSetOptionsPrefix(da,"g3d_");CHKERRQ(ierr);
139   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
140   ierr = DMSetUp(da);CHKERRQ(ierr);
141   ierr = DMView(da,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
142   ierr = DMDestroy(&da);CHKERRQ(ierr);
143 
144   /* Build of the DMDA -- 3D -- boundary_periodic */
145   ierr = PetscPrintf(PETSC_COMM_WORLD,"3D -- DM_BOUNDARY_PERIODIC\n");CHKERRQ(ierr);
146   ierr = DMDACreate(PETSC_COMM_WORLD, &da);CHKERRQ(ierr);
147   ierr = DMSetDimension(da, 3);CHKERRQ(ierr);
148   ierr = DMDASetSizes(da, 8, 8, 8);CHKERRQ(ierr);
149   ierr = DMDASetBoundaryType(da, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC);CHKERRQ(ierr);
150   ierr = DMDASetDof(da, 2);CHKERRQ(ierr);
151   ierr = DMDASetStencilWidth(da, 1);CHKERRQ(ierr);
152   ierr = DMDASetOverlap(da,1,1,1);CHKERRQ(ierr);
153   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
154   ierr = DMSetOptionsPrefix(da,"p3d_");CHKERRQ(ierr);
155   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
156   ierr = DMSetUp(da);CHKERRQ(ierr);
157   ierr = DMView(da,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
158   ierr = DMDestroy(&da);CHKERRQ(ierr);
159 
160   /* test moving data in and out */
161   ierr = PetscFinalize();
162   return ierr;
163 }
164 
165 /*TEST
166 
167    test:
168 
169 TEST*/
170