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