[petsc-users] class templates in C++ and Petsc functions

Matthew Knepley knepley at gmail.com
Mon Dec 13 12:01:48 CST 2010


What is the error?

  Matt

On Mon, Dec 13, 2010 at 3:11 PM, Umut Tabak <u.tabak at tudelft.nl> wrote:

> Dear all,
>
> 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
> and T1 for Mat in Petsc. I can also get some comments on the code ;)
>
> Best regards,
> Umut
>
> template <class T, class T1>
> int converter<T, T1>::convertMBo2Pe( const T& A,
>                                                               T1 A_ ){
>    PetscErrorCode ierr;
>    int cntNnz = 0;
>    typedef typename T::iterator1 i1_t;
>    typedef typename T::iterator2 i2_t;
>    //int nnz[ooFelieMatrix.size1()];
>    int nnz[A.size1()];
>    unsigned ind=0;
>    //get information about the matrix
>
>    double* vals = NULL;
>    for (i1_t i1 = A.begin1(); i1 != A.end1(); ++i1)
>    {
>      nnz[ind] = distance(i1.begin(), i1.end());
>      ind++;
>    }
>    // create the matrix depending
>    // on the values of the nonzeros
>    // on each row
>    ierr = MatCreateSeqAIJ( PETSC_COMM_SELF, A.size1(),
>                                                  A.size2(), cntNnz, nnz,
>                                                  A_ );
>    PetscInt rInd = 0, cInd=0;
>    PetscInt* rCount, dummy;
>    rCount = &dummy;
>    // pointer to values in a row
>    PetscScalar*   valsOfRowI = NULL;
>    PetscInt*  colIndexOfRowI = NULL;
>    PetscInt rC = 1;
>    for(i1_t i1 = A.begin1(); i1 != A.end1(); ++i1)
>    {
>      // allocate space for the values of row I
>      valsOfRowI     = new PetscScalar[nnz[rInd]];
>      colIndexOfRowI = new PetscInt[nnz[rInd]];
>      for(i2_t i2 = i1.begin(); i2 != i1.end(); ++i2)
>      {
>         colIndexOfRowI[cInd] = i2.index2();
>         valsOfRowI[cInd]     = *i2;
>         cInd++;
>      }
>      // setting one row each time
>      *rCount = rInd;
>      MatSetValues( A_, rC, rCount, nnz[rInd],
>                                  colIndexOfRowI, valsOfRowI,
>                  INSERT_VALUES );
>      // delete
>      delete [] valsOfRowI;
>      delete [] colIndexOfRowI;
>      rInd++; cInd = 0;
>    }
>    //
>    MatAssemblyBegin( A_, MAT_FINAL_ASSEMBLY );
>    MatAssemblyEnd( A_, MAT_FINAL_ASSEMBLY );
>    // return
>    return 0;
> }
>
> --
>  - Hope is a good thing, maybe the best of things
>   and no good thing ever dies...
>  The Shawshank Redemption, replique of Tim Robbins
>
>


-- 
What most experimenters take for granted before they begin their experiments
is infinitely more interesting than any results to which their experiments
lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20101213/e89e7671/attachment.htm>


More information about the petsc-users mailing list