xref: /petsc/src/dm/tests/ex16.c (revision 732aec7a18f2199fb53bb9a2f3aef439a834ce31)
1c4762a1bSJed Brown static char help[] = "Tests DMComposite routines.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdmredundant.h>
4c4762a1bSJed Brown #include <petscdm.h>
5c4762a1bSJed Brown #include <petscdmda.h>
6c4762a1bSJed Brown #include <petscdmcomposite.h>
7c4762a1bSJed Brown #include <petscpf.h>
8c4762a1bSJed Brown 
main(int argc,char ** argv)9d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
10d71ae5a4SJacob Faibussowitsch {
11c4762a1bSJed Brown   PetscInt                nredundant1 = 5, nredundant2 = 2, i;
12c4762a1bSJed Brown   ISLocalToGlobalMapping *ltog;
13c4762a1bSJed Brown   PetscMPIInt             rank, size;
14c4762a1bSJed Brown   DM                      packer;
15c4762a1bSJed Brown   Vec                     global, local1, local2, redundant1, redundant2;
16c4762a1bSJed Brown   PF                      pf;
17c4762a1bSJed Brown   DM                      da1, da2, dmred1, dmred2;
18c4762a1bSJed Brown   PetscScalar            *redundant1a, *redundant2a;
19c4762a1bSJed Brown   PetscViewer             sviewer;
20c4762a1bSJed Brown   PetscBool               gather_add = PETSC_FALSE;
21c4762a1bSJed Brown 
22327415f7SBarry Smith   PetscFunctionBeginUser;
23*c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
249566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
259566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
26c4762a1bSJed Brown 
279566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-gather_add", &gather_add, NULL));
28c4762a1bSJed Brown 
299566063dSJacob Faibussowitsch   PetscCall(DMCompositeCreate(PETSC_COMM_WORLD, &packer));
30c4762a1bSJed Brown 
319566063dSJacob Faibussowitsch   PetscCall(DMRedundantCreate(PETSC_COMM_WORLD, 0, nredundant1, &dmred1));
329566063dSJacob Faibussowitsch   PetscCall(DMCreateLocalVector(dmred1, &redundant1));
339566063dSJacob Faibussowitsch   PetscCall(DMCompositeAddDM(packer, dmred1));
34c4762a1bSJed Brown 
359566063dSJacob Faibussowitsch   PetscCall(DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 8, 1, 1, NULL, &da1));
369566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da1));
379566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da1));
389566063dSJacob Faibussowitsch   PetscCall(DMCreateLocalVector(da1, &local1));
399566063dSJacob Faibussowitsch   PetscCall(DMCompositeAddDM(packer, da1));
40c4762a1bSJed Brown 
419566063dSJacob Faibussowitsch   PetscCall(DMRedundantCreate(PETSC_COMM_WORLD, 1 % size, nredundant2, &dmred2));
429566063dSJacob Faibussowitsch   PetscCall(DMCreateLocalVector(dmred2, &redundant2));
439566063dSJacob Faibussowitsch   PetscCall(DMCompositeAddDM(packer, dmred2));
44c4762a1bSJed Brown 
459566063dSJacob Faibussowitsch   PetscCall(DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 6, 1, 1, NULL, &da2));
469566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da2));
479566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da2));
489566063dSJacob Faibussowitsch   PetscCall(DMCreateLocalVector(da2, &local2));
499566063dSJacob Faibussowitsch   PetscCall(DMCompositeAddDM(packer, da2));
50c4762a1bSJed Brown 
519566063dSJacob Faibussowitsch   PetscCall(DMCreateGlobalVector(packer, &global));
529566063dSJacob Faibussowitsch   PetscCall(PFCreate(PETSC_COMM_WORLD, 1, 1, &pf));
539566063dSJacob Faibussowitsch   PetscCall(PFSetType(pf, PFIDENTITY, NULL));
549566063dSJacob Faibussowitsch   PetscCall(PFApplyVec(pf, NULL, global));
559566063dSJacob Faibussowitsch   PetscCall(PFDestroy(&pf));
569566063dSJacob Faibussowitsch   PetscCall(VecView(global, PETSC_VIEWER_STDOUT_WORLD));
57c4762a1bSJed Brown 
589566063dSJacob Faibussowitsch   PetscCall(DMCompositeScatter(packer, global, redundant1, local1, redundant2, local2));
599566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD));
609566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
61b4025f61SBarry Smith   PetscCall(PetscViewerASCIIPrintf(sviewer, "[%d] My part of redundant1 vector\n", rank));
629566063dSJacob Faibussowitsch   PetscCall(VecView(redundant1, sviewer));
639566063dSJacob Faibussowitsch   PetscCall(PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
649566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
65b4025f61SBarry Smith   PetscCall(PetscViewerASCIIPrintf(sviewer, "[%d] My part of da1 vector\n", rank));
669566063dSJacob Faibussowitsch   PetscCall(VecView(local1, sviewer));
679566063dSJacob Faibussowitsch   PetscCall(PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
689566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
69b4025f61SBarry Smith   PetscCall(PetscViewerASCIIPrintf(sviewer, "[%d] My part of redundant2 vector\n", rank));
709566063dSJacob Faibussowitsch   PetscCall(VecView(redundant2, sviewer));
719566063dSJacob Faibussowitsch   PetscCall(PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
729566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
73b4025f61SBarry Smith   PetscCall(PetscViewerASCIIPrintf(sviewer, "[%d] My part of da2 vector\n", rank));
749566063dSJacob Faibussowitsch   PetscCall(VecView(local2, sviewer));
759566063dSJacob Faibussowitsch   PetscCall(PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, &sviewer));
769566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD));
77c4762a1bSJed Brown 
789566063dSJacob Faibussowitsch   PetscCall(VecGetArray(redundant1, &redundant1a));
799566063dSJacob Faibussowitsch   PetscCall(VecGetArray(redundant2, &redundant2a));
80c4762a1bSJed Brown   for (i = 0; i < nredundant1; i++) redundant1a[i] = (rank + 2) * i;
81c4762a1bSJed Brown   for (i = 0; i < nredundant2; i++) redundant2a[i] = (rank + 10) * i;
829566063dSJacob Faibussowitsch   PetscCall(VecRestoreArray(redundant1, &redundant1a));
839566063dSJacob Faibussowitsch   PetscCall(VecRestoreArray(redundant2, &redundant2a));
84c4762a1bSJed Brown 
859566063dSJacob Faibussowitsch   PetscCall(DMCompositeGather(packer, gather_add ? ADD_VALUES : INSERT_VALUES, global, redundant1, local1, redundant2, local2));
869566063dSJacob Faibussowitsch   PetscCall(VecView(global, PETSC_VIEWER_STDOUT_WORLD));
87c4762a1bSJed Brown 
88c4762a1bSJed Brown   /* get the global numbering for each subvector element */
899566063dSJacob Faibussowitsch   PetscCall(DMCompositeGetISLocalToGlobalMappings(packer, &ltog));
90c4762a1bSJed Brown 
919566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD, "Local to global mapping of redundant1 vector\n"));
929566063dSJacob Faibussowitsch   PetscCall(ISLocalToGlobalMappingView(ltog[0], PETSC_VIEWER_STDOUT_WORLD));
939566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD, "Local to global mapping of local1 vector\n"));
949566063dSJacob Faibussowitsch   PetscCall(ISLocalToGlobalMappingView(ltog[1], PETSC_VIEWER_STDOUT_WORLD));
959566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD, "Local to global mapping of redundant2 vector\n"));
969566063dSJacob Faibussowitsch   PetscCall(ISLocalToGlobalMappingView(ltog[2], PETSC_VIEWER_STDOUT_WORLD));
979566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD, "Local to global mapping of local2 vector\n"));
989566063dSJacob Faibussowitsch   PetscCall(ISLocalToGlobalMappingView(ltog[3], PETSC_VIEWER_STDOUT_WORLD));
99c4762a1bSJed Brown 
1009566063dSJacob Faibussowitsch   for (i = 0; i < 4; i++) PetscCall(ISLocalToGlobalMappingDestroy(&ltog[i]));
1019566063dSJacob Faibussowitsch   PetscCall(PetscFree(ltog));
102c4762a1bSJed Brown 
1039566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da1));
1049566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dmred1));
1059566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dmred2));
1069566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da2));
1079566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&redundant1));
1089566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&redundant2));
1099566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&local1));
1109566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&local2));
1119566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&global));
1129566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&packer));
1139566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
114b122ec5aSJacob Faibussowitsch   return 0;
115c4762a1bSJed Brown }
116c4762a1bSJed Brown 
117c4762a1bSJed Brown /*TEST
118c4762a1bSJed Brown 
119c4762a1bSJed Brown    build:
120c4762a1bSJed Brown       requires: !complex
121c4762a1bSJed Brown 
122c4762a1bSJed Brown    test:
123c4762a1bSJed Brown       nsize: 3
124c4762a1bSJed Brown 
125c4762a1bSJed Brown    test:
126c4762a1bSJed Brown       suffix: 2
127c4762a1bSJed Brown       nsize: 3
128c4762a1bSJed Brown       args: -gather_add
129c4762a1bSJed Brown 
130c4762a1bSJed Brown TEST*/
131