1*c4762a1bSJed Brown 2*c4762a1bSJed Brown static char help[] = "Tests DMComposite routines.\n\n"; 3*c4762a1bSJed Brown 4*c4762a1bSJed Brown #include <petscdmredundant.h> 5*c4762a1bSJed Brown #include <petscdm.h> 6*c4762a1bSJed Brown #include <petscdmda.h> 7*c4762a1bSJed Brown #include <petscdmcomposite.h> 8*c4762a1bSJed Brown #include <petscpf.h> 9*c4762a1bSJed Brown 10*c4762a1bSJed Brown int main(int argc,char **argv) 11*c4762a1bSJed Brown { 12*c4762a1bSJed Brown PetscErrorCode ierr; 13*c4762a1bSJed Brown PetscInt nredundant1 = 5,nredundant2 = 2,i; 14*c4762a1bSJed Brown ISLocalToGlobalMapping *ltog; 15*c4762a1bSJed Brown PetscMPIInt rank,size; 16*c4762a1bSJed Brown DM packer; 17*c4762a1bSJed Brown Vec global,local1,local2,redundant1,redundant2; 18*c4762a1bSJed Brown PF pf; 19*c4762a1bSJed Brown DM da1,da2,dmred1,dmred2; 20*c4762a1bSJed Brown PetscScalar *redundant1a,*redundant2a; 21*c4762a1bSJed Brown PetscViewer sviewer; 22*c4762a1bSJed Brown PetscBool gather_add = PETSC_FALSE; 23*c4762a1bSJed Brown 24*c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 25*c4762a1bSJed Brown ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 26*c4762a1bSJed Brown ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 27*c4762a1bSJed Brown 28*c4762a1bSJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-gather_add",&gather_add,NULL);CHKERRQ(ierr); 29*c4762a1bSJed Brown 30*c4762a1bSJed Brown ierr = DMCompositeCreate(PETSC_COMM_WORLD,&packer);CHKERRQ(ierr); 31*c4762a1bSJed Brown 32*c4762a1bSJed Brown ierr = DMRedundantCreate(PETSC_COMM_WORLD,0,nredundant1,&dmred1);CHKERRQ(ierr); 33*c4762a1bSJed Brown ierr = DMCreateLocalVector(dmred1,&redundant1);CHKERRQ(ierr); 34*c4762a1bSJed Brown ierr = DMCompositeAddDM(packer,dmred1);CHKERRQ(ierr); 35*c4762a1bSJed Brown 36*c4762a1bSJed Brown ierr = DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,8,1,1,NULL,&da1);CHKERRQ(ierr); 37*c4762a1bSJed Brown ierr = DMSetFromOptions(da1);CHKERRQ(ierr); 38*c4762a1bSJed Brown ierr = DMSetUp(da1);CHKERRQ(ierr); 39*c4762a1bSJed Brown ierr = DMCreateLocalVector(da1,&local1);CHKERRQ(ierr); 40*c4762a1bSJed Brown ierr = DMCompositeAddDM(packer,da1);CHKERRQ(ierr); 41*c4762a1bSJed Brown 42*c4762a1bSJed Brown ierr = DMRedundantCreate(PETSC_COMM_WORLD,1%size,nredundant2,&dmred2);CHKERRQ(ierr); 43*c4762a1bSJed Brown ierr = DMCreateLocalVector(dmred2,&redundant2);CHKERRQ(ierr); 44*c4762a1bSJed Brown ierr = DMCompositeAddDM(packer,dmred2);CHKERRQ(ierr); 45*c4762a1bSJed Brown 46*c4762a1bSJed Brown ierr = DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,6,1,1,NULL,&da2);CHKERRQ(ierr); 47*c4762a1bSJed Brown ierr = DMSetFromOptions(da2);CHKERRQ(ierr); 48*c4762a1bSJed Brown ierr = DMSetUp(da2);CHKERRQ(ierr); 49*c4762a1bSJed Brown ierr = DMCreateLocalVector(da2,&local2);CHKERRQ(ierr); 50*c4762a1bSJed Brown ierr = DMCompositeAddDM(packer,da2);CHKERRQ(ierr); 51*c4762a1bSJed Brown 52*c4762a1bSJed Brown ierr = DMCreateGlobalVector(packer,&global);CHKERRQ(ierr); 53*c4762a1bSJed Brown ierr = PFCreate(PETSC_COMM_WORLD,1,1,&pf);CHKERRQ(ierr); 54*c4762a1bSJed Brown ierr = PFSetType(pf,PFIDENTITY,NULL);CHKERRQ(ierr); 55*c4762a1bSJed Brown ierr = PFApplyVec(pf,NULL,global);CHKERRQ(ierr); 56*c4762a1bSJed Brown ierr = PFDestroy(&pf);CHKERRQ(ierr); 57*c4762a1bSJed Brown ierr = VecView(global,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 58*c4762a1bSJed Brown 59*c4762a1bSJed Brown ierr = DMCompositeScatter(packer,global,redundant1,local1,redundant2,local2);CHKERRQ(ierr); 60*c4762a1bSJed Brown ierr = PetscViewerASCIIPushSynchronized(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 61*c4762a1bSJed Brown ierr = PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD,"[%d] My part of redundant1 vector\n",rank);CHKERRQ(ierr); 62*c4762a1bSJed Brown ierr = PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&sviewer);CHKERRQ(ierr); 63*c4762a1bSJed Brown ierr = VecView(redundant1,sviewer);CHKERRQ(ierr); 64*c4762a1bSJed Brown ierr = PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&sviewer);CHKERRQ(ierr); 65*c4762a1bSJed Brown ierr = PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 66*c4762a1bSJed Brown ierr = PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD,"[%d] My part of da1 vector\n",rank);CHKERRQ(ierr); 67*c4762a1bSJed Brown ierr = PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&sviewer);CHKERRQ(ierr); 68*c4762a1bSJed Brown ierr = VecView(local1,sviewer);CHKERRQ(ierr); 69*c4762a1bSJed Brown ierr = PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&sviewer);CHKERRQ(ierr); 70*c4762a1bSJed Brown ierr = PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 71*c4762a1bSJed Brown ierr = PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD,"[%d] My part of redundant2 vector\n",rank);CHKERRQ(ierr); 72*c4762a1bSJed Brown ierr = PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&sviewer);CHKERRQ(ierr); 73*c4762a1bSJed Brown ierr = VecView(redundant2,sviewer);CHKERRQ(ierr); 74*c4762a1bSJed Brown ierr = PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&sviewer);CHKERRQ(ierr); 75*c4762a1bSJed Brown ierr = PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 76*c4762a1bSJed Brown ierr = PetscViewerASCIISynchronizedPrintf(PETSC_VIEWER_STDOUT_WORLD,"[%d] My part of da2 vector\n",rank);CHKERRQ(ierr); 77*c4762a1bSJed Brown ierr = PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&sviewer);CHKERRQ(ierr); 78*c4762a1bSJed Brown ierr = VecView(local2,sviewer);CHKERRQ(ierr); 79*c4762a1bSJed Brown ierr = PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD,PETSC_COMM_SELF,&sviewer);CHKERRQ(ierr); 80*c4762a1bSJed Brown ierr = PetscViewerFlush(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 81*c4762a1bSJed Brown ierr = PetscViewerASCIIPopSynchronized(PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 82*c4762a1bSJed Brown 83*c4762a1bSJed Brown ierr = VecGetArray(redundant1,&redundant1a);CHKERRQ(ierr); 84*c4762a1bSJed Brown ierr = VecGetArray(redundant2,&redundant2a);CHKERRQ(ierr); 85*c4762a1bSJed Brown for (i=0; i<nredundant1; i++) redundant1a[i] = (rank+2)*i; 86*c4762a1bSJed Brown for (i=0; i<nredundant2; i++) redundant2a[i] = (rank+10)*i; 87*c4762a1bSJed Brown ierr = VecRestoreArray(redundant1,&redundant1a);CHKERRQ(ierr); 88*c4762a1bSJed Brown ierr = VecRestoreArray(redundant2,&redundant2a);CHKERRQ(ierr); 89*c4762a1bSJed Brown 90*c4762a1bSJed Brown ierr = DMCompositeGather(packer,gather_add ? ADD_VALUES : INSERT_VALUES,global,redundant1,local1,redundant2,local2);CHKERRQ(ierr); 91*c4762a1bSJed Brown ierr = VecView(global,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 92*c4762a1bSJed Brown 93*c4762a1bSJed Brown /* get the global numbering for each subvector element */ 94*c4762a1bSJed Brown ierr = DMCompositeGetISLocalToGlobalMappings(packer,<og);CHKERRQ(ierr); 95*c4762a1bSJed Brown 96*c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD,"Local to global mapping of redundant1 vector\n");CHKERRQ(ierr); 97*c4762a1bSJed Brown ierr = ISLocalToGlobalMappingView(ltog[0],PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 98*c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD,"Local to global mapping of local1 vector\n");CHKERRQ(ierr); 99*c4762a1bSJed Brown ierr = ISLocalToGlobalMappingView(ltog[1],PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 100*c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD,"Local to global mapping of redundant2 vector\n");CHKERRQ(ierr); 101*c4762a1bSJed Brown ierr = ISLocalToGlobalMappingView(ltog[2],PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 102*c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD,"Local to global mapping of local2 vector\n");CHKERRQ(ierr); 103*c4762a1bSJed Brown ierr = ISLocalToGlobalMappingView(ltog[3],PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 104*c4762a1bSJed Brown 105*c4762a1bSJed Brown for (i=0; i<4; i++) {ierr = ISLocalToGlobalMappingDestroy(<og[i]);CHKERRQ(ierr);} 106*c4762a1bSJed Brown ierr = PetscFree(ltog);CHKERRQ(ierr); 107*c4762a1bSJed Brown 108*c4762a1bSJed Brown ierr = DMDestroy(&da1);CHKERRQ(ierr); 109*c4762a1bSJed Brown ierr = DMDestroy(&dmred1);CHKERRQ(ierr); 110*c4762a1bSJed Brown ierr = DMDestroy(&dmred2);CHKERRQ(ierr); 111*c4762a1bSJed Brown ierr = DMDestroy(&da2);CHKERRQ(ierr); 112*c4762a1bSJed Brown ierr = VecDestroy(&redundant1);CHKERRQ(ierr); 113*c4762a1bSJed Brown ierr = VecDestroy(&redundant2);CHKERRQ(ierr); 114*c4762a1bSJed Brown ierr = VecDestroy(&local1);CHKERRQ(ierr); 115*c4762a1bSJed Brown ierr = VecDestroy(&local2);CHKERRQ(ierr); 116*c4762a1bSJed Brown ierr = VecDestroy(&global);CHKERRQ(ierr); 117*c4762a1bSJed Brown ierr = DMDestroy(&packer);CHKERRQ(ierr); 118*c4762a1bSJed Brown ierr = PetscFinalize(); 119*c4762a1bSJed Brown return ierr; 120*c4762a1bSJed Brown } 121*c4762a1bSJed Brown 122*c4762a1bSJed Brown 123*c4762a1bSJed Brown 124*c4762a1bSJed Brown /*TEST 125*c4762a1bSJed Brown 126*c4762a1bSJed Brown build: 127*c4762a1bSJed Brown requires: !complex 128*c4762a1bSJed Brown 129*c4762a1bSJed Brown test: 130*c4762a1bSJed Brown nsize: 3 131*c4762a1bSJed Brown 132*c4762a1bSJed Brown test: 133*c4762a1bSJed Brown suffix: 2 134*c4762a1bSJed Brown nsize: 3 135*c4762a1bSJed Brown args: -gather_add 136*c4762a1bSJed Brown 137*c4762a1bSJed Brown TEST*/ 138