Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python f2py:输入不是fortran连续的_Python_Numpy_Fortran_F2py - Fatal编程技术网

Python f2py:输入不是fortran连续的

Python f2py:输入不是fortran连续的,python,numpy,fortran,f2py,Python,Numpy,Fortran,F2py,我用f2py包装了一些fortran代码。以下是fortran代码: MODULE iteration implicit none contains SUBROUTINE iterate(alpha, beta, e, es, rank, omega, smearing, prec, max_step) REAL(kind=8), INTENT(in) :: omega, smearing, prec INTEGER :: max_step, step, rank, cnt

我用f2py包装了一些fortran代码。以下是fortran代码:

MODULE iteration
implicit none
contains

SUBROUTINE iterate(alpha, beta, e, es, rank, omega, smearing, prec, max_step)
    REAL(kind=8), INTENT(in) :: omega, smearing, prec
    INTEGER :: max_step, step, rank, cnt
    COMPLEX(kind=16) :: alpha(rank,rank), beta(rank,rank), omega_mat(rank, rank), green(rank, rank)
    COMPLEX(kind=16), INTENT(inout) ::  e(rank,rank), es(rank,rank)
    step = 0
    omega_mat = 0
    DO cnt=1, rank
        omega_mat(cnt, cnt) = 1.0
    ENDDO
    omega_mat = omega_mat * (omega + (0.0, 1.0) * smearing)
    DO WHILE (minval(abs(alpha)) .gt. prec .or.  minval(abs(beta)) .gt. prec .and. step .lt. max_step)
        green = zInverse(rank, omega_mat - e)
        e = e + matmul(alpha, matmul(green, beta)) + matmul(beta, matmul(green, alpha))
        es = es + matmul(alpha, matmul(green, beta))
        alpha = matmul(alpha, matmul(green, alpha))
        beta = matmul(beta, matmul(green, beta))
        step = step + 1
    ENDDO
END SUBROUTINE iterate

FUNCTION zInverse(n, a)  result(ra)
    INTEGER :: n,lda,ipiv(n),info,lwork
    COMPLEX(kind=16)::a(n,n),ra(n,n),work(n)
    ra=a
    lwork=n
    lda=n
    CALL zgetrf(n, n, ra, lda, ipiv, info)
    IF(info/=0) WRITE(0,*) 'Error occured in zgetrf!'
    CALL zgetri(n, ra, lda, ipiv, work, lwork, info)
    IF(info/=0) WRITE(0,*) 'Error occured in zgetri!'
END FUNCTION zInverse
END MODULE iteration
然后我用f2py-L/usr/lib-llapack-m pyiteration-c iteration.F90编译了代码,并用

import numpy as np
import pyiteration
alpha = np.array([[1,0],[0,1]], dtype='complex')
beta = np.array([[1,0],[0,1]], dtype='complex')
e = np.array([[1,0],[0,1]], dtype='complex')
es = np.array([[1,0],[0,1]], dtype='complex')
# f2py is automatically generating rank for me
pyiteration.iteration.iterate(alpha,beta, e, es, 1.0, 0.001, 0.001, 100)
但是,我得到了以下错误:
ValueError:未能初始化intent(inout)数组--输入不是fortran连续的


我在谷歌上搜索发现,f2py应该自动使数组fortran连续。那么这里发生了什么?

在Fortran中创建的数组(即
out
)将作为Fortran连续返回。但是,我的理解是,在Python中,传入的所有数组(即
in
inout
)必须指定为Fortran连续。如果f2py将它们从C连续更改为F连续,这可能意味着创建一个副本,这将占用额外的内存,这不是很有效


要解决此问题,您只需在每个
np.array
调用中添加一个
order='F'
kwarg。

您必须使用
order='F'
将数组创建为Fortran连续有序数组,以便:

alpha = np.array([[1,0],[0,1]], dtype='complex', order='F')
beta = np.array([[1,0],[0,1]], dtype='complex', order='F')
e = np.array([[1,0],[0,1]], dtype='complex', order='F')
es = np.array([[1,0],[0,1]], dtype='complex', order='F')

我也得到了这个
fortran连续
错误,并通过在
.pyf
签名文件中将一些
intent(intout)
s更改为
intent(in)
,使其消失,例如:

real(kind=8) dimension(:,:),intent(in) :: kernel
integer dimension(:,:),intent(in) :: kernelmask

根据代码,
kernel
kernelmask
都是
intent(in)
,但是
f2py
生成
。pyf
给它们
intent(inout)
。纠正这个错误以某种方式解决了连续错误。它可能不适用于其他情况,但考虑到信息太少,如果出现类似问题,您可能希望尝试一下。

您的代码不同,您假设了形状数组
(:)
。请注意,当
alpha.flags.writeable
不是
True
时,也会(不适当地)引发他的错误,您可以通过
.copy()
调用变量来绕过它。