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

Reply via email to