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