However, you have realized A*B(A is AIJ, B is dense matrix) to my knowledge. <br>PETSc is&nbsp;the Portable, Extensible Toolkit for Scientific computation,&nbsp;not&nbsp;the Sparse&nbsp;Portable, Extensible Toolkit for Scientific computation&nbsp;:).       <br>
It&nbsp;is easy to realize A*B(A is dense matrix, B is AIJ)?<br> <br>Thanks,<br>Yujie<br><br><div><span class="gmail_quote">On 3/1/08, <b class="gmail_sendername">Matthew Knepley</b> &lt;<a href="mailto:knepley@gmail.com">knepley@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; margin-left: 0.80ex; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; padding-left: 1ex">
If you want dense matrices, I would suggest PLAPACK/FLAME instead of PETSc. We<br> specialize in sparse matrices.<br><br>&nbsp;&nbsp;Thanks,<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Matt<br><br><br> On Sat, Mar 1, 2008 at 12:38 PM, Yujie &lt;<a href="mailto:recrusader@gmail.com">recrusader@gmail.com</a>&gt; wrote:<br>
 &gt; Dear Barry:<br> &gt;<br> &gt; I just find MatMatMult() doesn&#39;t support Dense Matrix. I want to do A*B (A<br> &gt; is dense matrix, B is AIJ). I think a possible method is to convert A to<br> &gt; AIJ, however, it will take much more memory than using dense matrix, I<br>
 &gt; think. Because AIJ needs to save positions and corresponding values. Do you<br> &gt; have any good idea? Thanks a lot.<br> &gt;<br> &gt; Regards,<br> &gt; Yujie<br> &gt;<br> &gt; On 3/1/08, Barry Smith &lt;<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>&gt; wrote:<br>
 &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt; On Mar 1, 2008, at 2:01 AM, Yujie wrote:<br> &gt; &gt;<br> &gt; &gt; Dear Barry:<br> &gt; &gt;<br> &gt; &gt; I can&#39;t understand several problems as follows about codes. Could you give<br>
 &gt; me some explanations? thanks a lot.<br> &gt; &gt;<br> &gt; &gt; 1. About MatGetArray()<br> &gt; &gt; I check the codes of PETSc. I find only matrix types, SeqAij and MPIDense,<br> &gt; support this fnction. If I want to use SuperLU_dist or Spooles. I need to<br>
 &gt; convert matrix A into corresponding type<br> &gt; &gt; before I call MatMatSolve(). If it is, MatGetArray() doesn&#39;t work, I<br> &gt; think.<br> &gt; &gt;<br> &gt; &gt;&nbsp;&nbsp; MatGetArray() is called on B and X, it is not called on A. B and A must<br>
 &gt; be dense or the whole thing doesn&#39;t make<br> &gt; &gt; sense, since X will always end up being dense.<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt; 2. A-&gt;hdr.comm should be A-&gt;comm?<br>
 &gt; &gt;<br> &gt; &gt; Yes, for your version of PETSc<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt; 3.<br> &gt; &gt; for (i=0; i&lt;N; i++) {<br> &gt; &gt; ierr = VecPlaceArray(b,bb + i*m);CHKERRQ(ierr);<br> &gt; &gt; ierr = VecPlaceArray(x,xx + i*m);CHKERRQ(ierr);<br>
 &gt; &gt; ierr = MatSolve(A,b,x);CHKERRQ(ierr);<br> &gt; &gt; }<br> &gt; &gt;<br> &gt; &gt; should be<br> &gt; &gt;<br> &gt; &gt; for (i=0; i&lt;N; i++) {<br> &gt; &gt; ierr = VecPlaceArray(b,bb + i*m);CHKERRQ(ierr);<br>
 &gt; &gt; ierr = MatSolve(A,b,x);CHKERRQ(ierr);<br> &gt; &gt; ierr = VecPlaceArray(xx + i*m,x);CHKERRQ(ierr);<br> &gt; &gt; }<br> &gt; &gt; MatRestoreArray(B,&amp;xx);<br> &gt; &gt;<br> &gt; &gt; First replace b with bb+i*m, and solve Ax=b, final replace xx+i*m with x.<br>
 &gt; &gt;<br> &gt; &gt; No, you misunderstand what VecPlaceArray() does. The code above will solve<br> &gt; the columns in the wrong place.<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt; Yes, I did forget the MatRestoreArray(), thanks for pointing that out.<br>
 &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;Barry<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt; After finishing the loop, the code should call MatRestoreArray() to<br> &gt; restore matrix B.<br> &gt; &gt;<br>
 &gt; &gt; Regards,<br> &gt; &gt; Yujie<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt; On 3/1/08, Barry Smith &lt;<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>&gt; wrote:<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;Please edit the file src/mat/interface/matrix.c and remove the<br>
 &gt; &gt; &gt; function MatMatSolve(). Replace it with the following two functions,<br> &gt; &gt; &gt; then run &quot;make lib shared&quot; in that directory. Please let us know at<br> &gt; <a href="mailto:petsc-maint@mcs.anl.gov">petsc-maint@mcs.anl.gov</a><br>
 &gt; &gt; &gt;&nbsp;&nbsp; if it crashes or produces incorrect<br> &gt; &gt; &gt; results.<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Barry<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;<br> &gt; &gt; &gt; #undef __FUNCT__<br>
 &gt; &gt; &gt; #define __FUNCT__ &quot;MatMatSolve_Basic&quot;<br> &gt; &gt; &gt; PetscErrorCode PETSCMAT_DLLEXPORT MatMatSolve_Basic(Mat A,Mat B,Mat X)<br> &gt; &gt; &gt; {<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscErrorCode ierr;<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;Vec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b,x;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscInt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m,N,i;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscScalar&nbsp;&nbsp;&nbsp;&nbsp;*bb,*xx;<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscFunctionBegin;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = MatGetArray(B,&amp;bb);CHKERRQ(ierr);<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = MatGetArray(X,&amp;xx);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = MatGetLocalSize(B,&amp;m,PETSC_NULL);CHKERRQ(ierr);&nbsp;&nbsp;/* number<br> &gt; &gt; &gt; local rows */<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = MatGetSize(B,PETSC_NULL,&amp;N);CHKERRQ(ierr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* total<br>
 &gt; &gt; &gt; columns in dense matrix */<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = VecCreateMPIWithArray(A-<br> &gt; &gt; &gt;&nbsp;&nbsp; &gt;hdr.comm,m,PETSC_DETERMINE,PETSC_NULL,&amp;b);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = VecCreateMPIWithArray(A-<br>
 &gt; &gt; &gt;&nbsp;&nbsp; &gt;hdr.comm,m,PETSC_DETERMINE,PETSC_NULL,&amp;x);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;for (i=0; i&lt;N; i++) {<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ierr = VecPlaceArray(b,bb + i*m);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ierr = VecPlaceArray(x,xx + i*m);CHKERRQ(ierr);<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ierr = MatSolve(A,b,x);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = VecDestroy(b);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = VecDestroy(x);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscFunctionReturn(0);<br>
 &gt; &gt; &gt; }<br> &gt; &gt; &gt;<br> &gt; &gt; &gt; #undef __FUNCT__<br> &gt; &gt; &gt; #define __FUNCT__ &quot;MatMatSolve&quot;<br> &gt; &gt; &gt; /*@<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; MatMatSolve - Solves A X = B, given a factored matrix.<br>
 &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Collective on Mat<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Input Parameters:<br> &gt; &gt; &gt; +&nbsp;&nbsp;mat - the factored matrix<br> &gt; &gt; &gt; -&nbsp;&nbsp;B - the right-hand-side matrix&nbsp;&nbsp;(dense matrix)<br>
 &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Output Parameter:<br> &gt; &gt; &gt; .&nbsp;&nbsp;B - the result matrix (dense matrix)<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Notes:<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; The matrices b and x cannot be the same.&nbsp;&nbsp;I.e., one cannot<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; call MatMatSolve(A,x,x).<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Notes:<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Most users should usually employ the simplified KSP interface for<br> &gt; &gt; &gt; linear solvers<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; instead of working directly with matrix algebra routines such as<br>
 &gt; &gt; &gt; this.<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; See, e.g., KSPCreate(). However KSP can only solve for one vector<br> &gt; &gt; &gt; (column of X)<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; at a time.<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Level: developer<br>
 &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp; Concepts: matrices^triangular solves<br> &gt; &gt; &gt;<br> &gt; &gt; &gt; .seealso: MatMatSolveAdd(), MatMatSolveTranspose(),<br> &gt; &gt; &gt; MatMatSolveTransposeAdd(), MatLUFactor(), MatCholeskyFactor()<br>
 &gt; &gt; &gt; @*/<br> &gt; &gt; &gt; PetscErrorCode PETSCMAT_DLLEXPORT MatMatSolve(Mat A,Mat B,Mat X)<br> &gt; &gt; &gt; {<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscErrorCode ierr;<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscFunctionBegin;<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscValidHeaderSpecific(A,MAT_COOKIE,1);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscValidType(A,1);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscValidHeaderSpecific(B,MAT_COOKIE,2);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscValidHeaderSpecific(X,MAT_COOKIE,3);<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscCheckSameComm(A,1,B,2);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscCheckSameComm(A,1,X,3);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;if (X == B) SETERRQ(PETSC_ERR_ARG_IDN,&quot;X and B must be different<br> &gt; &gt; &gt; matrices&quot;);<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;if (!A-&gt;factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,&quot;Unfactored<br> &gt; &gt; &gt; matrix&quot;);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;if (A-&gt;cmap.N != X-&gt;rmap.N) SETERRQ2(PETSC_ERR_ARG_SIZ,&quot;Mat A,Mat<br>
 &gt; &gt; &gt; X: global dim %D %D&quot;,A-&gt;cmap.N,X-&gt;rmap.N);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;if (A-&gt;rmap.N != B-&gt;rmap.N) SETERRQ2(PETSC_ERR_ARG_SIZ,&quot;Mat A,Mat<br> &gt; &gt; &gt; B: global dim %D %D&quot;,A-&gt;rmap.N,B-&gt;rmap.N);<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;if (A-&gt;rmap.n != B-&gt;rmap.n) SETERRQ2(PETSC_ERR_ARG_SIZ,&quot;Mat A,Mat<br> &gt; &gt; &gt; B: local dim %D %D&quot;,A-&gt;rmap.n,B-&gt;rmap.n);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;if (!A-&gt;rmap.N &amp;&amp; !A-&gt;cmap.N) PetscFunctionReturn(0);<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = MatPreallocated(A);CHKERRQ(ierr);<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = PetscLogEventBegin(MAT_MatSolve,A,B,X,0);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;if (!A-&gt;ops-&gt;matsolve) {<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ierr = PetscInfo1(A,&quot;Mat type %s using basic MatMatSolve&quot;,<br>
 &gt; &gt; &gt; ((PetscObject)A)-&gt;type_name);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ierr = MatMatSolve_Basic(A,B,X);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ierr = (*A-&gt;ops-&gt;matsolve)(A,B,X);CHKERRQ(ierr);<br>
 &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = PetscLogEventEnd(MAT_MatSolve,A,B,X,0);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;ierr = PetscObjectStateIncrease((PetscObject)X);CHKERRQ(ierr);<br> &gt; &gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;PetscFunctionReturn(0);<br>
 &gt; &gt; &gt;<br> &gt; &gt; &gt; }<br> &gt; &gt; &gt;<br> &gt; &gt; &gt; On Feb 29, 2008, at 6:46 PM, Yujie wrote:<br> &gt; &gt; &gt;<br> &gt; &gt; &gt; &gt; Hi, everyone<br> &gt; &gt; &gt; &gt;<br> &gt; &gt; &gt; &gt; I am considering to add a parallel MatMatSolve() into PETSc based on<br>
 &gt; &gt; &gt; &gt; SuperLu_DIST or Spooles. If I want to use it like current sequential<br> &gt; &gt; &gt; &gt; MatMatSolve() in the application codes, how to do it? Could you give<br> &gt; &gt; &gt; &gt; me some examples about how to add a new function?<br>
 &gt; &gt; &gt; &gt; thanks a lot.<br> &gt; &gt; &gt; &gt;<br> &gt; &gt; &gt; &gt; Regards,<br> &gt; &gt; &gt; &gt; Yujie<br> &gt; &gt; &gt;<br> &gt; &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt;<br> &gt;<br> &gt;<br>
<br><br><br><br>--<br> What most experimenters take for granted before they begin their<br> experiments is infinitely more interesting than any results to which<br> their experiments lead.<br> -- Norbert Wiener<br></blockquote>
</div><br>