1*18f812f4SBarry Smith static char help[] = "Check to see of DM_BOUNDARY_MIRROR works in 3D for DMDA with star stencil\n"; 2*18f812f4SBarry Smith 3*18f812f4SBarry Smith #include "petscdmda.h" 4*18f812f4SBarry Smith 5*18f812f4SBarry Smith /* Contributed by Gourav Kumbhojkar */ 6*18f812f4SBarry Smith 7*18f812f4SBarry Smith PetscErrorCode globalKMat_3d(Mat K, DMDALocalInfo info) 8*18f812f4SBarry Smith { 9*18f812f4SBarry Smith MatStencil row, col[7]; 10*18f812f4SBarry Smith PetscScalar vals[7]; 11*18f812f4SBarry Smith PetscInt ncols; 12*18f812f4SBarry Smith 13*18f812f4SBarry Smith PetscFunctionBeginUser; 14*18f812f4SBarry Smith for (PetscInt i = info.xs; i < info.xs + info.xm; i++) { 15*18f812f4SBarry Smith for (PetscInt j = info.ys; j < info.ys + info.ym; j++) { 16*18f812f4SBarry Smith for (PetscInt k = info.zs; k < info.zs + info.zm; k++) { 17*18f812f4SBarry Smith ncols = 0; 18*18f812f4SBarry Smith row.i = i; 19*18f812f4SBarry Smith row.j = j; 20*18f812f4SBarry Smith row.k = k; 21*18f812f4SBarry Smith 22*18f812f4SBarry Smith col[0].i = i; 23*18f812f4SBarry Smith col[0].j = j; 24*18f812f4SBarry Smith col[0].k = k; 25*18f812f4SBarry Smith vals[ncols++] = -6.; //ncols=1 26*18f812f4SBarry Smith 27*18f812f4SBarry Smith col[ncols].i = i - 1; 28*18f812f4SBarry Smith col[ncols].j = j; 29*18f812f4SBarry Smith col[ncols].k = k; 30*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=2 31*18f812f4SBarry Smith 32*18f812f4SBarry Smith col[ncols].i = i + 1; 33*18f812f4SBarry Smith col[ncols].j = j; 34*18f812f4SBarry Smith col[ncols].k = k; 35*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=3 36*18f812f4SBarry Smith 37*18f812f4SBarry Smith col[ncols].i = i; 38*18f812f4SBarry Smith col[ncols].j = j - 1; 39*18f812f4SBarry Smith col[ncols].k = k; 40*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=4 41*18f812f4SBarry Smith 42*18f812f4SBarry Smith col[ncols].i = i; 43*18f812f4SBarry Smith col[ncols].j = j + 1; 44*18f812f4SBarry Smith col[ncols].k = k; 45*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=5 46*18f812f4SBarry Smith 47*18f812f4SBarry Smith col[ncols].i = i; 48*18f812f4SBarry Smith col[ncols].j = j; 49*18f812f4SBarry Smith col[ncols].k = k + 1; 50*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=6 51*18f812f4SBarry Smith 52*18f812f4SBarry Smith col[ncols].i = i; 53*18f812f4SBarry Smith col[ncols].j = j; 54*18f812f4SBarry Smith col[ncols].k = k - 1; 55*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=7 56*18f812f4SBarry Smith 57*18f812f4SBarry Smith PetscCall(MatSetValuesStencil(K, 1, &row, ncols, col, vals, ADD_VALUES)); 58*18f812f4SBarry Smith } 59*18f812f4SBarry Smith } 60*18f812f4SBarry Smith } 61*18f812f4SBarry Smith PetscCall(MatAssemblyBegin(K, MAT_FINAL_ASSEMBLY)); 62*18f812f4SBarry Smith PetscCall(MatAssemblyEnd(K, MAT_FINAL_ASSEMBLY)); 63*18f812f4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 64*18f812f4SBarry Smith } 65*18f812f4SBarry Smith 66*18f812f4SBarry Smith PetscErrorCode globalKMat_2d(Mat K, DMDALocalInfo info) 67*18f812f4SBarry Smith { 68*18f812f4SBarry Smith MatStencil row, col[5]; 69*18f812f4SBarry Smith PetscScalar vals[5]; 70*18f812f4SBarry Smith PetscInt ncols; 71*18f812f4SBarry Smith 72*18f812f4SBarry Smith PetscFunctionBeginUser; 73*18f812f4SBarry Smith for (PetscInt i = info.xs; i < info.xs + info.xm; i++) { 74*18f812f4SBarry Smith for (PetscInt j = info.ys; j < info.ys + info.ym; j++) { 75*18f812f4SBarry Smith ncols = 0; 76*18f812f4SBarry Smith row.i = i; 77*18f812f4SBarry Smith row.j = j; 78*18f812f4SBarry Smith 79*18f812f4SBarry Smith col[0].i = i; 80*18f812f4SBarry Smith col[0].j = j; 81*18f812f4SBarry Smith vals[ncols++] = -4.; //ncols=1 82*18f812f4SBarry Smith 83*18f812f4SBarry Smith col[ncols].i = i - 1; 84*18f812f4SBarry Smith col[ncols].j = j; 85*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=2 86*18f812f4SBarry Smith 87*18f812f4SBarry Smith col[ncols].i = i; 88*18f812f4SBarry Smith col[ncols].j = j - 1; 89*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=3 90*18f812f4SBarry Smith 91*18f812f4SBarry Smith col[ncols].i = i + 1; 92*18f812f4SBarry Smith col[ncols].j = j; 93*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=4 94*18f812f4SBarry Smith 95*18f812f4SBarry Smith col[ncols].i = i; 96*18f812f4SBarry Smith col[ncols].j = j + 1; 97*18f812f4SBarry Smith vals[ncols++] = 1.; //ncols=5 98*18f812f4SBarry Smith 99*18f812f4SBarry Smith PetscCall(MatSetValuesStencil(K, 1, &row, ncols, col, vals, ADD_VALUES)); 100*18f812f4SBarry Smith } 101*18f812f4SBarry Smith } 102*18f812f4SBarry Smith PetscCall(MatAssemblyBegin(K, MAT_FINAL_ASSEMBLY)); 103*18f812f4SBarry Smith PetscCall(MatAssemblyEnd(K, MAT_FINAL_ASSEMBLY)); 104*18f812f4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 105*18f812f4SBarry Smith } 106*18f812f4SBarry Smith 107*18f812f4SBarry Smith int main(int argc, char **argv) 108*18f812f4SBarry Smith { 109*18f812f4SBarry Smith DM da3d, da2d; 110*18f812f4SBarry Smith DMDALocalInfo info3d, info2d; 111*18f812f4SBarry Smith Mat K3d, K2d; 112*18f812f4SBarry Smith PetscInt ne, num_pts; 113*18f812f4SBarry Smith ISLocalToGlobalMapping ltgm3d, ltgm2d; 114*18f812f4SBarry Smith Vec row2d, row3d; 115*18f812f4SBarry Smith PetscReal norm2d, norm3d; 116*18f812f4SBarry Smith 117*18f812f4SBarry Smith PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 118*18f812f4SBarry Smith ne = 8; 119*18f812f4SBarry Smith num_pts = ne + 1; 120*18f812f4SBarry Smith 121*18f812f4SBarry Smith PetscCall(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_MIRROR, DM_BOUNDARY_MIRROR, DMDA_STENCIL_STAR, num_pts, num_pts + 1, PETSC_DECIDE, PETSC_DECIDE, 1, 1, NULL, NULL, &da2d)); 122*18f812f4SBarry Smith PetscCall(DMSetUp(da2d)); 123*18f812f4SBarry Smith PetscCall(DMDAGetLocalInfo(da2d, &info2d)); 124*18f812f4SBarry Smith PetscCall(DMCreateMatrix(da2d, &K2d)); 125*18f812f4SBarry Smith PetscCall(DMGetLocalToGlobalMapping(da2d, <gm2d)); 126*18f812f4SBarry Smith PetscCall(ISLocalToGlobalMappingView(ltgm2d, PETSC_VIEWER_STDOUT_WORLD)); 127*18f812f4SBarry Smith //PetscFinalize(); 128*18f812f4SBarry Smith PetscCall(globalKMat_2d(K2d, info2d)); 129*18f812f4SBarry Smith PetscCall(MatView(K2d, PETSC_VIEWER_STDOUT_WORLD)); 130*18f812f4SBarry Smith PetscCall(MatCreateVecs(K2d, &row2d, NULL)); 131*18f812f4SBarry Smith 132*18f812f4SBarry Smith PetscCall(MatGetRowSum(K2d, row2d)); 133*18f812f4SBarry Smith PetscCall(VecNorm(row2d, NORM_2, &norm2d)); 134*18f812f4SBarry Smith 135*18f812f4SBarry Smith PetscCheck(norm2d == 0, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "2D atrix row sum should be zero"); 136*18f812f4SBarry Smith PetscCall(VecDestroy(&row2d)); 137*18f812f4SBarry Smith PetscCall(MatDestroy(&K2d)); 138*18f812f4SBarry Smith PetscCall(DMDestroy(&da2d)); 139*18f812f4SBarry Smith 140*18f812f4SBarry Smith PetscCall(DMDACreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_MIRROR, DM_BOUNDARY_MIRROR, DM_BOUNDARY_MIRROR, DMDA_STENCIL_STAR, num_pts, num_pts + 1, num_pts + 2, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 1, 1, NULL, NULL, NULL, &da3d)); 141*18f812f4SBarry Smith PetscCall(DMSetUp(da3d)); 142*18f812f4SBarry Smith PetscCall(DMCreateMatrix(da3d, &K3d)); 143*18f812f4SBarry Smith PetscCall(DMDAGetLocalInfo(da3d, &info3d)); 144*18f812f4SBarry Smith PetscCall(DMGetLocalToGlobalMapping(da3d, <gm3d)); 145*18f812f4SBarry Smith PetscCall(ISLocalToGlobalMappingView(ltgm3d, PETSC_VIEWER_STDOUT_WORLD)); 146*18f812f4SBarry Smith PetscCall(globalKMat_3d(K3d, info3d)); 147*18f812f4SBarry Smith PetscCall(MatView(K3d, PETSC_VIEWER_STDOUT_WORLD)); 148*18f812f4SBarry Smith PetscCall(MatCreateVecs(K3d, &row3d, NULL)); 149*18f812f4SBarry Smith PetscCall(MatGetRowSum(K3d, row3d)); 150*18f812f4SBarry Smith PetscCall(VecNorm(row3d, NORM_2, &norm3d)); 151*18f812f4SBarry Smith PetscCheck(norm3d == 0, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "3D atrix row sum should be zero"); 152*18f812f4SBarry Smith PetscCall(VecDestroy(&row3d)); 153*18f812f4SBarry Smith 154*18f812f4SBarry Smith PetscCall(DMDestroy(&da3d)); 155*18f812f4SBarry Smith PetscCall(MatDestroy(&K3d)); 156*18f812f4SBarry Smith return PetscFinalize(); 157*18f812f4SBarry Smith } 158*18f812f4SBarry Smith 159*18f812f4SBarry Smith /*TEST 160*18f812f4SBarry Smith 161*18f812f4SBarry Smith test: 162*18f812f4SBarry Smith 163*18f812f4SBarry Smith test: 164*18f812f4SBarry Smith suffix: 2 165*18f812f4SBarry Smith nsize: 2 166*18f812f4SBarry Smith 167*18f812f4SBarry Smith test: 168*18f812f4SBarry Smith suffix: 4 169*18f812f4SBarry Smith nsize: 4 170*18f812f4SBarry Smith 171*18f812f4SBarry Smith test: 172*18f812f4SBarry Smith suffix: 8 173*18f812f4SBarry Smith nsize: 8 174*18f812f4SBarry Smith 175*18f812f4SBarry Smith TEST*/ 176