[Trilinos-Users] Resend: Problem with Multiply()
Erik Boman
egboman at sandia.gov
Fri Jul 18 11:37:21 MDT 2008
Tudor,
Your interpretation of domain and range maps is correct. A subtle issue
is that even though the range and row maps are often the same, the
column map is generally different from the domain map and this may be
part of your problem. It is usually best to let Epetra figure out the
column map.
I recommend you look at the slides from "Trilinos 102: Advanced
Concepts" at
http://trilinos.sandia.gov/events/trilinos_user_group_2007/presentations/Trilinos102.ppt
Erik
On Fri, 2008-07-18 at 10:44 -0600, Tudor Buican wrote:
> Hi, Alan.
>
> Thanks for the prompt reply. Indeed, the domain and range maps are
> confusing, especially since the online documentation really lacks
> detail. My "understanding" (based more on my general assumptions than on
> what's in the documentation) was that, in order to compute p=A*q, the
> range map for A had to be the same as the map for p, and the domain map
> for A the same as that for q. Is there a better/more detailed discussion
> of these maps than the online documentation? Something like "Trilinos
> for Dummies" would come in handy here...
>
> In the meantime, I seem to have found a quick fix to my problem by
> building the Crs matrix as a square matrix with the larger of the two
> dimensions (using p's map as both range and domain map) and padding q
> with zeros to the larger dimension. I guess the price for this is that
> one has to store the extra vector elements.
>
> Anyway, please let me know if there is extra literature on the maps.
> Also, any further suggestions would be greatly appreciated.
>
> Thanks again,
> -Tudor
>
> On Fri, 2008-07-18 at 10:13 -0600, Williams, Alan B wrote:
> > Hi,
> >
> > One thing about epetra that newer users often struggle with is the definition of the 4 maps that a matrix has: row-map, column-map, range-map and domain-map.
> >
> > I've had success using rectangular matrices from file by doing this:
> >
> > Epetra_Comm ecomm = ...
> > Epetra_Map* rowmap = NULL;
> > Epetra_Map* colmap = NULL;
> > Epetra_Map* domainmap = NULL;
> > Epetra_Map* rangemap = NULL;
> > Epetra_CrsMatrix* A = NULL;
> >
> > EpetraExt::MatrixMarketFileToBlockMaps(filename, ecomm, rowmap, colmap, rangemap, domainmap);
> >
> > EpetraExt::MatrixMarketFileToCrsMatrix(filename, *rowmap, *colmap, *rangemap, *domainmap, A);
> >
> > The key is to not try to define all the maps yourself. The relationships between the different maps is often tricky to get correct.
> >
> > The test program for the EpetraExt::MatrixMatrix::Multiply function performs these operations, and the test involves rectangular matrices in parallel. You can browse through that program here: packages/epetraext/test/MatrixMatrix/cxx_main.cpp
> >
> > Note that this program performs matrix-matrix multiply, I'm not sure I've specifically exercised the matrix-vector multiply with rectangular matrices. So there is a possibility that there is a bug in there. But try the above method of letting the maps be defined and populated by Trilinos, and see if that helps.
> >
> > Alan
> >
> >
> >
> > > -----Original Message-----
> > > From: trilinos-users-bounces at software.sandia.gov
> > > [mailto:trilinos-users-bounces at software.sandia.gov] On Behalf
> > > Of Tudor Buican
> > > Sent: Friday, July 18, 2008 7:53 AM
> > > To: trilinos-users at software.sandia.gov
> > > Subject: [Trilinos-Users] Resend: Problem with Multiply()
> > >
> > > I'm resending this message which may have not reached the list.
> > >
> > > ==============================================================
> > > Hi, everybody.
> > >
> > > I am trying to multiply a rectangular Epetra_CrsMatrix, which I
> > > construct from an MM file, by an Epetra_Vector, using the
> > > Multiply(...)
> > > method. It all works fine if I read in an MM file for a square matrix,
> > > but I run into problems with files for rectangular matrices.
> > >
> > > 1. Here is my MM file for a simple 12X10 matrix:
> > >
> > > %%MatrixMarket matrix coordinate real general
> > > % Generated 02-Jul-2008
> > > 12 10 10
> > > 1 1 1
> > > 2 2 1
> > > 5 3 1
> > > 6 4 1
> > > 7 5 1
> > > 9 6 1
> > > 9 7 1
> > > 10 8 1
> > > 11 9 1
> > > 12 10 1
> > >
> > > 2. I read in the file with
> > >
> > > Epetra_CrsMatrix* pNull;
> > > EpetraExt::MatrixMarketFileToCrsMatrix(argv[2], mMap, mMap, nMap,
> > > pNull);
> > >
> > > where mMap and nMap are constructed as
> > >
> > > Epetra_Map mMap(M, 0, Comm);
> > > Epetra_Map nMap(N, 0, Comm);
> > >
> > > with M=12 (No. of rows) and N=10 (No. of columns). The
> > > resulting matrix,
> > > pointed to by pNull, prints out as
> > >
> > > Number of Global Rows = 12
> > > Number of Global Cols = 10
> > > Number of Global Diagonals = 2
> > > Number of Global Nonzeros = 10
> > > Global Maximum Num Entries = 2
> > > ** Matrix is Lower Triangular **
> > >
> > > Number of My Rows = 12
> > > Number of My Cols = 10
> > > Number of My Diagonals = 2
> > > Number of My Nonzeros = 10
> > > My Maximum Num Entries = 2
> > >
> > > Processor Row Index Col Index Value
> > > 0 0 0 1
> > > 0 1 1 1
> > > 0 4 2 1
> > > 0 5 3 1
> > > 0 6 4 1
> > > 0 8 5 1
> > > 0 8 6 1
> > > 0 9 7 1
> > > 0 10 8 1
> > > 0 11 9 1
> > >
> > > So far, so good.
> > >
> > > 3. However, the domain map for this matrix, as returned by pNull-
> > > >DomainMap(), is not nMap with its 10 global elements, but a
> > > map with 12
> > > global elements, just like the row and range maps. Moreover,
> > > the result
> > > is the same if I use nMap and mMap for range and domain maps,
> > > respectively!
> > >
> > > 4. If I try to multiply the above matrix by q, a 10-element
> > > Epetra_Vector constructed with nMap, with the result in p, a
> > > 12-element
> > > vector constructed with mMap,
> > >
> > > pNull->Multiply(false, q, p);
> > >
> > > I get the following error messages:
> > >
> > > Epetra ERROR -3,
> > > ../../../../packages/epetra/src/Epetra_DistObject.cpp,
> > > line 110
> > > Epetra ERROR -3, ../../../../packages/epetra/src/Epetra_CrsMatrix.cpp,
> > > line 2353
> > >
> > > (I'm using Trilinos v. 8.0.4.)
> > >
> > > 5. However,
> > >
> > > pNull->Multiply(true, q, p);
> > >
> > > works and q is multiplied by the transposed matrix, but as if
> > > this was a
> > > 12X12 problem, with q and the matrix being padded with 0s.
> > >
> > > ========================
> > >
> > > Can anybody figure out what it is that I'm doing wrong?
> > >
> > > Thanks in advance,
> > > -Tudor
> > >
> > > --
> > > Tudor N. Buican, PhD
> > > Managing Member
> > > SEA LLC
> > > phone: 505-271-9925, 505-818-7303
> > > fax: 505-271-9925
> > > email: tudor at timb.com
> > >
> > >
> > >
> > > _______________________________________________
> > > Trilinos-Users mailing list
> > > Trilinos-Users at software.sandia.gov
> > > http://software.sandia.gov/mailman/listinfo/trilinos-users
> > >
> >
>
> --
> Tudor N. Buican, PhD
> Managing Member
> SEA LLC
> phone: 505-271-9925, 505-818-7303
> fax: 505-271-9925
> email: tudor at timb.com
>
>
>
> _______________________________________________
> 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