xref: /petsc/src/dm/tutorials/ex19.c (revision 732aec7a18f2199fb53bb9a2f3aef439a834ce31)
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 
main(int argc,char ** argv)10d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
11d71ae5a4SJacob Faibussowitsch {
12c4762a1bSJed Brown   DM da;
13c4762a1bSJed Brown 
14327415f7SBarry Smith   PetscFunctionBeginUser;
15*c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &argv, NULL, 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