1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Tests DMDAGlobalToNaturalAllCreate() using contour plotting for 2d DMDAs.\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscdm.h> 5c4762a1bSJed Brown #include <petscdmda.h> 6c4762a1bSJed Brown #include <petscdraw.h> 7c4762a1bSJed Brown 8c4762a1bSJed Brown int main(int argc,char **argv) 9c4762a1bSJed Brown { 10c4762a1bSJed Brown PetscInt i,j,M = 10,N = 8,m = PETSC_DECIDE,n = PETSC_DECIDE; 11c4762a1bSJed Brown PetscMPIInt rank; 12c4762a1bSJed Brown PetscBool flg = PETSC_FALSE; 13c4762a1bSJed Brown DM da; 14c4762a1bSJed Brown PetscViewer viewer; 15c4762a1bSJed Brown Vec localall,global; 16c4762a1bSJed Brown PetscScalar value,*vlocal; 17c4762a1bSJed Brown DMBoundaryType bx = DM_BOUNDARY_NONE,by = DM_BOUNDARY_NONE; 18c4762a1bSJed Brown DMDAStencilType stype = DMDA_STENCIL_BOX; 19c4762a1bSJed Brown VecScatter tolocalall,fromlocalall; 20c4762a1bSJed Brown PetscInt start,end; 21c4762a1bSJed Brown 22*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&argv,(char*)0,help)); 235f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDrawOpen(PETSC_COMM_WORLD,0,"",300,0,300,300,&viewer)); 24c4762a1bSJed Brown 25c4762a1bSJed Brown /* Read options */ 265f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL)); 275f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL)); 285f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL)); 295f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); 305f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-star_stencil",&flg,NULL)); 31c4762a1bSJed Brown if (flg) stype = DMDA_STENCIL_STAR; 32c4762a1bSJed Brown 33c4762a1bSJed Brown /* Create distributed array and get vectors */ 345f80ce2aSJacob Faibussowitsch CHKERRQ(DMDACreate2d(PETSC_COMM_WORLD,bx,by,stype,M,N,m,n,1,1,NULL,NULL,&da)); 355f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetFromOptions(da)); 365f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetUp(da)); 37c4762a1bSJed Brown 385f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(da,&global)); 395f80ce2aSJacob Faibussowitsch CHKERRQ(VecCreateSeq(PETSC_COMM_SELF,M*N,&localall)); 40c4762a1bSJed Brown 415f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 425f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetOwnershipRange(global,&start,&end)); 43c4762a1bSJed Brown for (i=start; i<end; i++) { 44c4762a1bSJed Brown value = 5.0*rank; 455f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetValues(global,1,&i,&value,INSERT_VALUES)); 46c4762a1bSJed Brown } 475f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(global,viewer)); 48c4762a1bSJed Brown 49c4762a1bSJed Brown /* 50c4762a1bSJed Brown Create Scatter from global DMDA parallel vector to local vector that 51c4762a1bSJed Brown contains all entries 52c4762a1bSJed Brown */ 535f80ce2aSJacob Faibussowitsch CHKERRQ(DMDAGlobalToNaturalAllCreate(da,&tolocalall)); 545f80ce2aSJacob Faibussowitsch CHKERRQ(DMDANaturalAllToGlobalCreate(da,&fromlocalall)); 55c4762a1bSJed Brown 565f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterBegin(tolocalall,global,localall,INSERT_VALUES,SCATTER_FORWARD)); 575f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterEnd(tolocalall,global,localall,INSERT_VALUES,SCATTER_FORWARD)); 58c4762a1bSJed Brown 595f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetArray(localall,&vlocal)); 60c4762a1bSJed Brown for (j=0; j<N; j++) { 61c4762a1bSJed Brown for (i=0; i<M; i++) { 62c4762a1bSJed Brown *vlocal++ += i + j*M; 63c4762a1bSJed Brown } 64c4762a1bSJed Brown } 655f80ce2aSJacob Faibussowitsch CHKERRQ(VecRestoreArray(localall,&vlocal)); 66c4762a1bSJed Brown 67c4762a1bSJed Brown /* scatter back to global vector */ 685f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterBegin(fromlocalall,localall,global,INSERT_VALUES,SCATTER_FORWARD)); 695f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterEnd(fromlocalall,localall,global,INSERT_VALUES,SCATTER_FORWARD)); 70c4762a1bSJed Brown 715f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(global,viewer)); 72c4762a1bSJed Brown 73c4762a1bSJed Brown /* Free memory */ 745f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterDestroy(&tolocalall)); 755f80ce2aSJacob Faibussowitsch CHKERRQ(VecScatterDestroy(&fromlocalall)); 765f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&viewer)); 775f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&localall)); 785f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&global)); 795f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&da)); 80*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 81*b122ec5aSJacob Faibussowitsch return 0; 82c4762a1bSJed Brown } 83c4762a1bSJed Brown 84c4762a1bSJed Brown /*TEST 85c4762a1bSJed Brown 86c4762a1bSJed Brown build: 87c4762a1bSJed Brown requires: !complex 88c4762a1bSJed Brown 89c4762a1bSJed Brown test: 90c4762a1bSJed Brown nsize: 3 91c4762a1bSJed Brown 92c4762a1bSJed Brown TEST*/ 93