[petsc-users] MatEqual and explicit zero behaviour

Jørgen Kvalsvik jorgekva at stud.ntnu.no
Wed Jan 21 06:25:17 CST 2015


Hi,

I was unable to find this in the PETSc docs nor any relevant example 
through search engines.

I have two matrices, A and B.

A:
PetscScalar values[] = {
10.0, 0, 0, 0, 0, 5.72,
0.2, 0, 0, 0, 0, 0,
0, 0, 4.2, 0, 0, 0,
0, 0, 0, 3.4, 0, 0,
0, 0, 3.14, 0, 0, 0,
0, 0, 0, 0, 0, 0 };

And an array [0..6] passed to both row and columns in my MatSetValues call.
err = MatSetValues( A,
       6, indices,
       6, indices,
       values, INSERT_VALUES );

B is constructed from CSR:
PetscInt csr_rows[] = { 0, 2, 3, 4, 5, 6, 6 };
PetscInt csr_cols[] = { 0, 5, 0, 2, 3, 2 };
PetscScalar csr_vals[] = { 10.0, 5.72, 0.2, 4.2, 3.4, 3.14 };

for( int i = 0; i < rows - 1; ++i ) {
     PetscInt row_entries = csr_rows[ i + 1 ] - csr_rows[ i ];

     PetscInt row_index[] = { i };
     PetscInt offset = csr_rows[ i ];

     err = MatSetValues( A,
           1, row_index,
           row_entries, csr_cols + offset,
           csr_vals + offset, INSERT_VALUES );
}

Printing them with PetscView gives:

A:
Matrix Object: 1 MPI processes
   type: seqaij
row 0: (0, 10)  (1, 0)  (2, 0)  (3, 0)  (4, 0)  (5, 5.72)
row 1: (0, 0.2)  (1, 0)  (2, 0)  (3, 0)  (4, 0)  (5, 0)
row 2: (0, 0)  (1, 0)  (2, 4.2)  (3, 0)  (4, 0)  (5, 0)
row 3: (0, 0)  (1, 0)  (2, 0)  (3, 3.4)  (4, 0)  (5, 0)
row 4: (0, 0)  (1, 0)  (2, 3.14)  (3, 0)  (4, 0)  (5, 0)
row 5: (0, 0)  (1, 0)  (2, 0)  (3, 0)  (4, 0)  (5, 0)

B:
Matrix Object: 1 MPI processes
   type: seqaij
row 0: (0, 10)  (5, 5.72)
row 1: (0, 0.2)
row 2: (2, 4.2)
row 3: (3, 3.4)
row 4: (2, 3.14)
row 5:

Which, as far as I can tell, are identical matrices.

But here's the problem. When I compare them with MatEqual it gives me 
false, which I did not expect. Is there some undocumented behaviour 
regarding explicit and implicit zeroes, and is this intentional? Is it 
not possible to compare matrices with different structures?

Thanks


More information about the petsc-users mailing list