xref: /petsc/src/ksp/pc/tests/ex6.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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