【问题标题】:Debugging Subroutines for Variable Defintions调试变量定义的子程序
【发布时间】:2016-08-23 22:32:34
【问题描述】:

我有下面给出的两个子程序:

SUBROUTINE DENSITYMATRIXNEW(X,C,A,B,RHONEW)
IMPLICIT NONE
COMPLEX*16, DIMENSION(DIMMAT,1),INTENT(IN)::X
COMPLEX(KIND = DBL), DIMENSION(DIMSYS,DIMSYS) :: RHO
COMPLEX(KIND = DBL), DIMENSION(DIMSYS,DIMSYS), INTENT(OUT) :: RHONEW
REAL(KIND = DBL) :: ENERGYGAP, DELTA
REAL(KIND = DBL) :: ALPHA = SQRT(ENERGYGAP**2.0D0 + DELTA**2.0D0)
COMPLEX(KIND = DBL), DIMENSION(2,2), INTENT(IN) :: A, B
REAL(KIND=DBL), DIMENSION(2,2), INTENT(IN) :: C
REAL(KIND=DBL), DIMENSION(2,2) :: TEMP1
COMPLEX(KIND = DBL), DIMENSION(2,2) :: TEMP2
COMPLEX(KIND = DBL), DIMENSION(2,2) :: UNITARY, UNITARTCONJ
REAL(KIND = DBL) :: T
TEMP1 = COS((ALPHA*T)/2) * C
TEMP2 = ((ENERGYGAP/ALPHA)*A + (DELTA/ALPHA)*B)*SIN((ALPHA*T)/2)
UNITARY = TEMP1 - IMU * TEMP2
UNITARTCONJ = TEMP1 + IMU * TEMP2
CALL DENSITYMATRIX(X,RHO)
RHONEW = UNITARTCONJ*RHO*UNITARY
END SUBROUTINE DENSITYMATRIXNEW

SUBROUTINE EXPECTATION(X,C,A,B,D,ANS)
IMPLICIT NONE
COMPLEX*16, DIMENSION(DIMMAT,1),INTENT(IN) :: X
REAL(KIND = DBL), DIMENSION(2,2),INTENT(IN) :: C
COMPLEX(KIND = DBL), DIMENSION(2,2), INTENT(IN) :: A, B
COMPLEX(KIND = DBL),DIMENSION(DIMSYS,DIMSYS),INTENT(IN)::D
REAL(KIND = DBL), INTENT(OUT) :: ANS
COMPLEX(KIND = DBL), DIMENSION(DIMSYS, DIMSYS):: RHONEW
COMPLEX*16, DIMENSION(DIMSYS, DIMSYS) :: TEMP
INTEGER :: J
REAL(KIND = DBL)::SUMM
SUMM = 0.0D0
!CALL DENSITYMATRIX(X,RHO)
CALL DENSITYMATRIXNEW(X,C,A,B,D,RHONEW)
TEMP = MATMUL(D,RHONEW)
DO J = 1, DIMSYS
SUMM = SUMM + DREAL(TEMP(J,J))
END DO
ANS = SUMM
END SUBROUTINE EXPECTATION

当我将它们作为更大程序的一部分运行时,我得到了错误:

可能是什么问题?我想我已经定义了所有变量。我似乎无法调试代码。

【问题讨论】:

    标签: debugging fortran subroutine


    【解决方案1】:

    这里有几个错误,所以我将尝试解释每个主要错误

    1. REAL(KIND = DBL) :: ALPHA=SQRT(ENERGYGAP**2.0d0 + DELTA**2.0d0) -- 错误为energygap has not been declared or is a variable , which does not reduce to a constant expression。你是正确的,你已经在densitymatrixnew 中声明了energygap(和delta),但是你没有给它们一个值,所以编译器不知道将alpha 设置为什么值。本质上,如果您想在声明 real :: a = b 中初始化一个变量,那么您需要确保编译器在编译时知道 b 的值是什么。它实际上比这更严格,b 必须声明为参数,我在列表底部给出了一个示例。

    2. Type mismatch 正在调用densitymatrixnew。这很简单,您已经声明 densitymatrixnew 接受 5 个参数,但是当您调用它时,您传递了 6 个参数(注意调用中额外的 D 参数)。

    3. Can't open module file ... 在尝试编译 SBWOcohNew.f 之前,您需要确保已编译包含模块 function_container 的文件,并确保模块文件 (*.mod) 可用(最简单只是把它放在这个目录中)。

    我希望这会有所帮助。以后,我建议您将错误复制并粘贴为文本,而不是提供屏幕截图——这会让一切变得更容易。

    第 1 点的示例。以下是允许的

    subroutine test
       implicit none
       real, parameter :: b = 2.0
       real :: a = b
    end subroutine
    

    但以下不会

    subroutine test
       implicit none
       real :: b = 2.0
       real :: a = b
    end subroutine
    

    【讨论】:

    • 我可以问一个关于第 1 点的问题吗?是否可以在声明行中用另一个局部变量(而不是命名常量)初始化一个局部变量?我用 gfortran 尝试过,但没有成功(带有上述错误消息)。另外,由于初始化自动暗示了 SAVE 属性,我想在完成所有局部变量的声明后赋值会更安全。
    • @roygvib 是的,除非你真的想添加 save 属性,否则在声明之后初始化肯定会更好(但我还是会亲自明确添加)。我认为必须将energygap 等声明为参数才能使其工作(我将对其进行编辑以使其更清晰)。
    • 谢谢,感觉上面gfortran的错误信息有点混乱……(如果初始化时不允许使用任何“变量”)
    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多