how do you access the nonzero elements in SeqAIJ matrices
Ahmed El Zein
ahmed at azein.com
Mon Aug 4 11:01:30 CDT 2008
On Mon, 2008-08-04 at 10:38 -0500, Matthew Knepley wrote:
> On Mon, Aug 4, 2008 at 9:58 AM, Ahmed El Zein <ahmed at azein.com> wrote:
> > On Mon, 2008-08-04 at 04:17 -0500, Matthew Knepley wrote:
> >> On Mon, Aug 4, 2008 at 3:14 AM, Ahmed El Zein <ahmed at azein.com> 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.
> >>
> >> You can use MatGetArray().
> > Thanks. The man page states that:
> > The result of this routine is dependent on the underlying matrix data
> > structure, and may not even work for certain matrix types.
> >
> > How do I find out which matrix types support it? and is there a method
> > that works across all matrix types?
>
> 1) There is nothing that works for all matrix types
>
> 2) There should NEVER be something that works for all matrix type. That is
> the point of using an interface, so we can use arbitrary implementation
> structures underneath.
Shouldn't that be the opposite? Isn't the whole idea of an interface, to
have a set of functions that will work on all matrix types, regardless
of implementation.
Thanks for the info though. If I can't get direct access I will used
MatGetRowIJ() + MatGetArray() and hope that the matrices I come across
will support them.
Ahmed
>
> Matt
>
> > Thanks,
> > Ahmed
> >>
> >> Matt
> >>
> >> > 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;
> >> >
> >> > 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)
> > What is the correct way to get the number of nonzeros?
> >
> >> >
> >> > Can someone please explain when I am doing wrong?
> >> >
> >> > Ahmed
> >> >
> >> >
> >>
> >>
> >>
> >
> >
>
>
>
More information about the petsc-dev
mailing list