Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran DGAMIC netlib函数,用于计算带有错误的不完整Gamma出口_Fortran_Gfortran_Netlib - Fatal编程技术网

Fortran DGAMIC netlib函数,用于计算带有错误的不完整Gamma出口

Fortran DGAMIC netlib函数,用于计算带有错误的不完整Gamma出口,fortran,gfortran,netlib,Fortran,Gfortran,Netlib,我需要一个程序来计算不完整的伽马函数。当然,我已经尝试了netlib路由并找到了dgamic函数。但是,在编译以下测试程序之后 program test_dgamic implicit none interface double precision function dgamic(in1,in2) double precision, intent(in) :: in1,in2 end function dgamic end interface

我需要一个程序来计算不完整的伽马函数。当然,我已经尝试了netlib路由并找到了dgamic函数。但是,在编译以下测试程序之后

program test_dgamic
  implicit none
  interface 
     double precision function dgamic(in1,in2)
       double precision, intent(in) :: in1,in2
     end function dgamic
  end interface 


  print *, 'dgamic:', dgamic(1.d0,1.d0)
end program test_dgamic
program main
    implicit none
    external dgamic
    double precision dgamic, a, x, y

    a = 1.0d0
    x = 1.0d0
    y = dgamic( a, x )

    print *, "a = ", a
    print *, "x = ", x
    print *, "y(slatec)        = ", y
    print *, "y(exact for a=1) = ", exp( -x )
end program 
像这样使用gfortran 6.2.0版

gfortran main.f90 -o main dgamic.f d9lgic.f d9lgit.f d9gmic.f d9gmit.f dlgams.f dlngam.f dgamma.f d9lgmc.f dcsevl.f dgamlm.f initds.f d1mach.f xerclr.f xermsg.f xerprn.f xersve.f xgetua.f i1mach.f j4save.f xerhlt.f xercnt.f fdump.f
运行时,我会收到以下slatec错误消息

***MESSAGE FROM ROUTINE INITDS IN LIBRARY SLATEC.
 ***POTENTIALLY RECOVERABLE ERROR, PROG ABORTED, TRACEBACK REQUESTED
 *  Chebyshev series too short for specified accuracy
 *  ERROR NUMBER = 1
 *   
 ***END OF MESSAGE

 ***JOB ABORT DUE TO UNRECOVERED ERROR.
0          ERROR MESSAGE SUMMARY
 LIBRARY    SUBROUTINE MESSAGE START             NERR     LEVEL     COUNT
 SLATEC     INITDS     Chebyshev series too         1         1         1

Note: The following floating-point exceptions are signalling: IEEE_DIVIDE_BY_ZERO

有人知道如何避免这种情况吗?从错误的外观来看,它看起来像一个设计缺陷

问题似乎(再次)是由于Slatec中的d1mach.f,因为我们需要手动取消注释该文件的适当部分。实际上,使用BLAS站点提供的d1mach.f的修改版本更方便(参见第页)。因此,程序可能类似于:

1) 从下载slatec_src.tar.gz

2) 下载d1mach.f等的修改(BLAS)版本,并使用它们代替Slatec版本

rm -f i1mach.f r1mach.f d1mach.f
wget http://www.netlib.org/blas/i1mach.f 
wget http://www.netlib.org/blas/r1mach.f
wget http://www.netlib.org/blas/d1mach.f 
3) 和Comple,例如,与测试程序

program test_dgamic
  implicit none
  interface 
     double precision function dgamic(in1,in2)
       double precision, intent(in) :: in1,in2
     end function dgamic
  end interface 


  print *, 'dgamic:', dgamic(1.d0,1.d0)
end program test_dgamic
program main
    implicit none
    external dgamic
    double precision dgamic, a, x, y

    a = 1.0d0
    x = 1.0d0
    y = dgamic( a, x )

    print *, "a = ", a
    print *, "x = ", x
    print *, "y(slatec)        = ", y
    print *, "y(exact for a=1) = ", exp( -x )
end program 

 a =    1.0000000000000000     
 x =    1.0000000000000000     
 y(slatec)        =   0.36787944117144233     
 y(exact for a=1) =   0.36787944117144233
作为比较,如果我们使用d1mach.f的Slatec版本,我们会得到相同的错误

 ***MESSAGE FROM ROUTINE INITDS IN LIBRARY SLATEC.
 ***POTENTIALLY RECOVERABLE ERROR, PROG ABORTED, TRACEBACK REQUESTED
 *  Chebyshev series too short for specified accuracy
 *  ERROR NUMBER = 1
 ...

由于精度未在d1mach.f中设置(我们需要取消注释一个必要的部分,例如标记为“IBM PC”,再加上一些对传统Fortran的修改,这可能会很乏味……)

@H.p.Mark实际上试图将所有这些都封装在一个模块中,但所有这些C注释都破坏了我的编译。我试着在另一只手臂抱着一个愤怒的婴儿的同时编写一个测试用例——我想这会让我进入一个严重散焦的fortran程序员类;)——在写原始文章时,你不必费心去查看gfortran的信息。你可以把所有的东西都放在一个模块中,并且仍然使用固定格式的源代码。当然,您不能将其剪切并粘贴到自由格式的source.f90文件中。但只要将
模块
结束模块
添加到原始源文件中就没有问题。我认为如果原始Slatec站点中的d1mach.f包含“stop”语句而不是静默返回(例如,“stop”d1mach之类的行需要手动更新“),这将非常有用。这样,我们注意到需要自动修改它。。。