← Back to team overview

dolfin team mailing list archive

Re: Diagonal operations on GenericMatrix

 


On 04/04/11 20:20, Johan Hake wrote:
> On Monday April 4 2011 12:13:22 Anders Logg wrote:
>> On Mon, Apr 04, 2011 at 08:10:22PM +0100, Garth N. Wells wrote:
>>> On 04/04/11 20:00, Johan Hake wrote:
>>>> On Monday April 4 2011 11:55:05 Garth N. Wells wrote:
>>>>> On 04/04/11 19:51, Johan Hake wrote:
>>>>>> Hello!
>>>>>>
>>>>>> I would very much like to have something like:
>>>>>>   // Set the diagonal of a matrix
>>>>>>   GenericMatrix::set_diagonal(const GenericVector& vec);
>>>>>>   
>>>>>>   // Scale Matrix with a diagonal matrix (represented as a Vector)
>>>>>>   GenericMatrix::scale(const GenericVector& vec);
>>>>>>   (maybe use operator*=)
>>>>>>
>>>>>> added to the GenericMatrix interface.
>>>>>>
>>>>>> The corresponding backend specific methods would be:
>>>>>>   // PETSc
>>>>>>   MatDiagonalSet
>>>>>>   MatDiagonalScale
>>>>>>   
>>>>>>   // Epetra
>>>>>>   ReplaceDiagonalValues
>>>>>>   RightScale
>>>>>>   
>>>>>>   // MTL4/uBLAS find out later...
>>>>>>
>>>>>> which should ensure the methods works in parallel too.
>>>>>>
>>>>>> Any objections or advices in respect to implement these?
>>>>>
>>>>> Fine with me, but could GenericMatrix::scale have a better name? It's
>>>>> not clear to me what it would do. Scale the diagonal, or scale the
>>>>> rows or the columns?
>>>>
>>>> It basically doing:
>>>>   A*=D
>>>>
>>>> where D is a diagonal matrix given by the a vector. And I guess this
>>>> would then correspond to a column scale.
>>>
>>> OK. It might get complicated, but we could have a
>>>
>>>     (Generic)DiagonalMatrix
>>>
>>> class?
> 
> Hmm, letting it inherit GenericVector? This path would open up a box of things 
> we have to consider... Maye fire up a Blueprint and add other thoughts on 
> that.
> 
>>> Otherwise, GenericMatrix::right_scale is probably an OK name.
> 
> Ok.
>  
>> I think scale_columns is more informative, if that is what it actually
>> does.
>>
>> (Is it implied by A *= D that it corresponds to A = A * D or can it be
>> A = D * A?)
> 
> Yes, no.
> 
> The first one is called RightScale and the second (I guess) is called 
> LeftScale in Epetra. In PETSc it is put into the same function. 
> 
> I could add right_scale and left_scale, or row_scale and column_scale. No big 
> deal from me.
> 

'left' and 'right' is consistent with preconditioner terminology, and
with the Trilinos and PETSc naming.

Garth

> Johan
> 
>> --
>> Anders
>>
>>> Garth
>>>
>>>> Johan
>>>>
>>>>> Garth
>>>>>
>>>>>> Best regards,
>>>>>>
>>>>>> Johan
>>>>>>
>>>>>> _______________________________________________
>>>>>> Mailing list: https://launchpad.net/~dolfin
>>>>>> Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
>>>>>> Unsubscribe : https://launchpad.net/~dolfin
>>>>>> More help   : https://help.launchpad.net/ListHelp
>>>>>
>>>>> _______________________________________________
>>>>> Mailing list: https://launchpad.net/~dolfin
>>>>> Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
>>>>> Unsubscribe : https://launchpad.net/~dolfin
>>>>> More help   : https://help.launchpad.net/ListHelp
>>>
>>> _______________________________________________
>>> Mailing list: https://launchpad.net/~dolfin
>>> Post to     : dolfin@xxxxxxxxxxxxxxxxxxx
>>> Unsubscribe : https://launchpad.net/~dolfin
>>> More help   : https://help.launchpad.net/ListHelp



Follow ups

References