[petsc-users] advice about preconditioning

Smith, Barry F. bsmith at mcs.anl.gov
Fri Aug 31 21:52:57 CDT 2018



> On Aug 31, 2018, at 8:31 PM, Oleksandr Koshkarov <olk548 at mail.usask.ca> wrote:
> 
> Dear All,
> 
> I hope you can help me with some advice on how to proceed with constructing a preconditioner for my petsc based simulation.
> 
> I have a large nonlinear system dU/dt = L(U) + N(U,U), with U being a state vector, L linear operator and N nonlinear one. It comes from discretizing hyperbolic PDE with finite volume. L is advection and N is some nonlinear source which does not have spatial derivatives. My U is PETSc 3D DMDA with dof = from 1e2 up to 2e3. I solve it with petsc TS object and with Crank Nicolson method. In order to save space, I do use finite difference Jacobian, which petsc generates itself. Something like this
> 
>     MatCreateSNESMF(snes,&J);
>     SNESSetJacobian(snes,J,J,MatMFFDComputeJacobian,0);
> 
> Now I want to precondition my linear solves inside Newton iterations with linearized Jacobian, i.e, with something like this
> 
>  P_n = 1 - dt/2 * ( L + N(U^n,*) + N(*,U^n) )        // where U^n is state from previous time step
> 
> I first checked, that this works on small test problem. I used matrix free preconditioner (PCSHELL) inside which I inverted P_n with KSP.
> 
> Where  P_n is matrix free matrix (shell matrix). It reduces the number of KSP dramatically, which is not a surprise - it was just a sanity check.
> 
> Now I am trying to understand how to proceed... and I am not sure what to do. In my head I have two options:
> 
> 1) Try to construct matrix-free preconditioner. For example, I can keep inverting P_n every iteration inside the preconditioner with KSP (or some other method) but now precondition it with something else, to make it cheap. So I would have double preconditioner...  I am not sure if this is a right direction, and it is even possible to make effective matrix-free preconditioner in my case
> 
> 2) Construct P_n as real matrix, and feed it to petsc (SNESSetJacobian(snes,J,P,MatMFFDComputeJacobian,0);) and ask to perform something like LU for preconditioning. It is very expensive (as I have huge system) and I would need to probably contract P_n only every 100 steps or something like this... It is probably the right direction I have to go, but it seems it will take too much memory.
> 
> Is there other better way? :)
> 
> Small question. If I will need to construct P_n element by element, does petsc provide some help with DMDA indexing. I usually access state U with x-index (xi), y-index (yi), z-index(zi), and dof like u[zi][yi][xi][dof]. Can I use similar indexing to access matrix elements?

   MatSetValuesStencil()


   I would construct the P matrix and use LU to start, make sure you have good Newton convergence then after everything is working well is time to investigate preconditioners for P.

     Barry

> 
> 
> Thank you and best regards,
> 
> Oleksandr.
> 



More information about the petsc-users mailing list