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 369371c9d4SSatish Balay int main(int argc, char **argv) { 37c4762a1bSJed Brown PetscMPIInt rank; 38c4762a1bSJed Brown PetscInt M = 10, N = 8; 39c4762a1bSJed Brown PetscBool flg = PETSC_FALSE; 40c4762a1bSJed Brown DM da; 41c4762a1bSJed Brown PetscViewer viewer; 42c4762a1bSJed Brown Vec local, global; 43c4762a1bSJed Brown PetscScalar value; 44c4762a1bSJed Brown DMBoundaryType bx = DM_BOUNDARY_NONE, by = DM_BOUNDARY_NONE; 45c4762a1bSJed Brown DMDAStencilType stype = DMDA_STENCIL_BOX; 46c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE) 47c4762a1bSJed Brown PetscViewer mviewer; 48c4762a1bSJed Brown PetscMPIInt size; 49c4762a1bSJed Brown #endif 50c4762a1bSJed Brown 51327415f7SBarry Smith PetscFunctionBeginUser; 529566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 539566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawOpen(PETSC_COMM_WORLD, 0, "", 300, 0, 300, 300, &viewer)); 54c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE) 559566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 56*48a46eb9SPierre Jolivet if (size == 1) PetscCall(PetscViewerMatlabOpen(PETSC_COMM_WORLD, "tmp.mat", FILE_MODE_WRITE, &mviewer)); 57c4762a1bSJed Brown #endif 58c4762a1bSJed Brown 599566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-star_stencil", &flg, NULL)); 60c4762a1bSJed Brown if (flg) stype = DMDA_STENCIL_STAR; 61c4762a1bSJed Brown 62c4762a1bSJed Brown /* Create distributed array and get vectors */ 639566063dSJacob Faibussowitsch PetscCall(DMDACreate2d(PETSC_COMM_WORLD, bx, by, stype, M, N, PETSC_DECIDE, PETSC_DECIDE, 1, 1, NULL, NULL, &da)); 649566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da)); 659566063dSJacob Faibussowitsch PetscCall(DMSetUp(da)); 669566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da, &global)); 679566063dSJacob Faibussowitsch PetscCall(DMCreateLocalVector(da, &local)); 68c4762a1bSJed Brown 69c4762a1bSJed Brown value = -3.0; 709566063dSJacob Faibussowitsch PetscCall(VecSet(global, value)); 719566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalBegin(da, global, INSERT_VALUES, local)); 729566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalEnd(da, global, INSERT_VALUES, local)); 73c4762a1bSJed Brown 749566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 75c4762a1bSJed Brown value = rank + 1; 769566063dSJacob Faibussowitsch PetscCall(VecScale(local, value)); 779566063dSJacob Faibussowitsch PetscCall(DMLocalToGlobalBegin(da, local, ADD_VALUES, global)); 789566063dSJacob Faibussowitsch PetscCall(DMLocalToGlobalEnd(da, local, ADD_VALUES, global)); 79c4762a1bSJed Brown 80c4762a1bSJed Brown flg = PETSC_FALSE; 819566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-view_global", &flg, NULL)); 82c4762a1bSJed Brown if (flg) { /* view global vector in natural ordering */ 839566063dSJacob Faibussowitsch PetscCall(VecView(global, PETSC_VIEWER_STDOUT_WORLD)); 84c4762a1bSJed Brown } 859566063dSJacob Faibussowitsch PetscCall(DMView(da, viewer)); 869566063dSJacob Faibussowitsch PetscCall(VecView(global, viewer)); 87c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE) 88c4762a1bSJed Brown if (size == 1) { 899566063dSJacob Faibussowitsch PetscCall(DMView(da, mviewer)); 909566063dSJacob Faibussowitsch PetscCall(VecView(global, mviewer)); 91c4762a1bSJed Brown } 92c4762a1bSJed Brown #endif 93c4762a1bSJed Brown 94c4762a1bSJed Brown /* Free memory */ 95c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE) 96*48a46eb9SPierre Jolivet if (size == 1) PetscCall(PetscViewerDestroy(&mviewer)); 97c4762a1bSJed Brown #endif 989566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 999566063dSJacob Faibussowitsch PetscCall(VecDestroy(&local)); 1009566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global)); 1019566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da)); 1029566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 103b122ec5aSJacob Faibussowitsch return 0; 104c4762a1bSJed Brown } 105c4762a1bSJed Brown 106c4762a1bSJed Brown /*TEST 107c4762a1bSJed Brown 108c4762a1bSJed Brown test: 109c4762a1bSJed Brown requires: x 110c4762a1bSJed Brown nsize: 2 111c4762a1bSJed Brown args: -nox 112c4762a1bSJed Brown 113c4762a1bSJed Brown TEST*/ 114