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