[Trilinos-Users] Adding sparse matrices

Williams, Alan B william at sandia.gov
Mon Jun 18 13:44:15 MDT 2007


Maxsim,
Sorry for the delay in getting back to you on this.

As far as I can tell, there is no strong reason for the Add function to
call FillComplete on the result matrix.

I'll change the Add function to no longer call FillComplete.
In the short term, you could modify your copy of Trilinos by removing
the two lines
  if( !B.Filled() )
    EPETRA_CHK_ERR( B.FillComplete() );
(lines 1373-1374 of packages/epetraext/src/EpetraExt_MatrixMatrix.cpp)

If you discover that this causes other unintended side-effects, let me
know.

Alan


> -----Original Message-----
> From: Maxsim Gibiansky [mailto:maxsim.gibiansky at nist.gov] 
> Sent: Monday, June 11, 2007 2:28 PM
> To: Williams, Alan B
> Cc: trilinos-users at software.sandia.gov
> Subject: RE: [Trilinos-Users] Adding sparse matrices
> 
> > As the function's comments state, it doesn't matter whether 
> the result 
> > has already been 'Filled()' or not, on entry to the function.
> 
> I tried it, and it still gave me an error. Here's code that I 
> can run in the python interpreter:
> 
> from PyTrilinos import Epetra
> from PyTrilinos import EpetraExt
> 
> Comm = Epetra.PyComm()
> Map = Epetra.Map(3,0,Comm)
> A=Epetra.FECrsMatrix(Epetra.Copy, Map,1) 
> B=Epetra.FECrsMatrix(Epetra.Copy, Map,1) 
> C=Epetra.FECrsMatrix(Epetra.Copy, Map,1)
> 
> B[0,0]=1
> C[1,1]=2
> 
> B.FillComplete()
> C.FillComplete()
> 
> EpetraExt.Add(B, False, 1, A, 1)
> EpetraExt.Add(C, False, 1, A, 1)
> 
> This gives me the following error after the last line:
> 
> python2.3: 
> ../../../../packages/epetraext/src/EpetraExt_MatrixMatrix.cpp:1359:
> static int EpetraExt::MatrixMatrix::Add(const 
> Epetra_CrsMatrix&, bool, double, Epetra_CrsMtrix&, double): 
> Assertion `err == 0' failed.
> Aborted
> 
> I'm using trilinos 7.0.8.
> 
> In the description of the Add function, it also says about 
> the FillComplete condition - "If it has, then B's graph must 
> already contain all nonzero locations that will be produced 
> when forming the sum." I think I can only use this if I am 
> sure that the two matrices can be added without generating 
> any new nonzero locations in B, which might not be the case. 
> 
> I guess in this test case, it's possible to get around the 
> problem by just accumulating them in the right order, so that 
> two matrices that are both
> Filled() never need to be added. However, that doesn't seem 
> like it'll work in the general case, since some of the 
> matrices to be added together might already start out 
> FillComplete()d if they were generated by, say, a multiplication. 
> 
> -Maxsim Gibiansky
> 
> Quoting "Williams, Alan B" <william at sandia.gov>:
> 
> > Maxsim,
> > 
> > The function MatrixMatrix::Add(A, transA, scalA, B, scalB) 
> Forms the 
> > result B = scalA * A + scalB * B
> > 
> > As the function's comments state, it doesn't matter whether 
> the result 
> > has already been 'Filled()' or not, on entry to the function.
> > 
> > In your scenario, A is the result matrix which makes the above 
> > somewhat confusing, but the bottom line is, you shouldn't 
> get an error 
> > if the result matrix is already 'Filled()' on entry to the 
> second Add.
> > 
> > Alan
> > 
> > 
> > > -----Original Message-----
> > > From: trilinos-users-bounces at software.sandia.gov
> > > [mailto:trilinos-users-bounces at software.sandia.gov] On Behalf Of 
> > > Maxsim Gibiansky
> > > Sent: Monday, June 11, 2007 1:02 PM
> > > To: trilinos-users at software.sandia.gov
> > > Subject: [Trilinos-Users] Adding sparse matrices
> > > 
> > > I've been using Trilinos (via PyTrilinos), and I have some other 
> > > questions.
> > > 
> > > I'm in a situation where I have sparse matrices
> > > (Epetra.FECrsMatrix) for several terms in an equation; 
> I'd like to 
> > > be able to add them. I've tried using the Add function in 
> > > EpetraExt::MatrixMatrix, but I've had problems - at the 
> end of the 
> > > operation, the destination matrix has
> > > FillComplete() called on it. So if I wanted to use it to do 
> > > something like
> > > 
> > > Add(B, False, 1, A, 1) // A += B
> > > Add(C, False, 1, A, 1) // A += C
> > > 
> > > I might get an error, because A will already be Filled() 
> after the 
> > > first call.
> > > 
> > > Am I missing something? I can't seem to figure out how to add a 
> > > group of matrices together, and it seems like there 
> should be some 
> > > way of doing this.
> > > 
> > > -Maxsim Gibiansky
> > > 
> > > 
> > > _______________________________________________
> > > Trilinos-Users mailing list
> > > Trilinos-Users at software.sandia.gov
> > > http://software.sandia.gov/mailman/listinfo/trilinos-users
> > > 
> > 
> > 
> 
> 
> 
> 
> 
> 




More information about the Trilinos-Users mailing list