xref: /petsc/src/dm/tutorials/ex19.c (revision 327415f76d85372a4417cf1aaa14db707d4d6c04)
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   DM             da;
13c4762a1bSJed Brown 
14*327415f7SBarry Smith   PetscFunctionBeginUser;
159566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc,&argv,(char*)0,help));
16c4762a1bSJed Brown   /* Build of the DMDA -- 1D -- boundary_none */
179566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"1D -- DM_BOUNDARY_NONE\n"));
189566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
199566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 1));
209566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 1, 1));
219566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE));
229566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 1));
239566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
249566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
259566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
269566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"n1d_"));
279566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
289566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
299566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
309566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
31c4762a1bSJed Brown 
32c4762a1bSJed Brown   /* Build of the DMDA -- 1D -- boundary_ghosted */
339566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"1D -- DM_BOUNDARY_GHOSTED\n"));
349566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
359566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 1));
369566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 1, 1));
379566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED));
389566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
399566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
409566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
419566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
429566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"g1d_"));
439566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
449566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
459566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
469566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
47c4762a1bSJed Brown 
48c4762a1bSJed Brown   /* Build of the DMDA -- 1D -- boundary_periodic */
499566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"1D -- DM_BOUNDARY_PERIODIC\n"));
509566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
519566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 1));
529566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 1, 1));
539566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC));
549566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
559566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
569566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
579566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
589566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"p1d_"));
599566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
609566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
619566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
629566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
63c4762a1bSJed Brown 
64c4762a1bSJed Brown   /* Build of the DMDA -- 2D -- boundary_none */
659566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"2D -- DM_BOUNDARY_NONE\n"));
669566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
679566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 2));
689566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 1));
699566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE));
709566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
719566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
729566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
739566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
749566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"n2d_"));
759566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
769566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
779566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
789566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
79c4762a1bSJed Brown 
80c4762a1bSJed Brown   /* Build of the DMDA -- 2D -- boundary_ghosted */
819566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"2D -- DM_BOUNDARY_GHOSTED\n"));
829566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
839566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 2));
849566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 1));
859566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED));
869566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
879566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
889566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
899566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
909566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"g2d_"));
919566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
929566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
939566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
949566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
95c4762a1bSJed Brown 
96c4762a1bSJed Brown   /* Build of the DMDA -- 2D -- boundary_periodic */
979566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"2D -- DM_BOUNDARY_PERIODIC\n"));
989566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
999566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 2));
1009566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 1));
1019566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC));
1029566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
1039566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
1049566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
1059566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
1069566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"p2d_"));
1079566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
1089566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
1099566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
1109566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
111c4762a1bSJed Brown 
112c4762a1bSJed Brown   /* Build of the DMDA -- 3D -- boundary_none */
1139566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"3D -- DM_BOUNDARY_NONE\n"));
1149566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
1159566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 3));
1169566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 8));
1179566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE));
1189566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
1199566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
1209566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
1219566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
1229566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"n3d_"));
1239566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
1249566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
1259566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
1269566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
127c4762a1bSJed Brown 
128c4762a1bSJed Brown   /* Build of the DMDA -- 3D -- boundary_ghosted */
1299566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"3D -- DM_BOUNDARY_GHOSTED\n"));
1309566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
1319566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 3));
1329566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 8));
1339566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_GHOSTED));
1349566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
1359566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
1369566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
1379566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
1389566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"g3d_"));
1399566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
1409566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
1419566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
1429566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
143c4762a1bSJed Brown 
144c4762a1bSJed Brown   /* Build of the DMDA -- 3D -- boundary_periodic */
1459566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"3D -- DM_BOUNDARY_PERIODIC\n"));
1469566063dSJacob Faibussowitsch   PetscCall(DMDACreate(PETSC_COMM_WORLD, &da));
1479566063dSJacob Faibussowitsch   PetscCall(DMSetDimension(da, 3));
1489566063dSJacob Faibussowitsch   PetscCall(DMDASetSizes(da, 8, 8, 8));
1499566063dSJacob Faibussowitsch   PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_PERIODIC));
1509566063dSJacob Faibussowitsch   PetscCall(DMDASetDof(da, 2));
1519566063dSJacob Faibussowitsch   PetscCall(DMDASetStencilWidth(da, 1));
1529566063dSJacob Faibussowitsch   PetscCall(DMDASetOverlap(da,1,1,1));
1539566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
1549566063dSJacob Faibussowitsch   PetscCall(DMSetOptionsPrefix(da,"p3d_"));
1559566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
1569566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
1579566063dSJacob Faibussowitsch   PetscCall(DMView(da,PETSC_VIEWER_STDOUT_WORLD));
1589566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
159c4762a1bSJed Brown 
160c4762a1bSJed Brown   /* test moving data in and out */
1619566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
162b122ec5aSJacob Faibussowitsch   return 0;
163c4762a1bSJed Brown }
164c4762a1bSJed Brown 
165c4762a1bSJed Brown /*TEST
166c4762a1bSJed Brown 
167c4762a1bSJed Brown    test:
168c4762a1bSJed Brown 
169c4762a1bSJed Brown TEST*/
170