xref: /petsc/src/dm/tests/ex11.c (revision 6a98f8dc3f2c9149905a87dc2e9d0fedaf64e09a)
1 
2 static char help[] = "Tests various 2-dimensional DMDA routines.\n\n";
3 
4 #include <petscdmda.h>
5 #include <petscdraw.h>
6 
7 int main(int argc,char **argv)
8 {
9   PetscInt       M = 10,N = 8,dof=1,s=1,bx=0,by=0,i,n,j,k,m,wrap,xs,ys;
10   PetscErrorCode ierr;
11   DM             da,dac;
12   PetscViewer    viewer;
13   Vec            local,global,coors;
14   PetscScalar    ***xy,***aglobal;
15   PetscDraw      draw;
16   char           fname[32];
17 
18   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
19   /* Create viewers */
20   ierr = PetscViewerDrawOpen(PETSC_COMM_WORLD,0,"",PETSC_DECIDE,PETSC_DECIDE,600,200,&viewer);CHKERRQ(ierr);
21   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
22   ierr = PetscDrawSetDoubleBuffer(draw);CHKERRQ(ierr);
23 
24   /* Read options */
25   ierr = PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);CHKERRQ(ierr);
26   ierr = PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);CHKERRQ(ierr);
27   ierr = PetscOptionsGetInt(NULL,NULL,"-dof",&dof,NULL);CHKERRQ(ierr);
28   ierr = PetscOptionsGetInt(NULL,NULL,"-s",&s,NULL);CHKERRQ(ierr);
29   ierr = PetscOptionsGetInt(NULL,NULL,"-periodic_x",&wrap,NULL);CHKERRQ(ierr);
30   ierr = PetscOptionsGetInt(NULL,NULL,"-periodic_y",&wrap,NULL);CHKERRQ(ierr);
31 
32   /* Create distributed array and get vectors */
33   ierr = DMDACreate2d(PETSC_COMM_WORLD,(DMBoundaryType)bx,(DMBoundaryType)by,DMDA_STENCIL_BOX,M,N,PETSC_DECIDE,PETSC_DECIDE,dof,s,NULL,NULL,&da);CHKERRQ(ierr);
34   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
35   ierr = DMSetUp(da);CHKERRQ(ierr);
36   ierr = DMDASetUniformCoordinates(da,0.0,1.0,0.0,1.0,0.0,0.0);CHKERRQ(ierr);
37   for (i=0; i<dof; i++) {
38     sprintf(fname,"Field %d",(int)i);
39     ierr = DMDASetFieldName(da,i,fname);CHKERRQ(ierr);
40   }
41 
42   ierr = DMView(da,viewer);CHKERRQ(ierr);
43   ierr = DMCreateGlobalVector(da,&global);CHKERRQ(ierr);
44   ierr = DMCreateLocalVector(da,&local);CHKERRQ(ierr);
45   ierr = DMGetCoordinates(da,&coors);CHKERRQ(ierr);
46   ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
47 
48   /* Set values into global vectors */
49   ierr = DMDAVecGetArrayDOFRead(dac,coors,&xy);CHKERRQ(ierr);
50   ierr = DMDAVecGetArrayDOF(da,global,&aglobal);CHKERRQ(ierr);
51   ierr = DMDAGetCorners(da,&xs,&ys,0,&m,&n,0);CHKERRQ(ierr);
52   for (k=0; k<dof; k++) {
53     for (j=ys; j<ys+n; j++) {
54       for (i=xs; i<xs+m; i++) {
55         aglobal[j][i][k] = PetscSinScalar(2.0*PETSC_PI*(k+1)*xy[j][i][0]);
56       }
57     }
58   }
59   ierr = DMDAVecRestoreArrayDOF(da,global,&aglobal);CHKERRQ(ierr);
60   ierr = DMDAVecRestoreArrayDOFRead(dac,coors,&xy);CHKERRQ(ierr);
61   ierr = DMGlobalToLocalBegin(da,global,INSERT_VALUES,local);CHKERRQ(ierr);
62   ierr = DMGlobalToLocalEnd(da,global,INSERT_VALUES,local);CHKERRQ(ierr);
63 
64   ierr = VecSet(global,0.0);CHKERRQ(ierr);
65   ierr = DMLocalToGlobalBegin(da,local,INSERT_VALUES,global);CHKERRQ(ierr);
66   ierr = DMLocalToGlobalEnd(da,local,INSERT_VALUES,global);CHKERRQ(ierr);
67   ierr = VecView(global,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
68   ierr = VecView(global,viewer);CHKERRQ(ierr);
69 
70   /* Free memory */
71   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
72   ierr = VecDestroy(&global);CHKERRQ(ierr);
73   ierr = VecDestroy(&local);CHKERRQ(ierr);
74   ierr = DMDestroy(&da);CHKERRQ(ierr);
75   ierr = PetscFinalize();
76   return ierr;
77 }
78 
79 /*TEST
80 
81    test:
82       args: -dof 2
83       filter: grep -v -i Object
84       requires: x
85 
86    test:
87       suffix: 2
88       nsize: 2
89       args: -dof 2
90       filter: grep -v -i Object
91       requires: x
92 
93    test:
94       suffix: 3
95       nsize: 3
96       args: -dof 2
97       filter: grep -v -i Object
98       requires: x
99 
100 TEST*/
101