Actual source code: ex9.c

petsc-3.11.0 2019-03-29
Report Typos and Errors
  1: static char help[] = "Test DMStag 3d star stencil\n\n";
  2:  #include <petscdm.h>
  3:  #include <petscdmstag.h>

  5: int main(int argc,char **argv)
  6: {
  7:   PetscErrorCode  ierr;
  8:   DM              dm;
  9:   Vec             vec,vecLocal1,vecLocal2;
 10:   PetscScalar     *a,****a1,****a2,expected,sum;
 11:   PetscInt        startx,starty,startz,nx,ny,nz,i,j,k,d,is,js,ks,dof0,dof1,dof2,dof3,dofTotal,stencilWidth,ngx,ngy,ngz;
 12:   DMBoundaryType  boundaryTypex,boundaryTypey,boundaryTypez;
 13:   PetscMPIInt     rank;

 15:   PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
 16:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 17:   dof0 = 1;
 18:   dof1 = 1;
 19:   dof2 = 1;
 20:   dof3 = 1;
 21:   stencilWidth = 2;
 22:   DMStagCreate3d(PETSC_COMM_WORLD,DM_BOUNDARY_PERIODIC,DM_BOUNDARY_PERIODIC,DM_BOUNDARY_PERIODIC,4,4,4,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,dof0,dof1,dof2,dof3,DMSTAG_STENCIL_STAR,stencilWidth,NULL,NULL,NULL,&dm);
 23:   DMSetFromOptions(dm);
 24:   DMSetUp(dm);
 25:   DMStagGetDOF(dm,&dof0,&dof1,&dof2,&dof3);
 26:   dofTotal = dof0 + 3*dof1 + 3*dof2 + dof3;
 27:   DMStagGetStencilWidth(dm,&stencilWidth);

 29:   DMCreateLocalVector(dm,&vecLocal1);
 30:   VecDuplicate(vecLocal1,&vecLocal2);

 32:   DMCreateGlobalVector(dm,&vec);
 33:   VecSet(vec,1.0);
 34:   VecSet(vecLocal1,0.0);
 35:   DMGlobalToLocalBegin(dm,vec,INSERT_VALUES,vecLocal1);
 36:   DMGlobalToLocalEnd(dm,vec,INSERT_VALUES,vecLocal1);

 38:   DMStagGetCorners(dm,&startx,&starty,&startz,&nx,&ny,&nz,NULL,NULL,NULL);
 39:   DMStagVecGetArrayDOFRead(dm,vecLocal1,&a1);
 40:   DMStagVecGetArrayDOF(dm,vecLocal2,&a2);
 41:   for (k=startz; k<startz + nz; ++k) {
 42:     for (j=starty; j<starty + ny; ++j) {
 43:       for (i=startx; i<startx + nx; ++i) {
 44:         for (d=0; d<dofTotal; ++d) {
 45:           if (a1[k][j][i][d] != 1.0) {
 46:             PetscPrintf(PETSC_COMM_SELF,"[%d] Unexpected value %g (expecting %g)\n",rank,a1[k][j][i][d],1.0);
 47:           }
 48:           a2[k][j][i][d] = 0.0;
 49:           for (ks = -stencilWidth; ks <= stencilWidth; ++ks) {
 50:             a2[k][j][i][d] += a1[k+ks][j][i][d];
 51:           }
 52:           for (js = -stencilWidth; js <= stencilWidth; ++js) {
 53:             a2[k][j][i][d] += a1[k][j+js][i][d];
 54:           }
 55:           for (is = -stencilWidth; is <= stencilWidth; ++is) {
 56:             a2[k][j][i][d] += a1[k][j][i+is][d];
 57:           }
 58:             a2[k][j][i][d] -= 2.0*a1[k][j][i][d];
 59:         }
 60:       }
 61:     }
 62:   }
 63:   DMStagVecRestoreArrayDOFRead(dm,vecLocal1,&a1);
 64:   DMStagVecRestoreArrayDOF(dm,vecLocal2,&a2);

 66:   DMLocalToGlobalBegin(dm,vecLocal2,INSERT_VALUES,vec);
 67:   DMLocalToGlobalEnd(dm,vecLocal2,INSERT_VALUES,vec);

 69:   /* For the all-periodic case, some additional checks */
 70:   DMStagGetBoundaryTypes(dm,&boundaryTypex,&boundaryTypey,&boundaryTypez);
 71:   if (boundaryTypex == DM_BOUNDARY_PERIODIC && boundaryTypey == DM_BOUNDARY_PERIODIC && boundaryTypez == DM_BOUNDARY_PERIODIC) {

 73:     DMStagGetGhostCorners(dm,NULL,NULL,NULL,&ngx,&ngy,&ngz);
 74:     expected = (ngx*ngy*ngz - 8*stencilWidth*stencilWidth*stencilWidth - 4*stencilWidth*stencilWidth*(nx + ny + nz))*dofTotal;
 75:     VecSum(vecLocal1,&sum);
 76:     if (sum != expected) {
 77:       PetscPrintf(PETSC_COMM_SELF,"[%d] Unexpected sum of local entries %g (expected %g)\n",rank,sum,expected);
 78:     }

 80:     VecGetArray(vec,&a);
 81:     expected = 1 + 6*stencilWidth;
 82:     for (i=0; i<nz*ny*nx*dofTotal; ++i) {
 83:       if (a[i] != expected) {
 84:         PetscPrintf(PETSC_COMM_SELF,"[%d] Unexpected value %g (expecting %g)\n",rank,a[i],expected);
 85:       }
 86:     }
 87:     VecRestoreArray(vec,&a);
 88:   }

 90:   VecDestroy(&vec);
 91:   VecDestroy(&vecLocal1);
 92:   VecDestroy(&vecLocal2);
 93:   DMDestroy(&dm);
 94:   PetscFinalize();
 95:   return ierr;
 96: }

 98: /*TEST

100:    test:
101:       suffix: 1
102:       nsize: 8
103:       args: -stag_ranks_x 2 -stag_ranks_y 2 -stag_ranks_z 2 -stag_stencil_width 1

105:    test:
106:       suffix: 2
107:       nsize: 12
108:       args: -stag_ranks_x 3 -stag_ranks_y 2 -stag_ranks_z 2 -stag_dof_0 2 -stag_grid_x 6

110:    test:
111:       suffix: 3
112:       nsize: 8
113:       args: -stag_dof_0 3 -stag_dof_1 2 -stag_dof_2 4 -stag_dof_3 2 -stag_stencil_width 3 -stag_grid_x 6 -stag_grid_y 6 -stag_grid_z 7

115:    test:
116:       suffix: 4
117:       nsize: 8
118:       args: -stag_stencil_width 1 -stag_grid_x 2 -stag_grid_y 2 -stag_grid_z 2 -stag_boundary_type_x ghosted

120:    test:
121:       suffix: 5
122:       nsize: 8
123:       args: -stag_stencil_width 1 -stag_grid_x 2 -stag_grid_y 2 -stag_grid_z 2 -stag_boundary_type_y ghosted

125:    test:
126:       suffix: 6
127:       nsize: 8
128:       args: -stag_stencil_width 1 -stag_grid_x 2 -stag_grid_y 2 -stag_grid_z 2 -stag_boundary_type_z ghosted -stag_dof_0 2 -stag_dof_1 3 -stag_dof_2 2 -stag_dof_3 2

130:    test:
131:       suffix: 7
132:       nsize: 8
133:       args: -stag_stencil_width 1 -stag_grid_x 3 -stag_grid_y 2 -stag_grid_z 2 -stag_boundary_type_x ghosted -stag_boundary_type_y ghosted

135:    test:
136:       suffix: 8
137:       nsize: 8
138:       args: -stag_stencil_width 1 -stag_grid_x 2 -stag_grid_y 5 -stag_grid_z 2 -stag_boundary_type_x ghosted -stag_boundary_type_z ghosted

140:    test:
141:       suffix: 9
142:       nsize: 8
143:       args: -stag_stencil_width 1 -stag_grid_x 2 -stag_grid_y 2 -stag_grid_z 3 -stag_boundary_type_y ghosted -stag_boundary_type_z ghosted

145:    test:
146:       suffix: 10
147:       nsize: 5
148:       args: -stag_stencil_width 1 -stag_grid_y 2 -stag_grid_z 3 -stag_grid_x 17 -stag_boundary_type_y ghosted -stag_boundary_type_z ghosted -stag_ranks_x 5
149: TEST*/