xref: /petsc/src/dm/tests/ex7.c (revision 030f984af8d8bb4c203755d35bded3c05b3d83ce)
1 
2 static char help[] = "Tests DMLocalToLocalxxx() for DMDA.\n\n";
3 
4 #include <petscdmda.h>
5 
6 int main(int argc,char **argv)
7 {
8   PetscMPIInt      rank;
9   PetscInt         M=8,dof=1,stencil_width=1,i,start,end,P=5,N = 6,m=PETSC_DECIDE,n=PETSC_DECIDE,p=PETSC_DECIDE,pt = 0,st = 0;
10   PetscErrorCode   ierr;
11   PetscBool        flg = PETSC_FALSE,flg2,flg3;
12   DMBoundaryType   periodic;
13   DMDAStencilType  stencil_type;
14   DM               da;
15   Vec              local,global,local_copy;
16   PetscScalar      value;
17   PetscReal        norm,work;
18   PetscViewer      viewer;
19   char             filename[64];
20   FILE             *file;
21 
22   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
23   ierr = PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);CHKERRQ(ierr);
24   ierr = PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);CHKERRQ(ierr);
25   ierr = PetscOptionsGetInt(NULL,NULL,"-dof",&dof,NULL);CHKERRQ(ierr);
26   ierr = PetscOptionsGetInt(NULL,NULL,"-stencil_width",&stencil_width,NULL);CHKERRQ(ierr);
27   ierr = PetscOptionsGetInt(NULL,NULL,"-periodic",&pt,NULL);CHKERRQ(ierr);
28 
29   periodic = (DMBoundaryType) pt;
30 
31   ierr = PetscOptionsGetInt(NULL,NULL,"-stencil_type",&st,NULL);CHKERRQ(ierr);
32 
33   stencil_type = (DMDAStencilType) st;
34 
35   ierr = PetscOptionsHasName(NULL,NULL,"-grid2d",&flg2);CHKERRQ(ierr);
36   ierr = PetscOptionsHasName(NULL,NULL,"-grid3d",&flg3);CHKERRQ(ierr);
37   if (flg2) {
38     ierr = DMDACreate2d(PETSC_COMM_WORLD,periodic,periodic,stencil_type,M,N,m,n,dof,stencil_width,NULL,NULL,&da);CHKERRQ(ierr);
39   } else if (flg3) {
40     ierr = DMDACreate3d(PETSC_COMM_WORLD,periodic,periodic,periodic,stencil_type,M,N,P,m,n,p,dof,stencil_width,NULL,NULL,NULL,&da);CHKERRQ(ierr);
41   } else {
42     ierr = DMDACreate1d(PETSC_COMM_WORLD,periodic,M,dof,stencil_width,NULL,&da);CHKERRQ(ierr);
43   }
44   ierr = DMSetFromOptions(da);CHKERRQ(ierr);
45   ierr = DMSetUp(da);CHKERRQ(ierr);
46 
47   ierr = DMCreateGlobalVector(da,&global);CHKERRQ(ierr);
48   ierr = DMCreateLocalVector(da,&local);CHKERRQ(ierr);
49   ierr = VecDuplicate(local,&local_copy);CHKERRQ(ierr);
50 
51   /* zero out vectors so that ghostpoints are zero */
52   value = 0;
53   ierr  = VecSet(local,value);CHKERRQ(ierr);
54   ierr  = VecSet(local_copy,value);CHKERRQ(ierr);
55 
56   ierr = VecGetOwnershipRange(global,&start,&end);CHKERRQ(ierr);
57   for (i=start; i<end; i++) {
58     value = i + 1;
59     ierr  = VecSetValues(global,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr);
60   }
61   ierr = VecAssemblyBegin(global);CHKERRQ(ierr);
62   ierr = VecAssemblyEnd(global);CHKERRQ(ierr);
63 
64   ierr = DMGlobalToLocalBegin(da,global,INSERT_VALUES,local);CHKERRQ(ierr);
65   ierr = DMGlobalToLocalEnd(da,global,INSERT_VALUES,local);CHKERRQ(ierr);
66 
67   ierr = DMLocalToLocalBegin(da,local,INSERT_VALUES,local_copy);CHKERRQ(ierr);
68   ierr = DMLocalToLocalEnd(da,local,INSERT_VALUES,local_copy);CHKERRQ(ierr);
69 
70   ierr = PetscOptionsGetBool(NULL,NULL,"-save",&flg,NULL);CHKERRQ(ierr);
71   if (flg) {
72     ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
73     sprintf(filename,"local.%d",rank);
74     ierr = PetscViewerASCIIOpen(PETSC_COMM_SELF,filename,&viewer);CHKERRQ(ierr);
75     ierr = PetscViewerASCIIGetPointer(viewer,&file);CHKERRQ(ierr);
76     ierr = VecView(local,viewer);CHKERRQ(ierr);
77     fprintf(file,"Vector with correct ghost points\n");
78     ierr = VecView(local_copy,viewer);CHKERRQ(ierr);
79     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
80   }
81 
82   ierr = VecAXPY(local_copy,-1.0,local);CHKERRQ(ierr);
83   ierr = VecNorm(local_copy,NORM_MAX,&work);CHKERRQ(ierr);
84   ierr = MPI_Allreduce(&work,&norm,1,MPIU_REAL,MPIU_MAX,PETSC_COMM_WORLD);CHKERRMPI(ierr);
85   ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of difference %g should be zero\n",(double)norm);CHKERRQ(ierr);
86 
87   ierr = VecDestroy(&local_copy);CHKERRQ(ierr);
88   ierr = VecDestroy(&local);CHKERRQ(ierr);
89   ierr = VecDestroy(&global);CHKERRQ(ierr);
90   ierr = DMDestroy(&da);CHKERRQ(ierr);
91   ierr = PetscFinalize();
92   return ierr;
93 }
94 
95 /*TEST
96 
97    test:
98       nsize: 8
99       args: -dof 3 -stencil_width 2 -M 50 -N 50 -periodic
100 
101    test:
102       suffix: 2
103       nsize: 8
104       args: -dof 3 -stencil_width 2 -M 50 -N 50 -periodic -grid2d
105       output_file: output/ex7_1.out
106 
107    test:
108       suffix: 3
109       nsize: 8
110       args: -dof 3 -stencil_width 2 -M 50 -N 50 -periodic -grid3d
111       output_file: output/ex7_1.out
112 
113 TEST*/
114