2016-08-22 35 views
0

我有下面給出的兩個子程序:調試子程序的變量Defintions

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

你有幾個錯誤,在這裏,所以我會盡力解釋每一個主要的因素

  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. A Type mismatch在呼叫densitymatrixnew。這個很容易,你聲明densitymatrixnew需要5個參數,但是當你調用它時你傳遞6個參數(注意在調用中額外的D參數)。

  3. Can't open module file ...你需要確保你已經編譯包含模塊function_container嘗試編譯SBWOcohNew.f並確保模塊文件(*的.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 
+0

我能問關於點1個問題嗎?是否有可能使用另一個局部變量(而不是命名常量)在聲明行中初始化局部變量?我用gfortran試過但沒有成功(用上面的錯誤信息)。另外,由於初始化意味着自動保存SAVE屬性,所以我猜想在局部變量的所有聲明完成後分配值會更安全。 – roygvib

+0

@roygvib是的,除非你真的想添加保存屬性(但是我個人明確地添加了這個),否則在聲明後初始化肯定會更好。我認爲'energygap'等將不得不被聲明爲這個工作的參數(爲了使這個更清晰,我會進行編輯)。 –

+0

謝謝,我感覺上面gfortran的錯誤信息有點令人困惑......(如果有任何「變量」不允許用於初始化) – roygvib