问题描述
以下程序使用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,rows,columns,values)
write (*,*) 'stat after create = ',stat
stat = mkl_sparse_z_export_csr(handle,indexing_csr,ncol_csr,rows_start_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
创建矩阵后,状态为OK,但令人惊讶的是,导出矩阵后的状态对应于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,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,ncol_csr,rows_start_csr,values_csr)
write (*,*) 'stat after export = ',stat,' SPARSE_STATUS_INVALID_VALUE = ',SPARSE_STATUS_INVALID_VALUE
end program