Effectively utilizing multiple right hand sides with the same system can 
result in roughly 2 or at absolute most  3 times  improvement in solve time. A 
great improvement but when you have a million right hand sides not a giant 
improvement. 

  The first step is to get the best (most efficient) preconditioner for you 
problem. Since you have many right hand sides it obviously pays to spend more 
time building the preconditioner so that each solve is faster. If you provide 
more information on your linear system we might have suggestions.  CFD so is 
your linear system a Poisson problem? Are you using geometric or algebraic 
multigrid with PETSc? It not a Poisson problem how can you describe the linear 
system?

  Barry



> On Aug 10, 2016, at 9:54 PM, Harshad Ranadive <harshadranad...@gmail.com> 
> wrote:
> 
> Hi All,
> 
> I have currently added the PETSc library with our CFD solver. 
> 
> In this I need to use KSPSolve(...) multiple time for the same matrix A. I 
> have read that PETSc does not support passing multiple RHS vectors in the 
> form of a matrix and the only solution to this is calling KSPSolve multiple 
> times as in example given here:
> http://www.mcs.anl.gov/petsc/petsc-current/src/ksp/ksp/examples/tutorials/ex16.c.html
> 
> I have followed this technique, but I find that the performance of the code 
> is very slow now. I basically have a mesh size of 8-10 Million and I need to 
> solve the matrix A very large number of times. I have checked that the 
> statement KSPSolve(..) is taking close to 90% of my computation time.
> 
> I am setting up the matrix A, KSPCreate, KSPSetup etc just once at the start. 
> Only the following statements are executed in a repeated loop
> 
> Loop begin: (say million times !!)
> 
>    loop over vector length
>        VecSetValues( ....)
>    end
> 
>    VecAssemblyBegin( ... )
>    VecAssemblyEnd (...)
> 
>     KSPSolve (...)
> 
>     VecGetValues
> 
> Loop end.
> 
> Is there an efficient way of doing this rather than using KSPSolve multiple 
> times?
> 
> Please note my matrix A never changes during the time steps or across the 
> mesh ... So essentially if I can get the inverse once would it be good 
> enough?  It has been recommended in the FAQ that matrix inverse should be 
> avoided but would it be okay to use in my case?
> 
> Also could someone please provide an example of how to use MatLUFactor and 
> MatCholeskyFactor() to find the matrix inverse... the arguments below were 
> not clear to me.
> IS row 
> IS col
> const MatFactorInfo *info
> 
> Apologies for a long email and thanks to anyone for help.
> 
> Regards
> Harshad
> 
> 
> 
> 
> 

Reply via email to