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 52 /* zero out vectors so that ghostpoints are zero */ 53 value = 0; 54 ierr = VecSet(local,value);CHKERRQ(ierr); 55 ierr = VecSet(local_copy,value);CHKERRQ(ierr); 56 57 ierr = VecGetOwnershipRange(global,&start,&end);CHKERRQ(ierr); 58 for (i=start; i<end; i++) { 59 value = i + 1; 60 ierr = VecSetValues(global,1,&i,&value,INSERT_VALUES);CHKERRQ(ierr); 61 } 62 ierr = VecAssemblyBegin(global);CHKERRQ(ierr); 63 ierr = VecAssemblyEnd(global);CHKERRQ(ierr); 64 65 ierr = DMGlobalToLocalBegin(da,global,INSERT_VALUES,local);CHKERRQ(ierr); 66 ierr = DMGlobalToLocalEnd(da,global,INSERT_VALUES,local);CHKERRQ(ierr); 67 68 69 ierr = DMLocalToLocalBegin(da,local,INSERT_VALUES,local_copy);CHKERRQ(ierr); 70 ierr = DMLocalToLocalEnd(da,local,INSERT_VALUES,local_copy);CHKERRQ(ierr); 71 72 73 ierr = PetscOptionsGetBool(NULL,NULL,"-save",&flg,NULL);CHKERRQ(ierr); 74 if (flg) { 75 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 76 sprintf(filename,"local.%d",rank); 77 ierr = PetscViewerASCIIOpen(PETSC_COMM_SELF,filename,&viewer);CHKERRQ(ierr); 78 ierr = PetscViewerASCIIGetPointer(viewer,&file);CHKERRQ(ierr); 79 ierr = VecView(local,viewer);CHKERRQ(ierr); 80 fprintf(file,"Vector with correct ghost points\n"); 81 ierr = VecView(local_copy,viewer);CHKERRQ(ierr); 82 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 83 } 84 85 ierr = VecAXPY(local_copy,-1.0,local);CHKERRQ(ierr); 86 ierr = VecNorm(local_copy,NORM_MAX,&work);CHKERRQ(ierr); 87 ierr = MPI_Allreduce(&work,&norm,1,MPIU_REAL,MPIU_MAX,PETSC_COMM_WORLD);CHKERRQ(ierr); 88 ierr = PetscPrintf(PETSC_COMM_WORLD,"Norm of difference %g should be zero\n",(double)norm);CHKERRQ(ierr); 89 90 ierr = VecDestroy(&local_copy);CHKERRQ(ierr); 91 ierr = VecDestroy(&local);CHKERRQ(ierr); 92 ierr = VecDestroy(&global);CHKERRQ(ierr); 93 ierr = DMDestroy(&da);CHKERRQ(ierr); 94 ierr = PetscFinalize(); 95 return ierr; 96 } 97 98 99 /*TEST 100 101 test: 102 nsize: 8 103 args: -dof 3 -stencil_width 2 -M 50 -N 50 -periodic 104 105 test: 106 suffix: 2 107 nsize: 8 108 args: -dof 3 -stencil_width 2 -M 50 -N 50 -periodic -grid2d 109 output_file: output/ex7_1.out 110 111 test: 112 suffix: 3 113 nsize: 8 114 args: -dof 3 -stencil_width 2 -M 50 -N 50 -periodic -grid3d 115 output_file: output/ex7_1.out 116 117 TEST*/ 118