how do you access the nonzero elements in SeqAIJ matrices

Matthew Knepley knepley at gmail.com
Mon Aug 4 10:38:39 CDT 2008


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.

   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
>> >
>> >
>>
>>
>>
>
>



-- 
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




More information about the petsc-dev mailing list