some sor questions

Stephan Kramer s.kramer at imperial.ac.uk
Tue Sep 22 15:37:37 CDT 2009


Thanks for your answers

Barry Smith wrote:
> On Sep 22, 2009, at 8:47 AM, Stephan Kramer wrote:
> 
>> Hi all,
>>
>> I have some questions basically about the MatRelax_SeqAIJ routine:
>>
>> If I understand correctly there are 2 versions of the sor routine  
>> depending on whether or not there is a zero guess, so that with a  
>> zero guess in the forward sweep you don't need to multiply the upper  
>> diagonal part U with the part of the x vector that is still zero.  
>> Why then does it look like that both versions log the same number of  
>> flops? I would have expected that the full forward sweep (i.e. no  
>> zero guess) takes 2*a->nz flops (i.e. the same as a matvec) and not  
>> a->nz.
> 
>     You are right. This is an error in our code. It will be in the  
> next patch.
> 
>> Why does the Richardson iteration with sor not take the zero guess  
>> into account, i.e. why does PCApplyRichardson_SOR not set  
>> SOR_ZERO_INIT_GUESS in the call to MatRelax if the Richardson ksp  
>> has a zero initial guess set?
> 
>     This appears to be a design limitation. There is no mechanism to  
> pass the information that the initial guess is zero into  
> PCApplyRichardson(). We could add support for this by adding one more  
> argument to PCApplyRichardson() for this information. I don't see a  
> simpler way.  If one is running, say 2 iterations of Richardson then  
> this would be a measurable improvement in time. If one is running many  
> iterations then the savings is tiny. Perhaps this support should be  
> added.

I'm thinking of the application of ksp richardson with sor as a smoother 
in pcmg. In which case the down smoother will have zero initial guess 
(as it only acts on the residual), and there will be typicaly only 1 or 
2 iterations, so the saving would be significant. Is there another way I 
should set this up instead?

> 
> 
> 
>> In parallel if you specify SOR_LOCAL_FORWARD_SWEEP or  
>> SOR_LOCAL_BACKWARD_SWEEP it
> 
> 
>> calls MatRelax on the local part of the matrix, mat->A, with  
>> its=lits and lits=PETSC_NULL (?).
> 
>> However the first line of MatRelax_SeqAIJ then says: its = its*lits.  
>> Is that right?
> 
>     This is all wrong. It should be passing 1 in, not PETSC_NULL. This  
> was fixed in petsc-dev but not in petsc-3.0.0 I will fix it in  
> petsc-3.0.0 and it will be in the next patch.
> 
>     Thanks for pointing out the problems.
> 
>     If you plan to use SOR a lot, you might consider switching to  
> petsc-dev since I have made some improvements there. Also consider the  
> Eisenstat trick preconditioner.
> 
>     Barry
> 
> 
>> Please tell me if I'm totally misunderstanding how the routine  
>> works, thanks for any help.
>>
>> Cheers
>> Stephan
>>
>> -- 
>> Stephan Kramer  <s.kramer at imperial.ac.uk>
>> Applied Modelling and Computation Group,
>> Department of Earth Science and Engineering,
>> Imperial College London
> 
> 



More information about the petsc-users mailing list