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 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, <og)); 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(<og[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