how do you access the nonzero elements in SeqAIJ matrices
Ahmed El Zein
ahmed at azein.com
Mon Aug 4 09:53:46 CDT 2008
On Mon, 2008-08-04 at 07:57 -0500, Barry Smith wrote:
> On Aug 4, 2008, at 3:14 AM, Ahmed El Zein wrote:
>
> > I am working on a project where I would like to copy a sparse matrix
> > in
> > CSR format.
> >
> > I have tried MatGetRow() which works OK but I would really like to get
> > pointers to the 3 arrays directly.
> >
> > I also tried MatGetRowIJ() which allows me to get the i and j arrays
> > but
> > I can't see how to access the nonzero elements.
> >
> > and finally I attempted to access the arrays directly like this:
> > Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data;
> > MatScalar *val = a->a;
> > PetscInt *ptr = a->i;
> > PetscInt *ind = a->j;
> >
> Make sure this is a MPI_SeqAIJ matrix.
I thought that this would work with any seqaij matrix. does it have to
be MPISEQAIJ or can it just be MATSEQAIJ?
>
> It is only valid to access this data after you have put the values
> into
> the matrix and called MatAssemblyBegin() and MatAssemblyEnd().
my code looks like:
ierr = MatCreate(PETSC_COMM_WORLD,&A); CHKERRQ(ierr);
ierr = MatSetSizes(A,M,N,M,N); CHKERRQ(ierr);
ierr = MatSetType(A, MATSEQAIJ); CHKERRQ(ierr);
ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
[...lots of MatSetValue() calls...]
ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
> If you are creating a matrix from i, j, and a look at
> MatCreateSeqAIJWithArrays()
I would like to extract the data from already assembled matrix (to copy
to a GPU actually).
Ahmed
>
> Barry
>
>
> > However when accessing directly I get different values for ptr and
> > SIGSEGV when accessing val or ind.
> >
> > also I get a bogus number for a->nz (134630032 instead of 21)
> >
> > Can someone please explain when I am doing wrong?
> >
> > Ahmed
> >
More information about the petsc-dev
mailing list