Actual source code: ex9.c
petsc-3.12.4 2020-02-04
2: static char help[] = "Tests repeated setups and solves of PCFIELDSPLIT.\n\n";
3: #include <petscksp.h>
5: static PetscErrorCode replace_submats(Mat A)
6: {
8: IS *r,*c;
9: PetscInt i,j,nr,nc;
12: MatNestGetSubMats(A,&nr,&nc,NULL);
13: PetscMalloc1(nr,&r);
14: PetscMalloc1(nc,&c);
15: MatNestGetISs(A,r,c);
16: for (i=0;i<nr;i++) {
17: for (j=0;j<nc;j++) {
18: Mat sA,nA;
19: const char *prefix;
21: MatCreateSubMatrix(A,r[i],c[j],MAT_INITIAL_MATRIX,&sA);
22: MatDuplicate(sA,MAT_COPY_VALUES,&nA);
23: MatGetOptionsPrefix(sA,&prefix);
24: MatSetOptionsPrefix(nA,prefix);
25: MatNestSetSubMat(A,i,j,nA);
26: MatDestroy(&nA);
27: MatDestroy(&sA);
28: }
29: }
30: PetscFree(r);
31: PetscFree(c);
32: return(0);
33: }
35: int main(int argc, char *argv[])
36: {
37: KSP ksp;
38: PC pc;
39: Mat M,A,P,sA[2][2],sP[2][2];
40: Vec x,b;
41: IS f[2];
42: PetscInt i,j,rstart,rend;
45: PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
46: MatCreateAIJ(PETSC_COMM_WORLD,10,10,PETSC_DECIDE,PETSC_DECIDE,1,NULL,0,NULL,&M);
47: MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY);
48: MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY);
49: MatShift(M,1.);
50: MatGetOwnershipRange(M,&rstart,&rend);
51: ISCreateStride(PetscObjectComm((PetscObject)M),7,rstart,1,&f[0]);
52: ISComplement(f[0],rstart,rend,&f[1]);
53: for (i=0;i<2;i++) {
54: for (j=0;j<2;j++) {
55: MatCreateSubMatrix(M,f[i],f[j],MAT_INITIAL_MATRIX,&sA[i][j]);
56: MatCreateSubMatrix(M,f[i],f[j],MAT_INITIAL_MATRIX,&sP[i][j]);
57: }
58: }
59: MatCreateNest(PetscObjectComm((PetscObject)M),2,f,2,f,&sA[0][0],&A);
60: MatCreateNest(PetscObjectComm((PetscObject)M),2,f,2,f,&sP[0][0],&P);
61: MatDestroy(&M);
63: KSPCreate(PetscObjectComm((PetscObject)A),&ksp);
64: KSPSetOperators(ksp,A,P);
65: KSPGetPC(ksp,&pc);
66: PCSetType(pc,PCFIELDSPLIT);
67: KSPSetFromOptions(ksp);
68: MatCreateVecs(A,&x,&b);
69: VecSetRandom(b,NULL);
70: KSPSolve(ksp,b,x);
71: replace_submats(A);
72: replace_submats(P);
73: KSPSolve(ksp,b,x);
75: KSPDestroy(&ksp);
76: VecDestroy(&x);
77: VecDestroy(&b);
78: MatDestroy(&A);
79: MatDestroy(&P);
80: for (i=0;i<2;i++) {
81: ISDestroy(&f[i]);
82: for (j=0;j<2;j++) {
83: MatDestroy(&sA[i][j]);
84: MatDestroy(&sP[i][j]);
85: }
86: }
87: PetscFinalize();
88: return ierr;
89: }
91: /*TEST
93: test:
94: nsize: 1
95: filter: sed -e "s/CONVERGED_RTOL/CONVERGED_ATOL/g"
96: args: -pc_fieldsplit_diag_use_amat {{0 1}} -pc_fieldsplit_diag_use_amat {{0 1}} -pc_fieldsplit_type {{additive multiplicative}} -ksp_converged_reason -ksp_error_if_not_converged
98: test:
99: suffix: schur
100: nsize: 1
101: filter: sed -e "s/CONVERGED_RTOL/CONVERGED_ATOL/g"
102: args: -pc_fieldsplit_diag_use_amat {{0 1}} -pc_fieldsplit_diag_use_amat {{0 1}} -pc_fieldsplit_type schur -pc_fieldsplit_schur_scale 1.0 -pc_fieldsplit_schur_fact_type {{diag lower upper full}} -ksp_converged_reason -ksp_error_if_not_converged
104: TEST*/