Actual source code: ex9.c
petsc-3.11.0 2019-03-29
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*/