Fortran 程序接收信号SIGSEGV:分段故障-内存引用无效?

Fortran 程序接收信号SIGSEGV:分段故障-内存引用无效?,fortran,Fortran,我在做一个多重积分,有一个参数mud,我可以修改它。M_D=2.9d3或M_D=3.1d3都可以正常工作,但当我将其更改为M_D=3.0d0时,它出现了一个错误 Program received signal SIGSEGV: Segmentation fault - invalid memory reference. Backtrace for this error: #0 0x7F831A103E08 #1 0x7F831A102F90 #2 0x7F83198344AF #3 0x

我在做一个多重积分,有一个参数
mud
,我可以修改它。
M_D=2.9d3
M_D=3.1d3
都可以正常工作,但当我将其更改为
M_D=3.0d0
时,它出现了一个错误

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0  0x7F831A103E08
#1  0x7F831A102F90
#2  0x7F83198344AF
#3  0x43587C in __mc_vegas_MOD_vegas
#4  0x400EBE in MAIN__ at MAINqq.f90:?
Segmentation fault (core dumped)
这是非常不可能有一个标志性的范围以外的进展。从我发现的这类问题的答案来看,我想这不是关于数组维度的问题

这一次,我并不是为了简化问题,而是为了减少代码的编写量而演示我的问题。在这里发布所有代码是不现实的,所以我发布了我认为与错误相关的部分

module my_fxn
   implicit none   
   private
   public ::  fxn_1   
   public :: cos_theta

   real(kind(0d0)), parameter      :: S=1.690d8
   real(kind(0d0)), parameter      :: g_s = 0.118d0
   real(kind(0d0)), parameter      :: M_D = 3.0d3   !!!
   real(kind(0d0)), parameter      :: m=172d0
   real(kind(0d0)), parameter      :: Q=2d0 
   real(kind(0d0)), parameter      :: pi=3.14159d0
   real(kind(0d0)), external       :: CT14pdf
   real(kind(0d0)) :: cos_theta
   real(kind(0d0)) :: s12
   integer         :: i
   contains        
      function jacobian( upper, lower) result(jfactor)
         implicit none
         real(kind(0d0)), dimension(1:6) :: upper, lower
         real(kind(0d0))  :: jfactor

         jfactor = 1d0
         do i = 1, 6
            jfactor = jfactor * (upper(i) - lower(i))
         end do
      end function jacobian



      function dot_vec(p,q) result(fourvectordot)
         implicit none
         real(kind(0d0)) :: fourvectordot
         real(kind(0d0)), dimension(0:3) :: p,q

         fourvectordot = p(0) * q(0)
         do i = 1, 3
            fourvectordot = fourvectordot - p(i) * q(i)
         end do
      end function dot_vec



      subroutine commonpart(p3_0, p4_0, eta, k_v,P3_v, p4_v, s13, s14, s23, s24) 
         implicit none
         real(kind(0d0)), intent(in) :: p3_0, p4_0, eta, k_v, p3_v, p4_v 
         real(kind(0d0)), intent(out):: s13, s14, s23, s24
         real(kind(0d0)) :: sin_theta, &
                            cos_eta, sin_eta,   &
                            cos_ksi, sin_ksi
         real(kind(0d0)), dimension(0:3) :: k1, k2, p3, p4, k 


         sin_theta = sqrt(1-cos_theta**2) 
         cos_eta = cos(eta)
         sin_eta = sqrt(1-cos_eta**2)  
         cos_ksi = (k_v**2-p3_v**2-p4_v**2)/(2*p3_v*p4_v)
         sin_ksi = sqrt(1-cos_ksi**2)

         k1 = [sqrt(s12)/2d0,0d0,0d0, sqrt(s12)/2d0]
         k2 = [sqrt(s12)/2d0,0d0,0d0, -sqrt(s12)/2d0]
         p3 = [p3_0, p3_v*(cos_theta*cos_eta*sin_ksi+sin_theta*cos_ksi), &
               p3_v* sin_eta*sin_ksi, p3_v*( cos_theta*cos_ksi-sin_theta*cos_eta*sin_ksi)]
         p4 = [p4_0, p4_v*sin_theta, 0d0, p4_v*cos_theta]
         do i = 1, 3
         k(i)  = 0 - p3(i) - p4(i)
         end do
         k(0) = sqrt(s12) - p3_0-p4_0

         s13 = m**2- 2*dot_vec(k1,p3)
         s14 = m**2- 2*dot_vec(k1,p4)
         s23 = m**2- 2*dot_vec(k2,p3)
         s24 = m**2- 2*dot_vec(k2,p3)

      end subroutine commonpart

      function fxn_1(z, wgt) result(fxn_qq)
         implicit none 
         real(kind(0d0)), dimension(1:6) :: z      
         real(kind(0d0)) :: wgt
         real(kind(0d0)) :: tau_0
         real(kind(0d0)) :: sigma, tau, m_plus, m_minus,  &   ! intermediate var 
                            p3_v, p4_v, k_v, phi
         real(kind(0d0)) :: s13,s14,s23, s24, gm    
         real(kind(0d0)) :: part1_qq,part_qq,fxn_qq       
         real(kind(0d0)) :: p3_0_max, p4_0_max, eta_max, gm_max, x1_max, x2_max, &
                            p3_0_min, p4_0_min, eta_min, gm_min, x1_min, x2_min
         real(kind(0d0)), dimension(1:6) :: upper, lower
         real(kind(0d0)) :: jfactor

         wgt = 0

         gm_max = M_D
         gm_min = 0.1d0
         z(1)= (gm_max-gm_min)*z(1) + gm_min

         tau_0 = (2*m)**2/S

         eta_max = 2*pi
         eta_min = 0
         z(2) = (eta_max-eta_min)*z(2)+eta_min

         x1_max = 1
         x1_min = tau_0
         z(3) = (x1_max-x1_min)*z(3) + x1_min

         x2_max = 1
         x2_min = tau_0/z(3)
         z(4) = (x2_max-x2_min)*z(4)+x2_min

         s12 = z(3)*z(4) * S
         if (sqrt(s12) < (2*m+z(1)))then
            fxn_qq = 0d0 
            return
            else
         end if

         p4_0_max = sqrt(s12)/2 - ((m+z(1))**2-m**2)/(2*sqrt(s12))
         p4_0_min = m
         z(5) = (p4_0_max-p4_0_min)*z(5)+p4_0_min

         p4_v = sqrt(z(5)**2-m**2) 
         sigma = sqrt(s12)-z(5)
         tau = sigma**2 - p4_v**2
         m_plus = m + z(1)
         m_minus = m - z(1)

         p3_0_max = 1/(2*tau)*(sigma*(tau+m_plus*m_minus)+p4_v*sqrt((tau-m_plus**2)*(tau-m_minus**2)))
         p3_0_min = 1/(2*tau)*(sigma*(tau+m_plus*m_minus)-p4_v-sqrt((tau-m_plus**2)*(tau-m_minus**2)))
         z(6) = (p3_0_max-p3_0_min)*z(6)+p3_0_min

         p3_v = sqrt(z(6)**2-m**2)  
         k_v = sqrt((sqrt(s12)-z(5)-z(6))**2-z(1)**2)

         gm = z(1)

         upper = [gm_max, eta_max, x1_max, x2_max, p4_0_max, p3_0_max]
         lower = [gm_min, eta_min, x1_min, x2_min, p4_0_min, p3_0_min]
         jfactor = jacobian(upper, lower)
         call commonpart(z(6),z(5),z(2), k_v,p3_v, p4_v, s13, s14, s23, s24) 

         include "juicy.m"
         part1_qq = 0d0
         do i = 1, 5
            part1_qq = part1_qq+CT14Pdf(i, z(3), Q)*CT14Pdf(-i, z(4), Q)*part_qq 
         end do

         phi = 1/(8*(2*pi)**4) * 1/(2*s12)
         fxn_qq = jfactor * g_s**4/M_D**5*pi*z(1)**2*phi*part1_qq
      end function fxn_1
end module my_fxn
Main.f90

program main
   use my_fxn
   use MC_VEGAS 
   implicit none

   integer, parameter        :: NDIM = 6
   real(kind(0d0))           :: avgi, sd, chi2a
   Character(len=40)         :: Tablefile
   data Tablefile/'CT14LL.pds'/
   Call SetCT14(Tablefile)
   call vegas(NDIM,fxn_1,avgi,sd,chi2a)

   print *, avgi
end program main

运行
build.sh后

#!/bin/sh
rm -rf *.mod
rm -rf *.o
rm -rf ./calc
rm DATAqq.txt

gfortran -c CT14Pdf.for
gfortran -c FXNqq.f90
gfortran -c MC_VEGAS.f90
gfortran -c MAINqq.f90

gfortran  -g -fbacktrace -fcheck=all -Wall -o calc MAINqq.o CT14Pdf.o FXNqq.o MC_VEGAS.o
./calc
rm -rf *.mod
rm -rf *.o
rm -rf ./calc
整个产出没有改变

 rm: cannot remove 'DATAqq.txt': No such file or directory

 INPUT PARAMETERS FOR MC_VEGAS: 
 NDIM=  6    NCALL=  46875.     IT=  0
 ITMX=  5    ACC=   -1.00       NPRN=  5
 ALPH= 1.50    MDS=  1          ND=  50
(XL,XU)= ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )

 INTEGRATION BY MC_VEGAS  ITERATION NO.   1
 INTEGRAL =            NaN
 SQURE DEV  =        NaN
 ACCUMULATED RESULTS:   INTEGRAL =            NaN
 DEV  =        NaN
 CHI**2 PER IT'N =        NaN

DATA FOR AXIS  1
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.2431E-14     .160000  0.5475E-15     .260000  0.8216E-14
 .360000  0.3641E-14     .460000  0.6229E-12     .560000  0.6692E-13
 .660000  0.9681E-15     .760000  0.9121E-15     .860000  0.2753E-13
 .960000 -0.9269E-16

DATA FOR AXIS  2
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.1658E-13     .160000  0.5011E-14     .260000  0.8006E-12
 .360000  0.1135E-14     .460000  0.9218E-13     .560000  0.7337E-15
 .660000  0.6192E-12     .760000  0.3676E-14     .860000  0.2315E-14
 .960000  0.5426E-13

DATA FOR AXIS  3
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.3197E-14     .160000  0.1096E-12     .260000  0.5996E-14
 .360000  0.5695E-13     .460000  0.3240E-14     .560000  0.5504E-13
 .660000  0.9276E-15     .760000  0.6193E-12     .860000  0.1151E-13
 .960000  0.7968E-17

DATA FOR AXIS  4
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.3605E-13     .160000  0.1656E-14     .260000  0.7266E-12
 .360000  0.2149E-13     .460000  0.8086E-13     .560000  0.9119E-14
 .660000  0.3692E-15     .760000  0.6499E-15     .860000  0.1906E-17
 .960000  0.1542E-19

DATA FOR AXIS  5
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000 -0.4229E-15     .160000 -0.4056E-14     .260000 -0.1121E-14
 .360000  0.6757E-15     .460000  0.7460E-14     .560000  0.9331E-15
 .660000  0.8301E-14     .760000  0.6595E-14     .860000 -0.5203E-11
 .960000  0.6361E-12

DATA FOR AXIS  6
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.2111E-12     .160000  0.5410E-13     .260000  0.1418E-12
 .360000  0.1103E-13     .460000  0.8338E-14     .560000 -0.5840E-14
 .660000  0.1263E-14     .760000 -0.1501E-15     .860000  0.4647E-14
 .960000  0.3134E-15

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7F9D828B0E08
#1  0x7F9D828AFF90
#2  0x7F9D81FE24AF
#3  0x43586C in __mc_vegas_MOD_vegas
#4  0x400EAE in MAIN__ at MAINqq.f90:?
Segmentation fault (core dumped)

我想了很久,您是否注意到错误消息中提到了该模块中的模块
vegas
和过程
mc_vegas
?请出示相关代码。
mc_vegas
调用您显示的代码吗?哪一部分?但在此之前,请使用
-g-fbacktrace-fcheck=all-Wall
编译代码并尝试运行它。报告发生的事情。在调试时总是使用编译器的错误检查,这样可以节省很多时间。是的,这很可能是一个越界错误,即使你声称不是这样。请告诉我们您为什么这么认为。@VladimirF,
MC_VEGAS
调用
fxn_1
我这么认为,因为与
M_D=2.9d0
M_D=3.1
相对应的两个结果彼此非常接近。请尝试使用上面的选项重新编译,并尝试运行它并报告输出。这可能会有很大帮助。我想了很久,您是否注意到错误消息中提到了该模块中的模块
vegas
和过程
mc_vegas
?请出示相关代码。
mc_vegas
调用您显示的代码吗?哪一部分?但在此之前,请使用
-g-fbacktrace-fcheck=all-Wall
编译代码并尝试运行它。报告发生的事情。在调试时总是使用编译器的错误检查,这样可以节省很多时间。是的,这很可能是一个越界错误,即使你声称不是这样。请告诉我们您为什么这么认为。@VladimirF,
MC_VEGAS
调用
fxn_1
我这么认为,因为与
M_D=2.9d0
M_D=3.1
相对应的两个结果彼此非常接近。请尝试使用上面的选项重新编译,并尝试运行它并报告输出。这可能会有很大帮助。
 rm: cannot remove 'DATAqq.txt': No such file or directory

 INPUT PARAMETERS FOR MC_VEGAS: 
 NDIM=  6    NCALL=  46875.     IT=  0
 ITMX=  5    ACC=   -1.00       NPRN=  5
 ALPH= 1.50    MDS=  1          ND=  50
(XL,XU)= ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )
         ( 0.00000    , 1.00000    )

 INTEGRATION BY MC_VEGAS  ITERATION NO.   1
 INTEGRAL =            NaN
 SQURE DEV  =        NaN
 ACCUMULATED RESULTS:   INTEGRAL =            NaN
 DEV  =        NaN
 CHI**2 PER IT'N =        NaN

DATA FOR AXIS  1
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.2431E-14     .160000  0.5475E-15     .260000  0.8216E-14
 .360000  0.3641E-14     .460000  0.6229E-12     .560000  0.6692E-13
 .660000  0.9681E-15     .760000  0.9121E-15     .860000  0.2753E-13
 .960000 -0.9269E-16

DATA FOR AXIS  2
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.1658E-13     .160000  0.5011E-14     .260000  0.8006E-12
 .360000  0.1135E-14     .460000  0.9218E-13     .560000  0.7337E-15
 .660000  0.6192E-12     .760000  0.3676E-14     .860000  0.2315E-14
 .960000  0.5426E-13

DATA FOR AXIS  3
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.3197E-14     .160000  0.1096E-12     .260000  0.5996E-14
 .360000  0.5695E-13     .460000  0.3240E-14     .560000  0.5504E-13
 .660000  0.9276E-15     .760000  0.6193E-12     .860000  0.1151E-13
 .960000  0.7968E-17

DATA FOR AXIS  4
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.3605E-13     .160000  0.1656E-14     .260000  0.7266E-12
 .360000  0.2149E-13     .460000  0.8086E-13     .560000  0.9119E-14
 .660000  0.3692E-15     .760000  0.6499E-15     .860000  0.1906E-17
 .960000  0.1542E-19

DATA FOR AXIS  5
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000 -0.4229E-15     .160000 -0.4056E-14     .260000 -0.1121E-14
 .360000  0.6757E-15     .460000  0.7460E-14     .560000  0.9331E-15
 .660000  0.8301E-14     .760000  0.6595E-14     .860000 -0.5203E-11
 .960000  0.6361E-12

DATA FOR AXIS  6
    X       DELTA I          X       DELTA I         X       DELTA I
 .060000  0.2111E-12     .160000  0.5410E-13     .260000  0.1418E-12
 .360000  0.1103E-13     .460000  0.8338E-14     .560000 -0.5840E-14
 .660000  0.1263E-14     .760000 -0.1501E-15     .860000  0.4647E-14
 .960000  0.3134E-15

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7F9D828B0E08
#1  0x7F9D828AFF90
#2  0x7F9D81FE24AF
#3  0x43586C in __mc_vegas_MOD_vegas
#4  0x400EAE in MAIN__ at MAINqq.f90:?
Segmentation fault (core dumped)