[petsc-users] Loading a PETsc matrix with matrix data in CSR format?

Klaus Burkart k_burkart at yahoo.com
Tue Oct 3 06:40:35 CDT 2017


I am still struggling to load my matrix in a PETSc matrix.

I tried the following code which is part of a c++ function which converts the original matrix to CSR fromat and should load a PETSc matrix.

    Mat M;
    // fill PETSc matrix
    MatCreateSeqAIJWithArrays(PETSC_COMM_WORLD, n, n, rows, cols, vals, M)
but I get the following error message when compiling the code:
 error: cannot convert ‘Mat {aka _p_Mat*}’ to ‘_p_Mat**’ for argument ‘7’ to ‘PetscErrorCode MatCreateSeqAIJWithArrays(MPI_Comm, PetscInt, PetscInt, PetscInt*, PetscInt*, PetscScalar*, _p_Mat**)’
     MatCreateSeqAIJWithArrays(PETSC_COMM_WORLD, n, n, rows, cols, vals, M)

What's wrong with this?

    Barry Smith <bsmith at mcs.anl.gov> schrieb am 16:38 Sonntag, 17.September 2017:

 1)  MatSetValues() has absolutely nothing to do with the format used internally by PETSc to store the matrix. MatSetValues() is used to convey blocks of values into the matrix. 

  2) If you want to load a matrix onto multiple processes from a file NEVER write your own parallel ASCII matrix reader. Instead in either C, C++, Python, or Matlab write a routine that reads in the matrix SEQUENTIALLY and then saves it with MatView() and a binary viewer. You can then load the matrix easily and efficiently in PETSc in parallel with MatLoad

  3) If you have matrix already in CSR format you can use MatCreateSeqAIJWithArrays()


> On Sep 17, 2017, at 9:25 AM, Klaus Burkart <k_burkart at yahoo.com> wrote:
> The matrix import function looks like this:
> void csr2pet
> (
>    const Foam::lduMatrix & matrix,
>    petsc_declaration<Type> & petsc_matrix  // How to declare the PETsc matrix to be filled?
> )
> {
>    int n = matrix.diag().size(); // small case n = 40800
>    int nnz = matrix.lower().size() + matrix.upper().size() + matrix.diag().size(); // small case nnz = 203800
>    // allocate memory for CSR sparse matrix using calloc
>    ScalarType * vals = (ScalarType *)calloc(nnz, sizeof(ScalarType));
>    uint * cols = (uint *)calloc(nnz, sizeof(uint));
>    uint * rows = (uint *)calloc(n, sizeof(uint));
>    // call function to convert original LDU matrix to CSR format
>    exPet::ldu2csr(matrix,rows,cols,vals);
>    // fill PETsc matrix
>    MatSetValues(petsc_matrix, ?, ?, ?, ?, ?, INSERT_VALUES);
>    // free and release the matrix memory
>    free(rows); free(cols); free(vals);  // calloc()
> }
> Questions:
> 1: How to declare the petsc_matrix to be filled by the function with the content of the original matrix?
> 2: MatSetValues(petsc_matrix, ?, ?, ?, ?, ?, INSERT_VALUES); is used to actually fill the petsc_matrix and I was of the opinion that PETsc uses the CSR format but I can't work out how CSR format is described by:
>    v        - a logically two-dimensional array of values
>    m, idxm    - the number of rows and their global indices
>    n, idxn    - the number of columns and their global indices
> My original matrix is converted to CSR format, i.e. three arrays cols (column_indices), rows (row_start_indices) and vals (values).
> How can I load my matrix into a PETsc matrix for parallel processing? MatSetValues(petsc_matrix, ?, ?, ?, ?, ?, INSERT_VALUES);
> Klaus

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20171003/558a4546/attachment.html>

More information about the petsc-users mailing list