- 如标题所示,单独调用某一函数,则得正确计算结果,循环调用则会出错。调用的函数时IMSL2018中的总量为一般复数的贝塞尔函数。
。
- 确定循环过程中输入的参量没问题,就是函数会计算出现错误。
- 如图所示,单独计算a_lamda = 0.4 ,则能得到正确结果,但是在循环中则出错.
代码如下:
!***********************************************************************************************************************!
!
!COMPLEX( KIND = DBL ) :: IMSL_J !IMSL库中,宗量为一般复数的第一类整数阶贝塞尔函数.
!COMPLEX( KIND = DBL ) :: IMSL_Y !IMSL库中,宗量为一般复数的第二类整数阶贝塞尔函数.
!COMPLEX( KIND = DBL ) :: IMSL_J1 !IMSL库中,宗量为一般复数的第一类整数阶贝塞尔函数一阶导数.
!COMPLEX( KIND = DBL ) :: IMSL_Y1 !IMSL库中,宗量为一般复数的第二类整数阶贝塞尔函数一阶导数.
!COMPLEX( KIND = DBL ) :: IMSL_H !IMSL库中,宗量为一般复数的第一类整数阶汉开尔函数.
!COMPLEX( KIND = DBL ) :: IMSL_H1 !IMSL库中,宗量为一般复数的第一类整数阶汉开尔函数一阶导数.
!
!
!USE BESSEL_MODULE
!***********************************************************************************************************************!
!***********************************************************************************************************************!
!
!宗量为一般复数的第一类整数阶贝塞尔函数,调用IMSL函数库.
!
!***********************************************************************************************************************!
MODULE BESSEL_MODULE
IMPLICIT NONE
CONTAINS
FUNCTION IMSL_J( m,z )
USE Share_Data
include 'link_fnl_static.h' !调用IMSL2018
USE BSJNS_INT
USE UMACH_INT
IMPLICIT NONE
COMPLEX( KIND = DBL ) :: IMSL_J !IMSL库中,宗量为一般复数的第一类整数阶贝塞尔函数.
COMPLEX( KIND = DBL ),INTENT(IN) :: z !贝塞尔函数的宗量.
INTEGER,INTENT(IN) :: m !贝塞尔函数的阶数.
INTEGER :: N !设定该函数最大计算阶数.
COMPLEX( KIND = DBL ), ALLOCATABLE, DIMENSION(:) :: CBSJ !贝塞尔函数值构成的数组.
!可分配数组信息.
INTEGER :: status !可分配数组分配状态.
CHARACTER(LEN = 80) :: ERR_MSG !可分配数组报错信息.
IF ( m >= 0 ) THEN !确定可分配数组维度.
N = m + 1
ELSE
N = ABS( m-1 )
END IF
ALLOCATE( CBSJ( N ), STAT = status, ERRMSG = ERR_MSG) !分配内存.
allocate_ok: IF (status == 0) THEN
CALL Z_BSJNS ( Z, N, CBSJ )
!CALL DCBJNS (Z, N, CBS)
IF ( m >= 0 ) THEN !直接调用IMSL库计算结果.
IMSL_J = CBSJ(m+1)
ELSE !利用贝塞尔函数的性质计算结果.
IMSL_J = ( -1.0_NP )** ABS(m) * CBSJ(ABS(m-1))
END IF
ELSE
WRITE(*,*) ' IMSL_J函数内存分配失败,内存非配失败的信息: ', ERR_MSG
END IF allocate_ok
!释放可分配数组的内存.
DEALLOCATE( CBSJ , stat = status, ERRMSG = ERR_MSG)
!WRITE(*,*) 'CBS释放完毕.'
END FUNCTION
!***********************************************************************************************************************!
!
!宗量为一般复数的第一类整数阶贝塞尔函数一阶导数,调用IMSL函数库.
!
!
!***********************************************************************************************************************!
FUNCTION IMSL_J1( m,z )
USE Share_Data
IMPLICIT NONE
COMPLEX( KIND = DBL ) :: IMSL_J1 !IMSL库中,宗量为一般复数的第一类整数阶贝塞尔函数一阶导数.
!COMPLEX( KIND = DBL ) :: IMSL_J !IMSL库中,宗量为一般复数的第一类整数阶贝塞尔函数.
COMPLEX( KIND = DBL ),INTENT(IN) :: z !贝塞尔函数的宗量.
INTEGER,INTENT(IN) :: m !贝塞尔函数的阶数.
!IMSL_J1 = ( IMSL_J(m-1,z) - IMSL_J(m+1,z) ) / 2.0_NP
IMSL_J1 = -IMSL_J(m+1,z) + m / z * IMSL_J(m,z)
!WRITE(*,*)'IMSL_J1中的m',m
!WRITE(*,*)'IMSL_J1中的z',z
!
!WRITE(*,*)'IMSL_J(m-1,z)',IMSL_J(m-1,z)
!WRITE(*,*)'IMSL_J(m+1,z)',IMSL_J(m+1,z)
!
!WRITE(*,*)'IMSL_J1',IMSL_J1
END FUNCTION
!***********************************************************************************************************************!
!
!宗量为一般复数的第二类整数阶贝塞尔函数,调用IMSL函数库.
!
!
!***********************************************************************************************************************!
FUNCTION IMSL_Y( m ,z )
USE Share_Data
include 'link_fnl_static.h' !调用IMSL2018
USE CBYS_INT
USE UMACH_INT
IMPLICIT NONE
COMPLEX( KIND = DBL ) :: IMSL_Y !IMSL库中,宗量为一般复数的第二类整数阶贝塞尔函数.
COMPLEX( KIND = DBL ),INTENT(IN) :: z !贝塞尔函数的宗量.
INTEGER,INTENT(IN) :: m !贝塞尔函数的阶数.
INTEGER :: N !设定该函数最大计算阶数.
REAL( KIND = NP ) :: XNU
COMPLEX( KIND = DBL ), ALLOCATABLE, DIMENSION(:) :: CBSY !贝塞尔函数值构成的数组.
!可分配数组信息.
INTEGER :: status !可分配数组分配状态.
CHARACTER(LEN = 80) :: ERR_MSG !可分配数组报错信息.
XNU = 0.0_NP
IF ( m >= 0 ) THEN !确定可分配数组维度.
N = m + 1
ELSE
N = ABS( m-1 )
END IF
ALLOCATE( CBSY( N ), STAT = status, ERRMSG = ERR_MSG) !分配内存.
allocate_ok: IF (status == 0) THEN
! CALL CBYS (XNU, Z, N, CBS)
CALL D_CBYS (XNU, Z, N, CBSY)
IF ( m >= 0 ) THEN !直接调用IMSL库计算结果.
IMSL_Y = CBSY(m+1)
ELSE !利用贝塞尔函数的性质计算结果.
IMSL_Y = ( -1.0_NP )** ABS(m) * CBSY(ABS(m-1))
END IF
ELSE
WRITE(*,*) ' IMSL_Y函数内存分配失败,内存分配失败的信息: ', ERR_MSG
END IF allocate_ok
!释放可分配数组的内存.
DEALLOCATE( CBSY , stat = status, ERRMSG = ERR_MSG)
!WRITE(*,*) 'CBS释放完毕.'
END FUNCTION
!***********************************************************************************************************************!
!
!宗量为一般复数的第二类整数阶贝塞尔函数一阶导数,调用IMSL函数库.
!
!
!***********************************************************************************************************************!
FUNCTION IMSL_Y1( m,z )
USE Share_Data
IMPLICIT NONE
COMPLEX( KIND = DBL ) :: IMSL_Y1 !IMSL库中,宗量为一般复数的第二类整数阶贝塞尔函数一阶导数.
!COMPLEX( KIND = DBL ) :: IMSL_Y !IMSL库中,宗量为一般复数的第二类整数阶贝塞尔函数.
COMPLEX( KIND = DBL ),INTENT(IN) :: z !贝塞尔函数的宗量.
INTEGER,INTENT(IN) :: m !贝塞尔函数的阶数.
!IMSL_Y1 = ( IMSL_Y(m-1,z) - IMSL_Y(m+1,z) ) / 2.0_NP
IMSL_Y1 = -IMSL_Y(m+1,z) + m / z * IMSL_Y(m,z)
!WRITE(*,*)'IMSL_Y1中的m',m
!WRITE(*,*)'IMSL_Y1中的z',z
!
!WRITE(*,*)'IMSL_Y(m-1,z)',IMSL_Y(m-1,z)
!WRITE(*,*)'IMSL_Y(m+1,z)',IMSL_Y(m+1,z)
!
!WRITE(*,*)'IMSL_Y1',IMSL_Y1
END FUNCTION
!***********************************************************************************************************************!
!
!宗量为一般复数的第一类整数阶汉开尔函数,调用IMSL函数库.
!
!
!***********************************************************************************************************************!
FUNCTION IMSL_H( m,z )
USE Share_Data
IMPLICIT NONE
COMPLEX( KIND = DBL ) :: IMSL_H !IMSL库中,宗量为一般复数的第一类整数阶汉开尔函数.
!COMPLEX( KIND = DBL ) :: IMSL_J !IMSL库中,宗量为一般复数的第一类整数阶贝塞尔函数.
!COMPLEX( KIND = DBL ) :: IMSL_Y !IMSL库中,宗量为一般复数的第二类整数阶贝塞尔函数.
COMPLEX( KIND = DBL ),INTENT(IN) :: z !贝塞尔函数的宗量.
INTEGER,INTENT(IN) :: m !贝塞尔函数的阶数.
IMSL_H = IMSL_J( m,z ) + cj * IMSL_Y( m,z )
END FUNCTION
!***********************************************************************************************************************!
!
!宗量为一般复数的第一类整数阶汉开尔函数一阶导数,调用IMSL函数库.
!
!
!***********************************************************************************************************************!
FUNCTION IMSL_H1( m,z )
USE Share_Data
IMPLICIT NONE
COMPLEX( KIND = DBL ) :: IMSL_H1 !IMSL库中,宗量为一般复数的第一类整数阶汉开尔函数一阶导数.
!COMPLEX( KIND = DBL ) :: IMSL_J1 !IMSL库中,宗量为一般复数的第一类整数阶贝塞尔函数一阶导数.
!COMPLEX( KIND = DBL ) :: IMSL_Y1 !IMSL库中,宗量为一般复数的第二类整数阶贝塞尔函数一阶导数.
COMPLEX( KIND = DBL ),INTENT(IN) :: z !贝塞尔函数的宗量.
INTEGER,INTENT(IN) :: m !贝塞尔函数的阶数.
IMSL_H1 = IMSL_J1( m,z ) + cj * IMSL_Y1( m,z )
!WRITE(*,*)'IMSL_H1中的m',m
!WRITE(*,*)'IMSL_H1中的z',z
!
!WRITE(*,*)'IMSL_J1',IMSL_J1( m,z )
!WRITE(*,*)'IMSL_Y1',IMSL_Y1( m,z )
!
!WRITE(*,*)'IMSL_H1',IMSL_H1
END FUNCTION
END MODULE BESSEL_MODULE