调试变量定义的子程序

时间:2016-08-22 08:30:27

标签: debugging fortran subroutine

我有以下两个子程序:

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

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

enter image description here

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

1 个答案:

答案 0 :(得分: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。你在energygap中声明delta(和densitymatrixnew)是正确的,但是你没有给它们一个值,所以编译器不知道要设置什么值{{1 }} 至。基本上,如果要在声明alpha中初始化变量,则需要确保编译器在编译时知道real :: a = b的值是什么。它实际上甚至比这更严格,b必须被声明为参数,我在列表的底部给出了一个例子。

  2. b来电Type mismatch。这个很容易,你已经声明densitymatrixnew接受5个参数但是当你调用它时你传递了6个参数(注意调用中额外的densitymatrixnew参数)。

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

  4. 我希望有所帮助。在将来,我建议您将错误复制并粘贴为文本,而不是提供屏幕截图 - 它使一切变得更加容易。

    第1点的示例。允许以下内容

    SBWOcohNew.f

    但以下不会

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