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

和它调用的两个函数 magnitude1magnitude3 工作正常。

我其实很笨,居然解决了这个问题。错误在行

real(8) :: distances(size(pixels,1),size(pixels,2)), plane_perp_dist(size(pixels,1),size(pixels,2))

我给 plane_perp_distance 使用了错误的尺寸。这加起来是我之前在网上阅读的大部分内容,关于我经常收到的错误,指的是指定数组大小的索引,但它让我感到震惊,因为我能够得到大约 3 或 4 行的点正在崩溃。