Schur system + MatShell

tribur at vision.ee.ethz.ch tribur at vision.ee.ethz.ch
Mon Apr 21 05:54:55 CDT 2008


Dear all,

Sorry for switching from Schur to Hypre and back, but I'm trying two 
approaches at the same time to find the optimal solution for our 
convection-diffusion/Stokes problems: a) solving the global stiffness 
matrix directly and in parallel using Petsc and a suitable 
preconditioner (???) and b) applying first non-overlapping domain 
decomposition and than solving the Schur complement system.

Being concerned with b in the moment, I managed to set up and solve the 
global Schur system using MATDENSE. The solving works well with, e.g., 
gmres+jacobi, but the assembling of the global Schur matrix takes too 
long. Therefore, I'm trying to use the matrix in unassembled form using 
MatShell. Not very successfully, however:

1) When I use KSPGMRES, I got the error
[1]PETSC ERROR: MatMult() line 1632 in src/mat/interface/matrix.c
[1]PETSC ERROR: PCApplyBAorAB() line 584 in src/ksp/pc/interface/precon.c
[1]PETSC ERROR: GMREScycle() line 159 in src/ksp/ksp/impls/gmres/gmres.c
[1]PETSC ERROR: KSPSolve_GMRES() line 241 in src/ksp/ksp/impls/gmres/gmres.c
[1]PETSC ERROR: KSPSolve() line 379 in src/ksp/ksp/interface/itfunc.c

2) Using KSPBICG, it iterates without error message, but the result is 
wrong (norm of residual 1.42768 instead of something like 1.0e-10), 
although my Mat-functions PETSC_SchurMatMult and 
PETSC_SchurMatMultTranspose seem to be correct. I tested the latter 
comparing the vectors y1 and y2 computed by, e.g., MatMult(S,x,y1) and 
PETS_SchurMatMult(S,x,y2). Norm(y1-y2) was < e-15 for both functions.


Could you please have a look at my code snippet below?

Thank you very much!
Kathrin



PS: My Code:

Vec gtot, x;
...
Mat Stot;    IS is;
ISCreateGeneral(PETSC_COMM_SELF, NPb, &uBId_global[0], &is);
localData ctx;
ctx.NPb  = NPb;   //size of local Schur system S
ctx.Sloc = &S[0];
ctx.is = is;
MatCreateShell(PETSC_COMM_WORLD,m,n,NPb_tot,NPb_tot,&ctx,&Stot);
MatShellSetOperation(Stot,MATOP_MULT,(void(*)(void)) 
PETSC_SchurMatMult); 
MatShellSetOperation(Stot,MATOP_MULT_TRANSPOSE,(void(*)(void))PETSC_SchurMatMultTranspose);
KSP ksp;
KSPCreate(PETSC_COMM_WORLD,&ksp);
PC prec;
KSPSetOperators(ksp,Stot,Stot,DIFFERENT_NONZERO_PATTERN);
KSPGetPC(ksp,&prec);
PCSetType(prec, PCNONE);
KSPSetType(ksp, KSPBICG);
KSPSetTolerances(ksp, 1.e-10, 1.e-50,PETSC_DEFAULT,PETSC_DEFAULT);
KSPSolve(ksp,gtot,x);
...





More information about the petsc-users mailing list