← Back to team overview

dolfin team mailing list archive

Re: matrix-matrix multiplication

 

On Fri, Apr 17, 2009 at 08:33:58PM -0500, arizumi@xxxxxxxxxxxx wrote:
> ---- Original message ----
> >Date: Mon, 13 Apr 2009 10:25:44 +0800
> >From: "Garth N. Wells" <gnw20@xxxxxxxxx>  
> >Subject: Re: [DOLFIN-dev] matrix-matrix multiplication  
> >To: arizumi@xxxxxxxxxxxx
> >Cc: dolfin-dev@xxxxxxxxxx
> >
> >
> >
> >arizumi@xxxxxxxxxxxx wrote:
> >> hi,  
> >> I've been having a problem of calculating sparse matrix-matrix multiplication using uBLASSparseMatrix.  
> >> 
> >> I declare matrices A and B as following.
> >> 
> >> Matrix A0;
> >> uBLASSparseMatrix& A(A0.down_cast<uBLASSparseMatrix>());
> >> Matrix B0;
> >> uBLASSparseMatrix& B(B0.down_cast<uBLASSparseMatrix>());
> >> 
> >> After assigning matrix values, use "prod" from boost to multiply.  but, I don't know where to return.  From compiler error 'ublas_sparse_matrix' is not a member of ‘boost::numeric::ublas’.  even if I use 'matrix' as follows, I don't know how to make this into uBLASSparseMatrix.
> >> 
> >> boost::numeric::ublas::matrix<double> C;
> >> C = boost::numeric::ublas::prod(A.mat(), B.mat()); 
> >> 
> >> My first guess was to declare 
> >> uBLASSpareseMatrix& C1(C); 
> >> but this will give a compiler error "‘uBLASSpareseMatrix’ was not declared in this scope"
> >> 
> >> I would greatly appreciate any helpful suggestion.
> >
> >Try
> >
> >    uBLASSpare Matrix A;
> >     ublas_sparse_matrix& B = A.mat();
> >
> >B will be a uBLAS object (ublas_sparse_matrix is a DOLFIN typedef for 
> >the uBLAS matrix which underlies uBLASSpareMatrix).
> >
> >Garth
> >
> >
> >> Thank you,
> >> Nana Arizumi
> >> _______________________________________________
> >> DOLFIN-dev mailing list
> >> DOLFIN-dev@xxxxxxxxxx
> >> http://www.fenics.org/mailman/listinfo/dolfin-dev
> >
> >
> 
> Thank you,
> I am still having a problem.  What I want to solve is
> (A+B^(-1)*C) u = f
> where A, B, and C are the matrices from bilinear form, u and f are vectors.
> 
> I realized there are no inverse or matrix-matrix multiplication in GenericMatrix, so I am trying to use uBLASSparseMatrix.
> 
> I have a couple of questions related to this, and I was wondering if anybody could provide any assistance/clarity.
> 
> 1.   
> uBLASSpare Matrix A;
> ublas_sparse_matrix& B = A.mat(); 
> uBLASSparseMatrix C(ublas_sparse_matrix& B);
> 
> Is this how I should construct C using Boost matrix?

I guess you want to do

  uBLASSparseMatrix A;
  ublas_sparse_matrix& B = A.mat(); 
  ublas_sparse_matrix C(B);

> 2.
> LUSolver is not usable for uBLAS matrices as I understand from manual.  I should use solve function from uBLASSParseMatrix or I can use uBLASKrylovMatrix.  Both of the cases I need uBLASVector, but my u vector is a GenericVector, so I need to down_cast this. 
> I tried two ways
> uBLASVector& u1(u.down_cast<uBLASVector>());
> uBLASVector& u1(static_cast<uBLASVector&>(u));
> but, none of the solve are working.  What am I missing?

Don't trust the manual. You should be able to use uBlasSparseMatrix
with LUSolver (and solve()).

> 3.
> I set linear algebra backend as uBLAS and following code 
> cout << "Matrix backend = " << dolfin_get("linear algebra backend") << endl;
> also say uBLAS, but when I try to use solve function from uBLASSparseMatrix I am receiving PETSC ERROR and crush.  Why is it?

Strange. I wouldn't think PETSc would be initialized unless you create
any object of PETSc type.

-- 
Anders

Attachment: signature.asc
Description: Digital signature


References