i-coder 2020-05-04 14:18 采纳率: 0%
浏览 137

Fortan单独调用函数没问题,循环调用则出错,原因在哪?请高手指点。

  1. 如标题所示,单独调用某一函数,则得正确计算结果,循环调用则会出错。调用的函数时IMSL2018中的总量为一般复数的贝塞尔函数。 。
  2. 确定循环过程中输入的参量没问题,就是函数会计算出现错误。图片说明
  3. 如图所示,单独计算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
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-05-04 14:55
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 freertos下使用外部中断失效
  • ¥15 输入的char字符转为int类型,不是对应的ascall码,如何才能使之转换为对应ascall码?或者使输入的char字符可以正常与其他字符比较?
  • ¥15 devserver配置完 启动服务 无法访问static上的资源
  • ¥15 解决websocket跟c#客户端通信
  • ¥30 Python调用dll文件输出Nan重置dll状态
  • ¥15 浮动div的高度控制问题。
  • ¥66 换电脑后应用程序报错
  • ¥50 array数据同步问题
  • ¥15 pic16F877a单片机的外部触发中断程序仿真失效
  • ¥15 Matlab插值拟合差分微分规划图论