[petsc-users] Slow convergence using Schur complement

Barry Smith bsmith at mcs.anl.gov
Thu Jul 14 15:05:12 CDT 2016


   So refreshing my memory 

> pc_fieldsplit_schur_precondition self

selfp then the preconditioning for the Schur complement is generated from an explicitly-assembled approximation 

Sp = A11 - A10 inv(diag(A00)) A01

             This is only a good preconditioner when diag(A00) is a good preconditioner for A00. Optionally, A00 can be
             lumped before extracting the diagonal using the additional option -fieldsplit_1_mat_schur_complement_ainv_type lump


So first try adding the option (with the correct prefix) -fieldsplit_1_mat_schur_complement_ainv_type lump to see if the lumping helps the convergence. If suddenly it works well great but as the documentation says selfp may not be a good preconditioner at all for your problem and you'll have to consider the other ones.

  I don't know why it is printing the initial name and residual norm multiple times.

   What is is showing is the very slow convergence of the preconditioned system inv(Sp) S = inv(Sp) (A11 - A10 inv(A00) A01). Note I wrote inv() here because in both places you are using LU and hence it is a very accurate inverse operation.

  Barry




> On Jul 14, 2016, at 2:42 PM, Amélie Compagna <amelie.compagna.1 at ulaval.ca> wrote:
> 
> ​Hi, 
> 
> I've been working on a finite element simulation of a 3 ionic species unsteady electrodiffusion model. The concentrations and the electric potential are defined using a unsteady diffusion equations. All the concentration being coupled to the potential giving a non symmetrical global system.
> 
> I know that everything works since I've solved the system using LU. So far I've tried a lot of different things, but I am now trying to solve the system using a Schur complement, splitting the system in two groups [concentrations, potential], and I'm getting slow convergence. Here are the options I'm using. I've also attached a file with the ksp_view and the ksp_monitor.
> 
> ======
>   ksp_type               gcr
>   pc_type                fieldsplit
>   pc_fieldsplit_type      schur
>   mat_type                nest
>   ksp_monitor
>   ksp_view
> 
> //Options concentrations block
> 
>   fieldsplit_a_00_ksp_type   gcr
>   fieldsplit_a_00_pc_type  lu
>   fieldsplit_a_00_ksp_rtol 1.0e-4
>   fieldsplit_a_00_ksp_atol 1.0e-8
> 
> //Options potential block
>   fieldsplit_schur_mat_type          schurcomplement
>   fieldsplit_schur_ksp_type          gcr
>   pc_fieldsplit_schur_precondition selfp
>   pc_fieldsplit_schur_fact_type full
>   fieldsplit_schur_pc_type           lu
>   fieldsplit_schur_ksp_monitor
>   fieldsplit_schur_ksp_rtol 1.0e-4
>   fieldsplit_schur_ksp_atol 1.0e-8
> 
> 
>   ksp_rtol                1.0e-5
>   ksp_atol                1.0e-5
> =====
> 
> First of all, I'm wondering what exactly is showing on the screen when I use the fieldsplit_schur_ksp_monitor? 
> 
> Also, why is it printing twice each time as you can see in the attached file? When I use pc_fieldsplit_a_00_monitor (which is not included in the file I sent you because it only does one iteration, as it should since it's solving with LU) it prints it 3 times every time which gets pretty annoying. 
> 
> Finally, as you can see, it takes a long time to the fieldsplit_schur_ksp to converge, do you have any idea why it takes over 200 iterations to get down to 1e-02? Is there a way to get it to converge faster?
> 
> Thank you for your time,
> Amélie​
> 
> <QuestionPetsc>



More information about the petsc-users mailing list