petsc4py:从csc_matrix创建AIJ Matrix会导致TypeError

时间:2015-04-08 20:46:24

标签: python numpy petsc

我正在尝试从已经存在的csc矩阵创建一个petsc矩阵。考虑到this,我创建了以下示例代码:

import numpy as np
import scipy.sparse as sp
import math as math
from petsc4py import PETSc
n=100

A = sp.csc_matrix((n,n),dtype=np.complex128)
print A.shape
A[1:5,:]=1+1j*5*math.pi

p1=A.indptr
p2=A.indices
p3=A.data
petsc_mat = PETSc.Mat().createAIJ(size=A.shape,csr=(p1,p2,p3))

只要矩阵只包含实数值,这就非常有效。当矩阵复杂运行时,这段代码会产生一个 TypeError: Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe'。 我试图弄清楚错误发生在哪里,但对追溯没有多大意义:

petsc_mat = PETSc.Mat().createAIJ(size=A.shape,csr=(p1,p2,p3))  File "Mat.pyx", line 265, in petsc4py.PETSc.Mat.createAIJ (src/petsc4py.PETSc.c:98970)
File "petscmat.pxi", line 662, in petsc4py.PETSc.Mat_AllocAIJ (src/petsc4py.PETSc.c:24264)
File "petscmat.pxi", line 633, in petsc4py.PETSc.Mat_AllocAIJ_CSR (src/petsc4py.PETSc.c:23858)
File "arraynpy.pxi", line 136, in petsc4py.PETSc.iarray_s (src/petsc4py.PETSc.c:8048)
File "arraynpy.pxi", line 117, in petsc4py.PETSc.iarray (src/petsc4py.PETSc.c:7771)

是否有一种有效的方法可以从复杂的scipy csc矩阵创建一个petsc矩阵(我想稍后检索一些特征对)?

如果你们能帮助我找到我的(希望不是太明显的)错误,我会很高兴。

1 个答案:

答案 0 :(得分:2)

我遇到麻烦让PETSc工作,所以我配置的不止一次,在上一次运行中我显然忘记了选项--with-scalar-type=complex

这就是我应该做的:

  • 检查日志文件$PETSC_DIR/arch-linux2-c-opt/conf/configure.log

  • 或者查看reconfigure-arch-linux2-c-opt.py

在那里,您可以找到用于配置PETSc的所有选项。如果您也使用SLEPc,您还需要重新编译它。现在,因为我将选项(--with-scalar-type=complex)添加到重新配置脚本并运行它,所以一切正常。