Schur system + MatShell

Barry Smith bsmith at mcs.anl.gov
Mon Apr 21 11:43:10 CDT 2008


On Apr 21, 2008, at 5:54 AM, tribur at vision.ee.ethz.ch wrote:

> 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.

    Even if GMRES+Jacobi works reasonably well, GMRES without Jacobi  
can be much worse, this is a danger of matrix free without
some kind of preconditioner.

> 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.

Run it with -ksp_monitor_true_residual (-ksp_truemonitor) for PETSc  
pre 2.3.3) and -ksp_converged_reason to see
what is happening. Note that KSPSolve() does NOT generate an error if  
it fails to converge, you need to check with
KSPGetConvergedReason() or -ksp_converged_reason after the solve to  
see if KSP thinks it has converged or
why it did not converge.

    Barry
>
>
>
> 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