xref: /petsc/src/dm/tutorials/ex1.c (revision 609caa7c8c030312b00807b4f015fd827bb80932)
1c4762a1bSJed Brown static char help[] = "Tests VecView() contour plotting for 2d DMDAs.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown /*
4c4762a1bSJed Brown   MATLAB must be installed to configure PETSc to have MATLAB engine.
5c4762a1bSJed Brown Unless you have specific important reasons for using the MATLAB engine, we do not
6c4762a1bSJed Brown recommend it. If you want to use MATLAB for visualization and maybe a little post processing
7c4762a1bSJed Brown then you can use the socket viewer and send the data to MATLAB via that.
8c4762a1bSJed Brown 
9c4762a1bSJed Brown   VecView() on DMDA vectors first puts the Vec elements into global natural ordering before printing (or plotting)
10c4762a1bSJed Brown them. In 2d 5 by 2 DMDA this means the numbering is
11c4762a1bSJed Brown 
12c4762a1bSJed Brown      5  6   7   8   9
13c4762a1bSJed Brown      0  1   2   3   4
14c4762a1bSJed Brown 
15c4762a1bSJed Brown Now the default split across 2 processors with the DM  is (by rank)
16c4762a1bSJed Brown 
17c4762a1bSJed Brown     0  0   0  1   1
18c4762a1bSJed Brown     0  0   0  1   1
19c4762a1bSJed Brown 
20c4762a1bSJed Brown So the global PETSc ordering is
21c4762a1bSJed Brown 
22c4762a1bSJed Brown     3  4  5   8  9
23c4762a1bSJed Brown     0  1  2   6  7
24c4762a1bSJed Brown 
25c4762a1bSJed Brown Use the options
26c4762a1bSJed Brown      -da_grid_x <nx> - number of grid points in x direction, if M < 0
27c4762a1bSJed Brown      -da_grid_y <ny> - number of grid points in y direction, if N < 0
28c4762a1bSJed Brown      -da_processors_x <MX> number of processors in x directio
29c4762a1bSJed Brown      -da_processors_y <MY> number of processors in x direction
30c4762a1bSJed Brown */
31c4762a1bSJed Brown 
32c4762a1bSJed Brown #include <petscdm.h>
33c4762a1bSJed Brown #include <petscdmda.h>
34c4762a1bSJed Brown 
main(int argc,char ** argv)35d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
36d71ae5a4SJacob Faibussowitsch {
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;
46d1e78c4fSBarry Smith #if defined(PETSC_HAVE_MATLAB)
47c4762a1bSJed Brown   PetscViewer mviewer;
48c4762a1bSJed Brown   PetscMPIInt size;
49c4762a1bSJed Brown #endif
50c4762a1bSJed Brown 
51327415f7SBarry Smith   PetscFunctionBeginUser;
52c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
539566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawOpen(PETSC_COMM_WORLD, 0, "", 300, 0, 300, 300, &viewer));
54d1e78c4fSBarry Smith #if defined(PETSC_HAVE_MATLAB)
559566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
5648a46eb9SPierre 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));
87d1e78c4fSBarry Smith #if defined(PETSC_HAVE_MATLAB)
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 */
95d1e78c4fSBarry Smith #if defined(PETSC_HAVE_MATLAB)
9648a46eb9SPierre 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
112*3886731fSPierre Jolivet       output_file: output/empty.out
113c4762a1bSJed Brown 
114c4762a1bSJed Brown TEST*/
115