[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