f2py不返回函数,给出free:下一个大小无效正常错误

问题描述

我没有使用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语句,该语句也可以打印出来。因此,该函数如何输出我认为的数组存在一些问题?

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,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

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

解决方法

我实际上非常愚蠢,并且设法解决了这个问题。错误在一行中

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

,我给plane_perp_distance使用了错误的尺寸。这加起来是我以前在网上最常阅读的内容,关于我经常收到的错误所指的是指定数组大小之外的索引,但是这使我不知所措,因为我可以得到3或4行坏了。