问题描述
我没有使用Fortran或f2py
的丰富经验,但是我正在使用一个同事编写的示例来尝试编写自己的示例。
我有一部分我想用Fortran编写的Python函数,以尝试获得良好的加速。我编写的并将用f2py
调用的Fortran子例程是
subroutine cone_model_func(Box_cart,&
Box_em,Box_ne,Box_Te,&
iz_sigma_Box,Box_bool,pixels,&
vecs,gas_valve_cart,ll,n_vec,&
Box_base,cone_c,cone_m,dV,N_Box,&
M,iz,pixel_count)
! Inputs
real(8),intent(in) :: Box_cart(:,:,:) ! (151,151,3)
real(8),intent(in) :: Box_em(:,:),Box_ne(:,Box_Te(:,iz_sigma_Box(:,151)
logical,intent(in) :: Box_bool(:,151)
real(8),intent(in) :: pixels(:,vecs(:,intent(in) :: gas_valve_cart(3),ll(3),n_vec(3) ! (3)
real(8),intent(in) :: Box_base,dV
integer,intent(in) :: N_Box
real(8) :: M(:),iz(:) ! (151)
! Local variables
real(8) :: Box_n0(size(Box_ne,1),size(Box_ne,2),3)) ! (151,151)
real(8) :: distances(size(pixels,size(pixels,2)),plane_perp_dist(size(pixels,2)) ! (151,151)
integer :: inds(2) ! (2)
real(8) :: mu,sigma_n0
integer :: i,j,k
! Output
real(8),intent(out) :: pixel_count(size(vecs,size(vecs,151)
! The function
do i=1,N_Box
if (M(i) > 0.d0) then
mu = abs(sum((ll + Box_base * i * n_vec - gas_valve_cart) * n_vec))
sigma_n0 = (cone_m * mu + cone_c) * denom
plane_perp_dist = 0.d0
Box_n0 = 0.d0
do j=1,N_Box
do k=1,N_Box
plane_perp_dist(j,k) = magnitude1(gas_valve_cart + (mu * n_vec) - Box_cart(i,k,:))
Box_n0(i,k) = neutral_gauss(plane_perp_dist(j,k),M(i),sigma_n0)
if (Box_bool(i,k)) then
distances = distance_to_vector(Box_cart(i,vecs,pixels)
inds = minloc(distances)
pixel_count(inds(1),inds(2)) = pixel_count(inds(1),inds(2)) + (Box_n0(i,k)*Box_em(i,k)*Box_ne(i,k)*dV)
end if
end do
end do
else
M(i) = 0.d0
end if
if (i < N_Box) then
iz(i) = sum(Box_n0(i,:)*vel_Te(Box_Te(i,:))*iz_sigma_Box(i,:)*Box_ne(i,:)*dV*dV)
M(i+1) = M(i) - iz(i)
end if
end do
end subroutine cone_model_func
我可以调用该函数并使其从我的Python函数开始运行,直到该行为止
distances = distance_to_vector(Box_cart(i,pixels)
然后我得到以下错误
free(): invalid next size (normal)
Aborted (core dumped)
我知道它已经到了这一行,因为我可以在它前面放一个打印语句,然后将它打印出来。我还可以在distance_to_vector函数的最后一行放置一条print语句,该语句也可以打印出来。因此,该函数如何输出我认为的数组存在一些问题?
function distance_to_vector(P,v,v0)
! Inputs
real(8),intent(in) :: P(3)
real(8),intent(in) :: v(:,v0(:,:)
! Local variables
real(8) :: mag(size(v,size(v,2))
real(8) :: mu
integer :: i,j
! Outputs
real(8) :: distance_to_vector(size(v0,size(v0,2))
! The function
mag = 1.d0/(magnitude3(v)**2)
do i=1,1)
do j=1,2)
mu = sum((P - v0(i,:)) * v(i,:)) * mag(i,j)
distance_to_vector(i,j) = magnitude1((mu * v(i,:))+v0(i,:)-P)
end do
end do
print*,'This print statement returns fine'
! end and return
end function distance_to_vector
以及它调用的两个函数magnitude1
和magnitude3
正常工作。
解决方法
我实际上非常愚蠢,并且设法解决了这个问题。错误在一行中
real(8) :: distances(size(pixels,1),size(pixels,2)),plane_perp_dist(size(pixels,2))
,我给plane_perp_distance
使用了错误的尺寸。这加起来是我以前在网上最常阅读的内容,关于我经常收到的错误所指的是指定数组大小之外的索引,但是这使我不知所措,因为我可以得到3或4行坏了。