使用 Numpy 和 petsc4py 时出现 32 位/64 位问题

计算科学 宠物 麻木的
2021-12-07 07:04:16

A使用数组cnumpy.ndarraywith )索引 PETSc.Mat时dtype('int64'),遇到以下错误:

  File "/Users/cls/workspace/LAMG-Python/src/lamg/amg/setup.py", line 945, in buildInternal
    Acc = A[c, c]
  File "Mat.pyx", line 185, in petsc4py.PETSc.Mat.__getitem__ (src/petsc4py.PETSc.c:71407)
  File "petscmat.pxi", line 862, in petsc4py.PETSc.mat_getitem (src/petsc4py.PETSc.c:22442)
  File "petscmat.pxi", line 773, in petsc4py.PETSc.matgetvalues (src/petsc4py.PETSc.c:21226)
  File "arraynpy.pxi", line 123, in petsc4py.PETSc.iarray_i (src/petsc4py.PETSc.c:5284)
  File "arraynpy.pxi", line 117, in petsc4py.PETSc.iarray (src/petsc4py.PETSc.c:5192)
TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe'

我假设有一个简单的解决方案(允许演员,使一切 32 或 64 位......)。你能为我指出正确的方向吗?谢谢。

1个回答

有两种解决方案,取决于你想要什么。作为一个信息点,PETSc在正常构建中默认使用 32 位索引。

如果您总是想要64 位索引,那么您应该使用 64 位索引配置和构建 PETSc(传递--with-64-bit-indices给配置),一切都会正常工作。

另一方面,如果您想在每次将数据结构交给 PETSc 时显式地强制复制,您可以通过 c.astype(petsc4py.PETSc.IntType). 有关执行/避免 Numpy 副本的复杂性的更多信息,请参阅StackOverflow 上的这个问题