1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Creates a matrix using 9 pt stencil, and uses it to test MatIncreaseOverlap (needed for additive Schwarz preconditioner). \n\ 3c4762a1bSJed Brown -m <size> : problem size\n\ 4c4762a1bSJed Brown -x1, -x2 <size> : no of subdomains in x and y directions\n\n"; 5c4762a1bSJed Brown 6c4762a1bSJed Brown #include <petscksp.h> 7c4762a1bSJed Brown 8*3ba16761SJacob Faibussowitsch static PetscErrorCode FormElementStiffness(PetscReal H, PetscScalar *Ke) 9d71ae5a4SJacob Faibussowitsch { 10*3ba16761SJacob Faibussowitsch PetscFunctionBeginUser; 119371c9d4SSatish Balay Ke[0] = H / 6.0; 129371c9d4SSatish Balay Ke[1] = -.125 * H; 139371c9d4SSatish Balay Ke[2] = H / 12.0; 149371c9d4SSatish Balay Ke[3] = -.125 * H; 159371c9d4SSatish Balay Ke[4] = -.125 * H; 169371c9d4SSatish Balay Ke[5] = H / 6.0; 179371c9d4SSatish Balay Ke[6] = -.125 * H; 189371c9d4SSatish Balay Ke[7] = H / 12.0; 199371c9d4SSatish Balay Ke[8] = H / 12.0; 209371c9d4SSatish Balay Ke[9] = -.125 * H; 219371c9d4SSatish Balay Ke[10] = H / 6.0; 229371c9d4SSatish Balay Ke[11] = -.125 * H; 239371c9d4SSatish Balay Ke[12] = -.125 * H; 249371c9d4SSatish Balay Ke[13] = H / 12.0; 259371c9d4SSatish Balay Ke[14] = -.125 * H; 269371c9d4SSatish Balay Ke[15] = H / 6.0; 27*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 28c4762a1bSJed Brown } 29*3ba16761SJacob Faibussowitsch 30*3ba16761SJacob Faibussowitsch #if 0 31*3ba16761SJacob Faibussowitsch // unused 32*3ba16761SJacob Faibussowitsch static PetscErrorCode FormElementRhs(PetscReal x, PetscReal y, PetscReal H, PetscScalar *r) 33d71ae5a4SJacob Faibussowitsch { 34*3ba16761SJacob Faibussowitsch PetscFunctionBeginUser; 359371c9d4SSatish Balay r[0] = 0.; 369371c9d4SSatish Balay r[1] = 0.; 379371c9d4SSatish Balay r[2] = 0.; 389371c9d4SSatish Balay r[3] = 0.0; 39*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 40c4762a1bSJed Brown } 41*3ba16761SJacob Faibussowitsch #endif 42c4762a1bSJed Brown 43d71ae5a4SJacob Faibussowitsch int main(int argc, char **args) 44d71ae5a4SJacob Faibussowitsch { 45c4762a1bSJed Brown Mat C; 46c4762a1bSJed Brown PetscInt i, m = 2, N, M, idx[4], Nsub1, Nsub2, ol = 1, x1, x2; 47c4762a1bSJed Brown PetscScalar Ke[16]; 48c4762a1bSJed Brown PetscReal h; 49c4762a1bSJed Brown IS *is1, *is2, *islocal1, *islocal2; 50c4762a1bSJed Brown PetscBool flg; 51c4762a1bSJed Brown 52327415f7SBarry Smith PetscFunctionBeginUser; 539566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 549566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL)); 55c4762a1bSJed Brown N = (m + 1) * (m + 1); /* dimension of matrix */ 56c4762a1bSJed Brown M = m * m; /* number of elements */ 57c4762a1bSJed Brown h = 1.0 / m; /* mesh width */ 58c4762a1bSJed Brown x1 = (m + 1) / 2; 59c4762a1bSJed Brown x2 = x1; 609566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-x1", &x1, NULL)); 619566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-x2", &x2, NULL)); 62c4762a1bSJed Brown /* create stiffness matrix */ 639566063dSJacob Faibussowitsch PetscCall(MatCreateSeqAIJ(PETSC_COMM_SELF, N, N, 9, NULL, &C)); 64c4762a1bSJed Brown 65c4762a1bSJed Brown /* forms the element stiffness for the Laplacian */ 669566063dSJacob Faibussowitsch PetscCall(FormElementStiffness(h * h, Ke)); 67c4762a1bSJed Brown for (i = 0; i < M; i++) { 68c4762a1bSJed Brown /* node numbers for the four corners of element */ 69c4762a1bSJed Brown idx[0] = (m + 1) * (i / m) + (i % m); 709371c9d4SSatish Balay idx[1] = idx[0] + 1; 719371c9d4SSatish Balay idx[2] = idx[1] + m + 1; 729371c9d4SSatish Balay idx[3] = idx[2] - 1; 739566063dSJacob Faibussowitsch PetscCall(MatSetValues(C, 4, idx, 4, idx, Ke, ADD_VALUES)); 74c4762a1bSJed Brown } 759566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY)); 769566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY)); 77c4762a1bSJed Brown 78c4762a1bSJed Brown for (ol = 0; ol < m + 2; ++ol) { 799566063dSJacob Faibussowitsch PetscCall(PCASMCreateSubdomains2D(m + 1, m + 1, x1, x2, 1, 0, &Nsub1, &is1, &islocal1)); 809566063dSJacob Faibussowitsch PetscCall(MatIncreaseOverlap(C, Nsub1, is1, ol)); 819566063dSJacob Faibussowitsch PetscCall(PCASMCreateSubdomains2D(m + 1, m + 1, x1, x2, 1, ol, &Nsub2, &is2, &islocal2)); 82c4762a1bSJed Brown 839566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF, "flg == 1 => both index sets are same\n")); 8448a46eb9SPierre Jolivet if (Nsub1 != Nsub2) PetscCall(PetscPrintf(PETSC_COMM_SELF, "Error: No of indes sets don't match\n")); 85c4762a1bSJed Brown 86c4762a1bSJed Brown for (i = 0; i < Nsub1; ++i) { 879566063dSJacob Faibussowitsch PetscCall(ISEqual(is1[i], is2[i], &flg)); 8863a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF, "i = %" PetscInt_FMT ",flg = %d \n", i, (int)flg)); 89c4762a1bSJed Brown } 909566063dSJacob Faibussowitsch for (i = 0; i < Nsub1; ++i) PetscCall(ISDestroy(&is1[i])); 919566063dSJacob Faibussowitsch for (i = 0; i < Nsub2; ++i) PetscCall(ISDestroy(&is2[i])); 929566063dSJacob Faibussowitsch for (i = 0; i < Nsub1; ++i) PetscCall(ISDestroy(&islocal1[i])); 939566063dSJacob Faibussowitsch for (i = 0; i < Nsub2; ++i) PetscCall(ISDestroy(&islocal2[i])); 94c4762a1bSJed Brown 959566063dSJacob Faibussowitsch PetscCall(PetscFree(is1)); 969566063dSJacob Faibussowitsch PetscCall(PetscFree(is2)); 979566063dSJacob Faibussowitsch PetscCall(PetscFree(islocal1)); 989566063dSJacob Faibussowitsch PetscCall(PetscFree(islocal2)); 99c4762a1bSJed Brown } 1009566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 1019566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 102b122ec5aSJacob Faibussowitsch return 0; 103c4762a1bSJed Brown } 104c4762a1bSJed Brown 105c4762a1bSJed Brown /*TEST 106c4762a1bSJed Brown 107c4762a1bSJed Brown test: 108c4762a1bSJed Brown args: -m 7 109c4762a1bSJed Brown 110c4762a1bSJed Brown TEST*/ 111