1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Tests VecView() contour plotting for 2d DMDAs.\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown /* 5c4762a1bSJed Brown MATLAB must be installed to configure PETSc to have MATLAB engine. 6c4762a1bSJed Brown Unless you have specific important reasons for using the MATLAB engine, we do not 7c4762a1bSJed Brown recommend it. If you want to use MATLAB for visualization and maybe a little post processing 8c4762a1bSJed Brown then you can use the socket viewer and send the data to MATLAB via that. 9c4762a1bSJed Brown 10c4762a1bSJed Brown VecView() on DMDA vectors first puts the Vec elements into global natural ordering before printing (or plotting) 11c4762a1bSJed Brown them. In 2d 5 by 2 DMDA this means the numbering is 12c4762a1bSJed Brown 13c4762a1bSJed Brown 5 6 7 8 9 14c4762a1bSJed Brown 0 1 2 3 4 15c4762a1bSJed Brown 16c4762a1bSJed Brown Now the default split across 2 processors with the DM is (by rank) 17c4762a1bSJed Brown 18c4762a1bSJed Brown 0 0 0 1 1 19c4762a1bSJed Brown 0 0 0 1 1 20c4762a1bSJed Brown 21c4762a1bSJed Brown So the global PETSc ordering is 22c4762a1bSJed Brown 23c4762a1bSJed Brown 3 4 5 8 9 24c4762a1bSJed Brown 0 1 2 6 7 25c4762a1bSJed Brown 26c4762a1bSJed Brown Use the options 27c4762a1bSJed Brown -da_grid_x <nx> - number of grid points in x direction, if M < 0 28c4762a1bSJed Brown -da_grid_y <ny> - number of grid points in y direction, if N < 0 29c4762a1bSJed Brown -da_processors_x <MX> number of processors in x directio 30c4762a1bSJed Brown -da_processors_y <MY> number of processors in x direction 31c4762a1bSJed Brown */ 32c4762a1bSJed Brown 33c4762a1bSJed Brown #include <petscdm.h> 34c4762a1bSJed Brown #include <petscdmda.h> 35c4762a1bSJed Brown 36c4762a1bSJed Brown int main(int argc,char **argv) 37c4762a1bSJed Brown { 38c4762a1bSJed Brown PetscMPIInt rank; 39c4762a1bSJed Brown PetscInt M = 10,N = 8; 40c4762a1bSJed Brown PetscBool flg = PETSC_FALSE; 41c4762a1bSJed Brown DM da; 42c4762a1bSJed Brown PetscViewer viewer; 43c4762a1bSJed Brown Vec local,global; 44c4762a1bSJed Brown PetscScalar value; 45c4762a1bSJed Brown DMBoundaryType bx = DM_BOUNDARY_NONE,by = DM_BOUNDARY_NONE; 46c4762a1bSJed Brown DMDAStencilType stype = DMDA_STENCIL_BOX; 47c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE) 48c4762a1bSJed Brown PetscViewer mviewer; 49c4762a1bSJed Brown PetscMPIInt size; 50c4762a1bSJed Brown #endif 51c4762a1bSJed Brown 52*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc,&argv,(char*)0,help)); 535f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDrawOpen(PETSC_COMM_WORLD,0,"",300,0,300,300,&viewer)); 54c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE) 555f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 56c4762a1bSJed Brown if (size == 1) { 575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerMatlabOpen(PETSC_COMM_WORLD,"tmp.mat",FILE_MODE_WRITE,&mviewer)); 58c4762a1bSJed Brown } 59c4762a1bSJed Brown #endif 60c4762a1bSJed Brown 615f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-star_stencil",&flg,NULL)); 62c4762a1bSJed Brown if (flg) stype = DMDA_STENCIL_STAR; 63c4762a1bSJed Brown 64c4762a1bSJed Brown /* Create distributed array and get vectors */ 655f80ce2aSJacob Faibussowitsch CHKERRQ(DMDACreate2d(PETSC_COMM_WORLD,bx,by,stype,M,N,PETSC_DECIDE,PETSC_DECIDE,1,1,NULL,NULL,&da)); 665f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetFromOptions(da)); 675f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetUp(da)); 685f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(da,&global)); 695f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateLocalVector(da,&local)); 70c4762a1bSJed Brown 71c4762a1bSJed Brown value = -3.0; 725f80ce2aSJacob Faibussowitsch CHKERRQ(VecSet(global,value)); 735f80ce2aSJacob Faibussowitsch CHKERRQ(DMGlobalToLocalBegin(da,global,INSERT_VALUES,local)); 745f80ce2aSJacob Faibussowitsch CHKERRQ(DMGlobalToLocalEnd(da,global,INSERT_VALUES,local)); 75c4762a1bSJed Brown 765f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 77c4762a1bSJed Brown value = rank+1; 785f80ce2aSJacob Faibussowitsch CHKERRQ(VecScale(local,value)); 795f80ce2aSJacob Faibussowitsch CHKERRQ(DMLocalToGlobalBegin(da,local,ADD_VALUES,global)); 805f80ce2aSJacob Faibussowitsch CHKERRQ(DMLocalToGlobalEnd(da,local,ADD_VALUES,global)); 81c4762a1bSJed Brown 82c4762a1bSJed Brown flg = PETSC_FALSE; 835f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL, "-view_global", &flg,NULL)); 84c4762a1bSJed Brown if (flg) { /* view global vector in natural ordering */ 855f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(global,PETSC_VIEWER_STDOUT_WORLD)); 86c4762a1bSJed Brown } 875f80ce2aSJacob Faibussowitsch CHKERRQ(DMView(da,viewer)); 885f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(global,viewer)); 89c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE) 90c4762a1bSJed Brown if (size == 1) { 915f80ce2aSJacob Faibussowitsch CHKERRQ(DMView(da,mviewer)); 925f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(global,mviewer)); 93c4762a1bSJed Brown } 94c4762a1bSJed Brown #endif 95c4762a1bSJed Brown 96c4762a1bSJed Brown /* Free memory */ 97c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE) 98c4762a1bSJed Brown if (size == 1) { 995f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&mviewer)); 100c4762a1bSJed Brown } 101c4762a1bSJed Brown #endif 1025f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&viewer)); 1035f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&local)); 1045f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&global)); 1055f80ce2aSJacob Faibussowitsch CHKERRQ(DMDestroy(&da)); 106*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 107*b122ec5aSJacob Faibussowitsch return 0; 108c4762a1bSJed Brown } 109c4762a1bSJed Brown 110c4762a1bSJed Brown /*TEST 111c4762a1bSJed Brown 112c4762a1bSJed Brown test: 113c4762a1bSJed Brown requires: x 114c4762a1bSJed Brown nsize: 2 115c4762a1bSJed Brown args: -nox 116c4762a1bSJed Brown 117c4762a1bSJed Brown TEST*/ 118