mkl: 无效值错误暴露稀疏矩阵

mkl: invalid value error exporing sparse matrix

以下程序使用 Intel MKL 并根据坐标表示创建稀疏矩阵,然后将该矩阵导出到 CSR format

  include 'mkl_spblas.f90'
program test

  use iso_c_binding
  use mkl_spblas
  implicit none

  complex(kind=kind(0.d0)) :: values(4)
  integer :: columns(4)
  integer :: rows(4)

  TYPE(C_PTR) :: rows_start_csr, rows_end_csr, col_index_csr, values_csr
  integer(C_INT) :: indexing_csr, nrows_csr, ncol_csr
  type(SPARSE_MATRIX_T) :: handle
  integer :: stat

  ! Matrix
  !
  ! | 0 1 0 0 |
  ! | 1 0 0 0 |
  ! | 0 0 1 0 |
  ! | 0 0 0 1 |
  values(1) = 1
  rows(1) = 1
  columns(1) = 2

  values(2) = 1
  rows(2) = 2
  columns(2) = 1

  values(3) = 1
  rows(3) = 3
  columns(3) = 3

  values(4) = 1
  rows(4) = 4
  columns(4) = 4

  stat = mkl_sparse_z_create_coo(handle, SPARSE_INDEX_BASE_ONE, 4, 4, 4, rows, columns, values)
  write (*,*) 'stat after create = ', stat
  stat = mkl_sparse_z_export_csr(handle, indexing_csr, nrows_csr, ncol_csr, rows_start_csr, rows_end_csr, col_index_csr, values_csr)
  write (*,*) 'stat after export = ', stat, '  SPARSE_STATUS_INVALID_VALUE = ', SPARSE_STATUS_INVALID_VALUE
  
end program test

程序的输出是:

 stat after create =            0
 stat after export =            3   SPARSE_STATUS_INVALID_VALUE =            3

虽然创建矩阵后状态正常,但令人惊讶的是,导出后的状态对应于SPARSE_STATUS_INVALID_VALUE

这怎么可能发生,如何解决?

您需要事先将 COO 格式转换为 CSR。

include 'mkl_spblas.f90'
program test

  use iso_c_binding
  use mkl_spblas
  implicit none

  complex(kind=kind(0.d0)) :: values(4)
  integer                  :: columns(4)
  integer                  :: rows(4)

  TYPE(C_PTR)           :: rows_start_csr, rows_end_csr, col_index_csr, values_csr
  integer(C_INT)        :: indexing_csr, nrows_csr, ncol_csr
  type(SPARSE_MATRIX_T) :: coo, csr   ! ===== NEW
  integer               :: stat

  ! Matrix
  !
  ! | 0 1 0 0 |
  ! | 1 0 0 0 |
  ! | 0 0 1 0 |
  ! | 0 0 0 1 |
  values(1) = 1
  rows(1) = 1
  columns(1) = 2

  values(2) = 1
  rows(2) = 2
  columns(2) = 1

  values(3) = 1
  rows(3) = 3
  columns(3) = 3

  values(4) = 1
  rows(4) = 4
  columns(4) = 4

  stat = mkl_sparse_z_create_coo(coo, SPARSE_INDEX_BASE_ONE, 4, 4, 4, rows, columns, values)
  write (*,*) 'stat after create = ', stat

  ! ===== NEW ===== ->
  stat = mkl_sparse_convert_csr(coo, SPARSE_OPERATION_NON_TRANSPOSE, csr)
  write (*,*) 'stat after convert = ', stat
  ! ===== NEW ===== <-

  stat = mkl_sparse_z_export_csr(csr, indexing_csr, nrows_csr, ncol_csr, rows_start_csr, rows_end_csr, col_index_csr, values_csr)
  write (*,*) 'stat after export = ', stat, '  SPARSE_STATUS_INVALID_VALUE = ', SPARSE_STATUS_INVALID_VALUE

end program