1c4762a1bSJed Brown static char help[] = "Creates a matrix using 9 pt stencil, and uses it to test MatIncreaseOverlap (needed for additive Schwarz preconditioner). \n\
2c4762a1bSJed Brown -m <size> : problem size\n\
3c4762a1bSJed Brown -x1, -x2 <size> : no of subdomains in x and y directions\n\n";
4c4762a1bSJed Brown
5c4762a1bSJed Brown #include <petscksp.h>
6c4762a1bSJed Brown
FormElementStiffness(PetscReal H,PetscScalar * Ke)73ba16761SJacob Faibussowitsch static PetscErrorCode FormElementStiffness(PetscReal H, PetscScalar *Ke)
8d71ae5a4SJacob Faibussowitsch {
93ba16761SJacob Faibussowitsch PetscFunctionBeginUser;
109371c9d4SSatish Balay Ke[0] = H / 6.0;
119371c9d4SSatish Balay Ke[1] = -.125 * H;
129371c9d4SSatish Balay Ke[2] = H / 12.0;
139371c9d4SSatish Balay Ke[3] = -.125 * H;
149371c9d4SSatish Balay Ke[4] = -.125 * H;
159371c9d4SSatish Balay Ke[5] = H / 6.0;
169371c9d4SSatish Balay Ke[6] = -.125 * H;
179371c9d4SSatish Balay Ke[7] = H / 12.0;
189371c9d4SSatish Balay Ke[8] = H / 12.0;
199371c9d4SSatish Balay Ke[9] = -.125 * H;
209371c9d4SSatish Balay Ke[10] = H / 6.0;
219371c9d4SSatish Balay Ke[11] = -.125 * H;
229371c9d4SSatish Balay Ke[12] = -.125 * H;
239371c9d4SSatish Balay Ke[13] = H / 12.0;
249371c9d4SSatish Balay Ke[14] = -.125 * H;
259371c9d4SSatish Balay Ke[15] = H / 6.0;
263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
27c4762a1bSJed Brown }
283ba16761SJacob Faibussowitsch
293ba16761SJacob Faibussowitsch #if 0
303ba16761SJacob Faibussowitsch // unused
313ba16761SJacob Faibussowitsch static PetscErrorCode FormElementRhs(PetscReal x, PetscReal y, PetscReal H, PetscScalar *r)
32d71ae5a4SJacob Faibussowitsch {
333ba16761SJacob Faibussowitsch PetscFunctionBeginUser;
349371c9d4SSatish Balay r[0] = 0.;
359371c9d4SSatish Balay r[1] = 0.;
369371c9d4SSatish Balay r[2] = 0.;
379371c9d4SSatish Balay r[3] = 0.0;
383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
39c4762a1bSJed Brown }
403ba16761SJacob Faibussowitsch #endif
41c4762a1bSJed Brown
main(int argc,char ** args)42d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
43d71ae5a4SJacob Faibussowitsch {
44c4762a1bSJed Brown Mat C;
45c4762a1bSJed Brown PetscInt i, m = 2, N, M, idx[4], Nsub1, Nsub2, ol = 1, x1, x2;
46c4762a1bSJed Brown PetscScalar Ke[16];
47c4762a1bSJed Brown PetscReal h;
48c4762a1bSJed Brown IS *is1, *is2, *islocal1, *islocal2;
49c4762a1bSJed Brown PetscBool flg;
50c4762a1bSJed Brown
51327415f7SBarry Smith PetscFunctionBeginUser;
52*c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &args, NULL, help));
539566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
54c4762a1bSJed Brown N = (m + 1) * (m + 1); /* dimension of matrix */
55c4762a1bSJed Brown M = m * m; /* number of elements */
56c4762a1bSJed Brown h = 1.0 / m; /* mesh width */
57c4762a1bSJed Brown x1 = (m + 1) / 2;
58c4762a1bSJed Brown x2 = x1;
599566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-x1", &x1, NULL));
609566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-x2", &x2, NULL));
61c4762a1bSJed Brown /* create stiffness matrix */
629566063dSJacob Faibussowitsch PetscCall(MatCreateSeqAIJ(PETSC_COMM_SELF, N, N, 9, NULL, &C));
63c4762a1bSJed Brown
64c4762a1bSJed Brown /* forms the element stiffness for the Laplacian */
659566063dSJacob Faibussowitsch PetscCall(FormElementStiffness(h * h, Ke));
66c4762a1bSJed Brown for (i = 0; i < M; i++) {
67c4762a1bSJed Brown /* node numbers for the four corners of element */
68c4762a1bSJed Brown idx[0] = (m + 1) * (i / m) + (i % m);
699371c9d4SSatish Balay idx[1] = idx[0] + 1;
709371c9d4SSatish Balay idx[2] = idx[1] + m + 1;
719371c9d4SSatish Balay idx[3] = idx[2] - 1;
729566063dSJacob Faibussowitsch PetscCall(MatSetValues(C, 4, idx, 4, idx, Ke, ADD_VALUES));
73c4762a1bSJed Brown }
749566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY));
759566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY));
76c4762a1bSJed Brown
77c4762a1bSJed Brown for (ol = 0; ol < m + 2; ++ol) {
789566063dSJacob Faibussowitsch PetscCall(PCASMCreateSubdomains2D(m + 1, m + 1, x1, x2, 1, 0, &Nsub1, &is1, &islocal1));
799566063dSJacob Faibussowitsch PetscCall(MatIncreaseOverlap(C, Nsub1, is1, ol));
809566063dSJacob Faibussowitsch PetscCall(PCASMCreateSubdomains2D(m + 1, m + 1, x1, x2, 1, ol, &Nsub2, &is2, &islocal2));
81c4762a1bSJed Brown
829566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF, "flg == 1 => both index sets are same\n"));
83da81f932SPierre Jolivet if (Nsub1 != Nsub2) PetscCall(PetscPrintf(PETSC_COMM_SELF, "Error: No of index sets don't match\n"));
84c4762a1bSJed Brown
85c4762a1bSJed Brown for (i = 0; i < Nsub1; ++i) {
869566063dSJacob Faibussowitsch PetscCall(ISEqual(is1[i], is2[i], &flg));
8763a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF, "i = %" PetscInt_FMT ",flg = %d \n", i, (int)flg));
88c4762a1bSJed Brown }
899566063dSJacob Faibussowitsch for (i = 0; i < Nsub1; ++i) PetscCall(ISDestroy(&is1[i]));
909566063dSJacob Faibussowitsch for (i = 0; i < Nsub2; ++i) PetscCall(ISDestroy(&is2[i]));
919566063dSJacob Faibussowitsch for (i = 0; i < Nsub1; ++i) PetscCall(ISDestroy(&islocal1[i]));
929566063dSJacob Faibussowitsch for (i = 0; i < Nsub2; ++i) PetscCall(ISDestroy(&islocal2[i]));
93c4762a1bSJed Brown
949566063dSJacob Faibussowitsch PetscCall(PetscFree(is1));
959566063dSJacob Faibussowitsch PetscCall(PetscFree(is2));
969566063dSJacob Faibussowitsch PetscCall(PetscFree(islocal1));
979566063dSJacob Faibussowitsch PetscCall(PetscFree(islocal2));
98c4762a1bSJed Brown }
999566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C));
1009566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
101b122ec5aSJacob Faibussowitsch return 0;
102c4762a1bSJed Brown }
103c4762a1bSJed Brown
104c4762a1bSJed Brown /*TEST
105c4762a1bSJed Brown
106c4762a1bSJed Brown test:
107c4762a1bSJed Brown args: -m 7
108c4762a1bSJed Brown
109c4762a1bSJed Brown TEST*/
110