xref: /petsc/src/dm/tutorials/ex1.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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 
36*d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
37*d71ae5a4SJacob Faibussowitsch {
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;
47d1e78c4fSBarry Smith #if defined(PETSC_HAVE_MATLAB)
48c4762a1bSJed Brown   PetscViewer mviewer;
49c4762a1bSJed Brown   PetscMPIInt size;
50c4762a1bSJed Brown #endif
51c4762a1bSJed Brown 
52327415f7SBarry Smith   PetscFunctionBeginUser;
539566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
549566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawOpen(PETSC_COMM_WORLD, 0, "", 300, 0, 300, 300, &viewer));
55d1e78c4fSBarry Smith #if defined(PETSC_HAVE_MATLAB)
569566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
5748a46eb9SPierre Jolivet   if (size == 1) PetscCall(PetscViewerMatlabOpen(PETSC_COMM_WORLD, "tmp.mat", FILE_MODE_WRITE, &mviewer));
58c4762a1bSJed Brown #endif
59c4762a1bSJed Brown 
609566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-star_stencil", &flg, NULL));
61c4762a1bSJed Brown   if (flg) stype = DMDA_STENCIL_STAR;
62c4762a1bSJed Brown 
63c4762a1bSJed Brown   /* Create distributed array and get vectors */
649566063dSJacob Faibussowitsch   PetscCall(DMDACreate2d(PETSC_COMM_WORLD, bx, by, stype, M, N, PETSC_DECIDE, PETSC_DECIDE, 1, 1, NULL, NULL, &da));
659566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(da));
669566063dSJacob Faibussowitsch   PetscCall(DMSetUp(da));
679566063dSJacob Faibussowitsch   PetscCall(DMCreateGlobalVector(da, &global));
689566063dSJacob Faibussowitsch   PetscCall(DMCreateLocalVector(da, &local));
69c4762a1bSJed Brown 
70c4762a1bSJed Brown   value = -3.0;
719566063dSJacob Faibussowitsch   PetscCall(VecSet(global, value));
729566063dSJacob Faibussowitsch   PetscCall(DMGlobalToLocalBegin(da, global, INSERT_VALUES, local));
739566063dSJacob Faibussowitsch   PetscCall(DMGlobalToLocalEnd(da, global, INSERT_VALUES, local));
74c4762a1bSJed Brown 
759566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
76c4762a1bSJed Brown   value = rank + 1;
779566063dSJacob Faibussowitsch   PetscCall(VecScale(local, value));
789566063dSJacob Faibussowitsch   PetscCall(DMLocalToGlobalBegin(da, local, ADD_VALUES, global));
799566063dSJacob Faibussowitsch   PetscCall(DMLocalToGlobalEnd(da, local, ADD_VALUES, global));
80c4762a1bSJed Brown 
81c4762a1bSJed Brown   flg = PETSC_FALSE;
829566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-view_global", &flg, NULL));
83c4762a1bSJed Brown   if (flg) { /* view global vector in natural ordering */
849566063dSJacob Faibussowitsch     PetscCall(VecView(global, PETSC_VIEWER_STDOUT_WORLD));
85c4762a1bSJed Brown   }
869566063dSJacob Faibussowitsch   PetscCall(DMView(da, viewer));
879566063dSJacob Faibussowitsch   PetscCall(VecView(global, viewer));
88d1e78c4fSBarry Smith #if defined(PETSC_HAVE_MATLAB)
89c4762a1bSJed Brown   if (size == 1) {
909566063dSJacob Faibussowitsch     PetscCall(DMView(da, mviewer));
919566063dSJacob Faibussowitsch     PetscCall(VecView(global, mviewer));
92c4762a1bSJed Brown   }
93c4762a1bSJed Brown #endif
94c4762a1bSJed Brown 
95c4762a1bSJed Brown   /* Free memory */
96d1e78c4fSBarry Smith #if defined(PETSC_HAVE_MATLAB)
9748a46eb9SPierre Jolivet   if (size == 1) PetscCall(PetscViewerDestroy(&mviewer));
98c4762a1bSJed Brown #endif
999566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&viewer));
1009566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&local));
1019566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&global));
1029566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&da));
1039566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
104b122ec5aSJacob Faibussowitsch   return 0;
105c4762a1bSJed Brown }
106c4762a1bSJed Brown 
107c4762a1bSJed Brown /*TEST
108c4762a1bSJed Brown 
109c4762a1bSJed Brown    test:
110c4762a1bSJed Brown       requires: x
111c4762a1bSJed Brown       nsize: 2
112c4762a1bSJed Brown       args: -nox
113c4762a1bSJed Brown 
114c4762a1bSJed Brown TEST*/
115