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