What is the error?<div><br></div><div>  Matt<br><br><div class="gmail_quote">On Mon, Dec 13, 2010 at 3:11 PM, Umut Tabak <span dir="ltr">&lt;<a href="mailto:u.tabak@tudelft.nl">u.tabak@tudelft.nl</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Dear all,<br>
<br>
I was trying to write a simple class template code to interface Petsc matrices along with Boost sparse matrices and vice versa. However, my first naive try did not work out of the box, since the template class requires some functions from PETSc libraries and these functions should be located in the object files to be able to compile. Since class template is header only and there is no object code generation, it can not find the PETSc library functions which is logical. I am also new to templates in C++. I just gave a try to create a template class instead of code duplication however it did not end up as expected. Are there some smarter ways to accomplish this task. The function analyzes a boost csr matrix and sets the rows of a Petsc matrix. T is for boost matrices<br>

and T1 for Mat in Petsc. I can also get some comments on the code ;)<br>
<br>
Best regards,<br>
Umut<br>
<br>
template &lt;class T, class T1&gt;<br>
int converter&lt;T, T1&gt;::convertMBo2Pe( const T&amp; A,<br>
                                                               T1 A_ ){<br>
    PetscErrorCode ierr;<br>
    int cntNnz = 0;<br>
    typedef typename T::iterator1 i1_t;<br>
    typedef typename T::iterator2 i2_t;<br>
    //int nnz[ooFelieMatrix.size1()];<br>
    int nnz[A.size1()];<br>
    unsigned ind=0;<br>
    //get information about the matrix<br>
<br>
    double* vals = NULL;<br>
    for (i1_t i1 = A.begin1(); i1 != A.end1(); ++i1)<br>
    {<br>
      nnz[ind] = distance(i1.begin(), i1.end());<br>
      ind++;<br>
    }<br>
    // create the matrix depending<br>
    // on the values of the nonzeros<br>
    // on each row<br>
    ierr = MatCreateSeqAIJ( PETSC_COMM_SELF, A.size1(),<br>
                                                  A.size2(), cntNnz, nnz,<br>
                                                  A_ );<br>
    PetscInt rInd = 0, cInd=0;<br>
    PetscInt* rCount, dummy;<br>
    rCount = &amp;dummy;<br>
    // pointer to values in a row<br>
    PetscScalar*   valsOfRowI = NULL;<br>
    PetscInt*  colIndexOfRowI = NULL;<br>
    PetscInt rC = 1;<br>
    for(i1_t i1 = A.begin1(); i1 != A.end1(); ++i1)<br>
    {<br>
      // allocate space for the values of row I<br>
      valsOfRowI     = new PetscScalar[nnz[rInd]];<br>
      colIndexOfRowI = new PetscInt[nnz[rInd]];<br>
      for(i2_t i2 = i1.begin(); i2 != i1.end(); ++i2)<br>
      {<br>
         colIndexOfRowI[cInd] = i2.index2();<br>
         valsOfRowI[cInd]     = *i2;<br>
         cInd++;<br>
      }<br>
      // setting one row each time<br>
      *rCount = rInd;<br>
      MatSetValues( A_, rC, rCount, nnz[rInd],<br>
                                  colIndexOfRowI, valsOfRowI,<br>
                  INSERT_VALUES );<br>
      // delete<br>
      delete [] valsOfRowI;<br>
      delete [] colIndexOfRowI;<br>
      rInd++; cInd = 0;<br>
    }<br>
    //<br>
    MatAssemblyBegin( A_, MAT_FINAL_ASSEMBLY );<br>
    MatAssemblyEnd( A_, MAT_FINAL_ASSEMBLY );<br>
    // return<br>
    return 0;<br>
}<br><font color="#888888">
<br>
-- <br>
 - Hope is a good thing, maybe the best of things<br>
   and no good thing ever dies...<br>
 The Shawshank Redemption, replique of Tim Robbins<br>
<br>
</font></blockquote></div><br><br clear="all"><br>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener<br>

</div>