f2py 不返回函数,给出 free(): invalid next size (normal) 错误
f2py not returning out a function, giving free(): invalid next size (normal) error
我对 Fortran 或 f2py
没有太多经验,但我正在使用同事编写的示例来尝试编写自己的示例。
我有一个 Python 函数的一部分,我想用 Fortran 编写它以尝试获得良好的加速。我编写的 Fortran 子例程 f2py
是
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,151,3)
real(8), intent(in) :: box_em(:,:,:), box_ne(:,:,:), box_Te(:,:,:), iz_sigma_box(:,:,:) ! (151,151,151)
logical, intent(in) :: box_bool(:,:,:) ! (151,151,151)
real(8), intent(in) :: pixels(:,:,:), vecs(:,:,:) ! (151,151,3)
real(8), intent(in) :: gas_valve_cart(3), ll(3), n_vec(3) ! (3)
real(8), intent(in) :: box_base, cone_c, cone_m, 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),size(box_ne,3)) ! (151,151,151)
real(8) :: distances(size(pixels,1),size(pixels,2)), plane_perp_dist(size(pixels,1),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,1),size(vecs,2)) ! (151,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,j,k,:))
box_n0(i,j,k) = neutral_gauss(plane_perp_dist(j,k), M(i), sigma_n0)
if (box_bool(i,j,k)) then
distances = distance_to_vector(box_cart(i,j,k,:), vecs, pixels)
inds = minloc(distances)
pixel_count(inds(1),inds(2)) = pixel_count(inds(1),inds(2)) + (box_n0(i,j,k)*box_em(i,j,k)*box_ne(i,j,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,j,k,:), vecs, pixels)
然后我得到以下错误
free(): invalid next size (normal)
Aborted (core dumped)
我知道它会到达这一行,因为我可以在它前面放一个打印语句,它可以很好地打印出来。我还可以在 distance_to_vector 函数的最后一行放置一个 print 语句,它也会被打印出来。所以我认为该函数如何输出数组存在一些问题?
distance_to_vector函数是:
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,1),size(v,2))
real(8) :: mu
integer :: i, j
! Outputs
real(8) :: distance_to_vector(size(v0,1),size(v0,2))
! The function
mag = 1.d0/(magnitude3(v)**2)
do i=1, size(v,1)
do j=1, size(v,2)
mu = sum((P - v0(i,j,:)) * v(i,j,:)) * mag(i,j)
distance_to_vector(i,j) = magnitude1((mu * v(i,j,:))+v0(i,j,:)-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,1),size(pixels,2))
我给 plane_perp_distance
使用了错误的尺寸。这加起来是我之前在网上阅读的大部分内容,关于我经常收到的错误,指的是指定数组大小的索引,但它让我感到震惊,因为我能够得到大约 3 或 4 行的点正在崩溃。
我对 Fortran 或 f2py
没有太多经验,但我正在使用同事编写的示例来尝试编写自己的示例。
我有一个 Python 函数的一部分,我想用 Fortran 编写它以尝试获得良好的加速。我编写的 Fortran 子例程 f2py
是
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,151,3)
real(8), intent(in) :: box_em(:,:,:), box_ne(:,:,:), box_Te(:,:,:), iz_sigma_box(:,:,:) ! (151,151,151)
logical, intent(in) :: box_bool(:,:,:) ! (151,151,151)
real(8), intent(in) :: pixels(:,:,:), vecs(:,:,:) ! (151,151,3)
real(8), intent(in) :: gas_valve_cart(3), ll(3), n_vec(3) ! (3)
real(8), intent(in) :: box_base, cone_c, cone_m, 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),size(box_ne,3)) ! (151,151,151)
real(8) :: distances(size(pixels,1),size(pixels,2)), plane_perp_dist(size(pixels,1),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,1),size(vecs,2)) ! (151,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,j,k,:))
box_n0(i,j,k) = neutral_gauss(plane_perp_dist(j,k), M(i), sigma_n0)
if (box_bool(i,j,k)) then
distances = distance_to_vector(box_cart(i,j,k,:), vecs, pixels)
inds = minloc(distances)
pixel_count(inds(1),inds(2)) = pixel_count(inds(1),inds(2)) + (box_n0(i,j,k)*box_em(i,j,k)*box_ne(i,j,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,j,k,:), vecs, pixels)
然后我得到以下错误
free(): invalid next size (normal)
Aborted (core dumped)
我知道它会到达这一行,因为我可以在它前面放一个打印语句,它可以很好地打印出来。我还可以在 distance_to_vector 函数的最后一行放置一个 print 语句,它也会被打印出来。所以我认为该函数如何输出数组存在一些问题?
distance_to_vector函数是:
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,1),size(v,2))
real(8) :: mu
integer :: i, j
! Outputs
real(8) :: distance_to_vector(size(v0,1),size(v0,2))
! The function
mag = 1.d0/(magnitude3(v)**2)
do i=1, size(v,1)
do j=1, size(v,2)
mu = sum((P - v0(i,j,:)) * v(i,j,:)) * mag(i,j)
distance_to_vector(i,j) = magnitude1((mu * v(i,j,:))+v0(i,j,:)-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,1),size(pixels,2))
我给 plane_perp_distance
使用了错误的尺寸。这加起来是我之前在网上阅读的大部分内容,关于我经常收到的错误,指的是指定数组大小的索引,但它让我感到震惊,因为我能够得到大约 3 或 4 行的点正在崩溃。