Fortran 通用程序参考

Fortran 通用程序参考,fortran,fortran90,intel-fortran,Fortran,Fortran90,Intel Fortran,我试图编译一个fortran模块Y,其中包含一个函数和一个子例程,两者都调用相同的子例程X。编译此模块时,我得到以下错误: array_lib.F90(70): error #8032: Generic procedure reference has two or more specific procedure with the same type/rank/keyword signature. [MRGRNK] CALL mrgrnk(list,idx) -----------

我试图编译一个fortran模块Y,其中包含一个函数和一个子例程,两者都调用相同的子例程X。编译此模块时,我得到以下错误:

array_lib.F90(70): error #8032: Generic procedure reference has two or
more specific procedure with the same type/rank/keyword signature. [MRGRNK]
        CALL mrgrnk(list,idx)
-------------^
array_lib.F90(141): error #8032: Generic procedure reference has two or
more specific procedure with the same type/rank/keyword signature. [MRGRNK]
        CALL mrgrnk(xarr,ist)
有人能解释一下这是怎么回事吗。我不明白怎么了

我很欣赏对这方面的一些见解

代码:

模块阵列库
使用PARKIND1,仅限:JPIM、JPIB、JPRB
隐式无
包含
函数infind(list、val、sort、dist)
使用m_mrgrnk
隐式无
! ----- 投入-----
实数(种类=JPRB)、维度(:)、意图(IN)::列表
真实(种类=JPRB),意图(单位)::val
整数,意图(IN),可选::排序
! ----- 输出-----
整数(JPIM)::infind
REAL(KIND=JPRB),INTENT(OUT),可选::dist
! ----- 内部的-----
实(种类=JPRB),维(大小(列表))::列表
整数(JPIM)::nlist、result、tmp(1)、sort_list
整数(JPIM),维度(大小(列表))::掩码,idx
如果(出现(排序))那么
排序列表=排序
其他的
排序列表=0
如果结束
nlist=大小(列表)
如果(排序列表==1),则
呼叫mrgrnk(列表,idx)
列表=列表(idx)
其他的
列表=列表
如果结束
如果(val>=列表(nlist)),则
结果=nlist
否则如果(val tol)那么
打印*,“插值错误”
停止
如果结束
如果(iloc==nx),则
!     :: 设置为最后一个值
yyarr(i)=ysort(nx)
其他的
!     :: 是否还有其他接近值?
如果(ABS(xxarr(i)-xsort(iloc+1))<2*tol),则
!       :: 是的,做一个线性插值
m=(ysort(iloc+1)-ysort(iloc))/(xsort(iloc+1)-xsort(iloc))
yyarr(i)=ysort(iloc)+m*(xxarr(i)-xsort(iloc))
其他的
!       :: 否,设置为唯一附近的值
yyarr(i)=ysort(iloc)
如果结束
如果结束
结束
结束子程序lin_插值
端模块数组
模块M_MRGRNK:

MODULE m_mrgrnk
USE PARKIND1  ,ONLY : JPIM, JPIB, JPRB

PUBLIC :: mrgrnk
!PRIVATE :: kdp
PRIVATE :: R_mrgrnk, I_mrgrnk, D_mrgrnk

INTERFACE mrgrnk
MODULE PROCEDURE D_mrgrnk, R_mrgrnk, I_mrgrnk
END INTERFACE mrgrnk

CONTAINS

SUBROUTINE D_mrgrnk (XDONT, IRNGT)
REAL(KIND=JPRB), DIMENSION (:), INTENT (IN) :: XDONT
INTEGER(KIND=JPIM), DIMENSION (:), INTENT (OUT) :: IRNGT
REAL(KIND=JPRB):: XVALA, XVALB

INTEGER(KIND=JPIM), DIMENSION (SIZE(IRNGT)) :: JWRKT
INTEGER(KIND=JPIM) :: LMTNA, LMTNC, IRNG1, IRNG2
INTEGER(KIND=JPIM) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB

NVAL = Min (SIZE(XDONT), SIZE(IRNGT))
SELECT CASE (NVAL)
CASE (:0)
RETURN
CASE (1)
IRNGT (1) = 1
RETURN
CASE DEFAULT
CONTINUE
END SELECT

DO IIND = 2, NVAL, 2
    IF (XDONT(IIND-1) <= XDONT(IIND)) THEN
        IRNGT (IIND-1) = IIND - 1
        IRNGT (IIND) = IIND
    ELSE
        IRNGT (IIND-1) = IIND
        IRNGT (IIND) = IIND - 1
    END IF
END DO
IF (MODULO(NVAL, 2) /= 0) THEN
    IRNGT (NVAL) = NVAL
END IF

LMTNA = 2
LMTNC = 4

DO
IF (NVAL <= 2) EXIT

DO IWRKD = 0, NVAL - 1, 4
    IF ((IWRKD+4) > NVAL) THEN
        IF ((IWRKD+2) >= NVAL) EXIT

        IF (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) EXIT

        IF (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) THEN
            IRNG2 = IRNGT (IWRKD+2)
            IRNGT (IWRKD+2) = IRNGT (IWRKD+3)
            IRNGT (IWRKD+3) = IRNG2
        ELSE
            IRNG1 = IRNGT (IWRKD+1)
            IRNGT (IWRKD+1) = IRNGT (IWRKD+3)
            IRNGT (IWRKD+3) = IRNGT (IWRKD+2)
            IRNGT (IWRKD+2) = IRNG1
        END IF
        EXIT
    END IF
    IF (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) CYCLE
    IF (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) THEN
        IRNG2 = IRNGT (IWRKD+2)
        IRNGT (IWRKD+2) = IRNGT (IWRKD+3)
        IF (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) THEN
            IRNGT (IWRKD+3) = IRNG2
        ELSE
            IRNGT (IWRKD+3) = IRNGT (IWRKD+4)
            IRNGT (IWRKD+4) = IRNG2
        END IF
    ELSE
        IRNG1 = IRNGT (IWRKD+1)
        IRNG2 = IRNGT (IWRKD+2)
        IRNGT (IWRKD+1) = IRNGT (IWRKD+3)
        IF (XDONT(IRNG1) <= XDONT(IRNGT(IWRKD+4))) THEN
            IRNGT (IWRKD+2) = IRNG1
            IF (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) THEN
                IRNGT (IWRKD+3) = IRNG2
            ELSE
                IRNGT (IWRKD+3) = IRNGT (IWRKD+4)
                IRNGT (IWRKD+4) = IRNG2
            END IF
        ELSE
            IRNGT (IWRKD+2) = IRNGT (IWRKD+4)
            IRNGT (IWRKD+3) = IRNG1
            IRNGT (IWRKD+4) = IRNG2
        END IF
    END IF
END DO

LMTNA = 4
EXIT
END DO

DO
IF (LMTNA >= NVAL) EXIT
IWRKF = 0
LMTNC = 2 * LMTNC

DO
IWRK = IWRKF
IWRKD = IWRKF + 1
JINDA = IWRKF + LMTNA
IWRKF = IWRKF + LMTNC
IF (IWRKF >= NVAL) THEN
    IF (JINDA >= NVAL) EXIT
    IWRKF = NVAL
END IF
IINDA = 1
IINDB = JINDA + 1

JWRKT (1:LMTNA) = IRNGT (IWRKD:JINDA)

XVALA = XDONT (JWRKT(IINDA))
XVALB = XDONT (IRNGT(IINDB))

DO
IWRK = IWRK + 1

IF (XVALA > XVALB) THEN
    IRNGT (IWRK) = IRNGT (IINDB)
    IINDB = IINDB + 1
    IF (IINDB > IWRKF) THEN
    !  Only A still with unprocessed values
        IRNGT (IWRK+1:IWRKF) = JWRKT (IINDA:LMTNA)
        EXIT
    END IF
    XVALB = XDONT (IRNGT(IINDB))
ELSE
    IRNGT (IWRK) = JWRKT (IINDA)
    IINDA = IINDA + 1
    IF (IINDA > LMTNA) EXIT! Only B still with unprocessed values
    XVALA = XDONT (JWRKT(IINDA))
END IF

END DO
END DO
LMTNA = 2 * LMTNA
END DO

RETURN

END SUBROUTINE D_mrgrnk

SUBROUTINE R_mrgrnk (XDONT, IRNGT)
REAL(KIND=JPRB), DIMENSION (:), INTENT (IN) :: XDONT
INTEGER(KIND=JPIM), DIMENSION (:), INTENT (OUT) :: IRNGT
REAL(KIND=JPRB) :: XVALA, XVALB

INTEGER(KIND=JPIM), DIMENSION (SIZE(IRNGT)) :: JWRKT
INTEGER(KIND=JPIM) :: LMTNA, LMTNC, IRNG1, IRNG2
INTEGER(KIND=JPIM) :: NVAL, IIND, IWRKD, IWRK, IWRKF, JINDA, IINDA, IINDB

NVAL = Min (SIZE(XDONT), SIZE(IRNGT))
SELECT CASE (NVAL)
CASE (:0)
RETURN
CASE (1)
IRNGT (1) = 1
RETURN
CASE DEFAULT
CONTINUE
END SELECT

DO IIND = 2, NVAL, 2
    IF (XDONT(IIND-1) <= XDONT(IIND)) THEN
        IRNGT (IIND-1) = IIND - 1
        IRNGT (IIND) = IIND
    ELSE
        IRNGT (IIND-1) = IIND
        IRNGT (IIND) = IIND - 1
    END IF
END DO
IF (MODULO(NVAL, 2) /= 0) THEN
    IRNGT (NVAL) = NVAL
END IF
LMTNA = 2
LMTNC = 4
DO
IF (NVAL <= 2) EXIT
DO IWRKD = 0, NVAL - 1, 4
    IF ((IWRKD+4) > NVAL) THEN
        IF ((IWRKD+2) >= NVAL) EXIT
        IF (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) EXIT
        IF (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) THEN
            IRNG2 = IRNGT (IWRKD+2)
            IRNGT (IWRKD+2) = IRNGT (IWRKD+3)
            IRNGT (IWRKD+3) = IRNG2
        ELSE
            IRNG1 = IRNGT (IWRKD+1)
            IRNGT (IWRKD+1) = IRNGT (IWRKD+3)
            IRNGT (IWRKD+3) = IRNGT (IWRKD+2)
            IRNGT (IWRKD+2) = IRNG1
        END IF
        EXIT
    END IF
    IF (XDONT(IRNGT(IWRKD+2)) <= XDONT(IRNGT(IWRKD+3))) Cycle
    IF (XDONT(IRNGT(IWRKD+1)) <= XDONT(IRNGT(IWRKD+3))) THEN
        IRNG2 = IRNGT (IWRKD+2)
        IRNGT (IWRKD+2) = IRNGT (IWRKD+3)
        IF (XDONT(IRNG2) <= XDONT(IRNGT(IWRKD+4))) THEN
        !   1 3 2 4
            IRNGT (IWRKD+3) = IRNG2
        ELSE
        !   1 3 4 2
            IRNGT (IWRKD+3) = IRNGT (IWRKD+4)
            IRNGT (IWRKD+4) = IRNG2
        END IF
    ELSE
模块m\u mrgrnk
使用PARKIND1,仅限:JPIM、JPIB、JPRB
公共::mrgrnk
!私有::kdp
私人:R_mrgrnk,I_mrgrnk,D_mrgrnk
接口mrgrnk
模块程序D_mrgrnk、R_mrgrnk、I_mrgrnk
端接口mrgrnk
包含
子程序D_mrgrnk(XDONT,IRNGT)
实数(种类=JPRB)、维度(:)、意图(IN)::XDONT
整数(种类=JPIM),维度(:),意图(输出)::IRNGT
REAL(KIND=JPRB)::XVALA,XVALB
整数(种类=JPIM),维度(大小(IRNGT))::JWRKT
整数(种类=JPIM)::LMTNA、LMTNC、IRNG1、IRNG2
整数(KIND=JPIM)::NVAL、IIND、IWRKD、IWRK、IWRKF、JINDA、IINDA、IINDB
NVAL=最小值(尺寸(XDONT)、尺寸(IRNGT))
选择案例(NVAL)
大小写(:0)
返回
案例(1)
IRNGT(1)=1
返回
案例违约
继续
结束选择
DO IIND=2,NVAL,2
如果(XDONT(IIND-1)=NVAL)退出
如果(XDONT(IRNGT(IWRKD+2))这里有问题:

  • 与通用接口的特定接口必须是唯一的(类型/等级/等不得相同)
具体而言,发生的情况是,您的模块过程看起来不明显,因此当您:

CALL mrgrnk(xarr,ist)
编译器无法确定要调用哪个特定模块过程

您的通用接口是

INTERFACE mrgrnk
  MODULE PROCEDURE D_mrgrnk, R_mrgrnk, I_mrgrnk
END INTERFACE mrgrnk
您的特定接口是

SUBROUTINE D_mrgrnk (XDONT, IRNGT)
   REAL(KIND=JPRB), DIMENSION (:), INTENT (IN) :: XDONT
   INTEGER(KIND=JPIM), DIMENSION (:), INTENT (OUT) :: IRNGT
END SUBROUTINE

SUBROUTINE R_mrgrnk (XDONT, IRNGT)
   REAL(KIND=JPRB), DIMENSION (:), INTENT (IN) :: XDONT
   INTEGER(KIND=JPIM), DIMENSION (:), INTENT (OUT) :: IRNGT
END SUBROUTINE

SUBROUTINE I_mrgrnk (XDONT, IRNGT)
  INTEGER(KIND=JPIM), DIMENSION (:), INTENT (IN)  :: XDONT
  INTEGER(KIND=JPIM), DIMENSION (:), INTENT (OUT) :: IRNGT
END SUBROUTINE
正如您所看到的,
D\u mrgrnk
R\u mrgrnk
的接口是相同的,当您使用类型为
REAL(KIND=JPRB)
INTEGER(KIND=JPIM)的参数调用
mrgrnk
,编译器无法确定要调用哪个过程。为了解决此问题,您需要区分
D\u mrgrnk
R\u mrgrnk
的参数类型,并且根据它们的命名,您可能希望这样做的方式是使
D\u mrgrnk
采用双精度的实类型,而
R\mrgrnk
采用单精度的实数。

这里存在以下问题:

  • 与通用接口的特定接口必须是唯一的(类型/等级/等不得相同)
具体而言,发生的情况是,您的模块过程看起来不明显,因此当您:

CALL mrgrnk(xarr,ist)
编译器无法确定要调用哪个特定模块过程

您的通用接口是

INTERFACE mrgrnk
  MODULE PROCEDURE D_mrgrnk, R_mrgrnk, I_mrgrnk
END INTERFACE mrgrnk
您的特定接口是

SUBROUTINE D_mrgrnk (XDONT, IRNGT)
   REAL(KIND=JPRB), DIMENSION (:), INTENT (IN) :: XDONT
   INTEGER(KIND=JPIM), DIMENSION (:), INTENT (OUT) :: IRNGT
END SUBROUTINE

SUBROUTINE R_mrgrnk (XDONT, IRNGT)
   REAL(KIND=JPRB), DIMENSION (:), INTENT (IN) :: XDONT
   INTEGER(KIND=JPIM), DIMENSION (:), INTENT (OUT) :: IRNGT
END SUBROUTINE

SUBROUTINE I_mrgrnk (XDONT, IRNGT)
  INTEGER(KIND=JPIM), DIMENSION (:), INTENT (IN)  :: XDONT
  INTEGER(KIND=JPIM), DIMENSION (:), INTENT (OUT) :: IRNGT
END SUBROUTINE

正如您所看到的,
D\u mrgrnk
R\u mrgrnk
的接口是相同的,当您使用类型为
REAL(KIND=JPRB)
INTEGER(KIND=JPIM)的参数调用
mrgrnk
,编译器无法确定要调用哪个过程。为了解决此问题,您需要区分
D\u mrgrnk
R\u mrgrnk
的参数类型,并且根据它们的命名,您可能希望这样做的方式是使
D\u mrgrnk
采用双精度的实类型,而
R\mrgrnk
采用单精度的实数。

错误消息非常明确,告诉您问题发生在源文件中的确切位置。您定义了两个具有相同签名的子例程。但是,如果不显示代码,您希望得到更多帮助吗?抱歉。我现在添加了代码。您可以发布界面吗模块
m_mrgrnk
中的
mrgrnk
块?错误消息非常明确,并准确地告诉您源文件中出现问题的位置。您已定义了两个具有相同签名的子例程。但是在不显示代码的情况下,您希望得到更多的帮助吗?抱歉。我现在添加了代码。您可以在中发布吗模块
m_mrgrnk
中的
mrgrnk
接口块?对于这些更微妙的错误,我有点陌生。这段代码已经从F77翻译成Fortran 90。你是说在模块中,我不能定义函数和子例程吗?@Shejo284你当然可以这样做。你提供的错误不是抱怨关于这一点,它抱怨说您有一个泛型
接口
块,其中声明了两个不唯一的特定接口。您可以拥有您所拥有的任何过程和函数