xref: /petsc/src/dm/tutorials/ex1.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
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   PetscErrorCode   ierr;
41c4762a1bSJed Brown   PetscBool        flg = PETSC_FALSE;
42c4762a1bSJed Brown   DM               da;
43c4762a1bSJed Brown   PetscViewer      viewer;
44c4762a1bSJed Brown   Vec              local,global;
45c4762a1bSJed Brown   PetscScalar      value;
46c4762a1bSJed Brown   DMBoundaryType   bx    = DM_BOUNDARY_NONE,by = DM_BOUNDARY_NONE;
47c4762a1bSJed Brown   DMDAStencilType  stype = DMDA_STENCIL_BOX;
48c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE)
49c4762a1bSJed Brown   PetscViewer      mviewer;
50c4762a1bSJed Brown   PetscMPIInt      size;
51c4762a1bSJed Brown #endif
52c4762a1bSJed Brown 
53c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
54*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDrawOpen(PETSC_COMM_WORLD,0,"",300,0,300,300,&viewer));
55c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE)
56*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size));
57c4762a1bSJed Brown   if (size == 1) {
58*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerMatlabOpen(PETSC_COMM_WORLD,"tmp.mat",FILE_MODE_WRITE,&mviewer));
59c4762a1bSJed Brown   }
60c4762a1bSJed Brown #endif
61c4762a1bSJed Brown 
62*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-star_stencil",&flg,NULL));
63c4762a1bSJed Brown   if (flg) stype = DMDA_STENCIL_STAR;
64c4762a1bSJed Brown 
65c4762a1bSJed Brown   /* Create distributed array and get vectors */
66*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDACreate2d(PETSC_COMM_WORLD,bx,by,stype,M,N,PETSC_DECIDE,PETSC_DECIDE,1,1,NULL,NULL,&da));
67*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetFromOptions(da));
68*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetUp(da));
69*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreateGlobalVector(da,&global));
70*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCreateLocalVector(da,&local));
71c4762a1bSJed Brown 
72c4762a1bSJed Brown   value = -3.0;
73*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecSet(global,value));
74*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGlobalToLocalBegin(da,global,INSERT_VALUES,local));
75*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGlobalToLocalEnd(da,global,INSERT_VALUES,local));
76c4762a1bSJed Brown 
77*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank));
78c4762a1bSJed Brown   value = rank+1;
79*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecScale(local,value));
80*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLocalToGlobalBegin(da,local,ADD_VALUES,global));
81*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMLocalToGlobalEnd(da,local,ADD_VALUES,global));
82c4762a1bSJed Brown 
83c4762a1bSJed Brown   flg  = PETSC_FALSE;
84*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL, "-view_global", &flg,NULL));
85c4762a1bSJed Brown   if (flg) { /* view global vector in natural ordering */
86*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecView(global,PETSC_VIEWER_STDOUT_WORLD));
87c4762a1bSJed Brown   }
88*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMView(da,viewer));
89*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecView(global,viewer));
90c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE)
91c4762a1bSJed Brown   if (size == 1) {
92*5f80ce2aSJacob Faibussowitsch     CHKERRQ(DMView(da,mviewer));
93*5f80ce2aSJacob Faibussowitsch     CHKERRQ(VecView(global,mviewer));
94c4762a1bSJed Brown   }
95c4762a1bSJed Brown #endif
96c4762a1bSJed Brown 
97c4762a1bSJed Brown   /* Free memory */
98c4762a1bSJed Brown #if defined(PETSC_HAVE_MATLAB_ENGINE)
99c4762a1bSJed Brown   if (size == 1) {
100*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&mviewer));
101c4762a1bSJed Brown   }
102c4762a1bSJed Brown #endif
103*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDestroy(&viewer));
104*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&local));
105*5f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&global));
106*5f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&da));
107c4762a1bSJed Brown   ierr = PetscFinalize();
108c4762a1bSJed Brown   return ierr;
109c4762a1bSJed Brown }
110c4762a1bSJed Brown 
111c4762a1bSJed Brown /*TEST
112c4762a1bSJed Brown 
113c4762a1bSJed Brown    test:
114c4762a1bSJed Brown       requires: x
115c4762a1bSJed Brown       nsize: 2
116c4762a1bSJed Brown       args: -nox
117c4762a1bSJed Brown 
118c4762a1bSJed Brown TEST*/
119