← Back to team overview

dolfin team mailing list archive

Re: Diagonal operations on GenericMatrix

 

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.

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