2017-02-10 114 views
0

我有一個簡單的子程序來構造一個緊束縛哈密爾頓函數。它只在對角線和最近的對角線上構造一個具有2×2塊的矩陣。它是這樣的(也有在我上面的代碼定義了許多參數):Fortran中矩陣構造的問題

subroutine hlayer(s,r) 
complex*16,dimension(1:lda,1:lda) :: s,r 
integer :: i,j 
s(:,:)=zero 
r(:,:)=zero 
! hamiltonian of the layer 
do i=1,lda,2 
    s(i,i)  = es 
    s(i,i+2) = tss 
    s(i,i+3) = tsp 
    s(i+2,i) = tss 
    s(i+3,i) = tsp 

    s(i+1,i+1) = ep 
    s(i+1,i+1+1) = tsp 
    s(i+1,i+2+1) = tpp 
    s(i+1+1,i+1) = tsp 
    s(i+1+2,i+1) = tpp 
end do 
! interaction between layers: 
do i=1,lda,2 
    r(i,i)  = tss 
    r(i,i+1) = tsp 
    r(i+1,i) = tsp 
    r(i+1,i+1) = tpp 
end do 
end subroutine 

當我調用子程序在主程序(它的方式有沒有問題運行):

call hlayer(a,b) 

我得到以下矩陣爲,在子程序變量s(在這種情況下,LDA = 10):

1.000 0.000 0.100 -0.150 0.000 0.000 0.000 0.000 0.000 0.100 
0.000 1.200 -0.150 0.000 0.000 0.000 0.000 0.000 0.000 0.000 
0.100 0.000 1.000 0.000 0.100 -0.150 0.000 0.000 0.000 0.000 
0.000 0.000 0.000 1.200 -0.150 0.000 0.000 0.000 0.000 0.000 
0.000 0.000 0.100 0.000 1.000 0.000 0.100 -0.150 0.000 0.000 
0.000 0.000 0.000 0.000 0.000 1.200 -0.150 0.000 0.000 0.000 
0.000 0.000 0.000 0.000 0.100 0.000 1.000 0.000 0.100 -0.150 
0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.200 -0.150 0.000 
0.000 0.000 0.000 0.000 0.000 0.000 0.100 0.000 1.000 0.000 
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.200 

,我不明白的地方右上方0.1從何而來,因爲在我的子程序的所有條目的e矩陣(除了那些明確指定的)被設置爲零。 我沒有考慮到索引有問題嗎?

+0

'lda'如何在子程序中獲得所需的值? – francescalus

+0

嗨。在這種情況下,它是一個設置爲10的整數參數。 –

回答

5

您超出了數組範圍。編譯錯誤檢查(-fcheck=all-check或其他,取決於編譯器)來診斷類似的錯誤。

例如

s(i+1,i+2+1) 

i+1i+2+1過大時i靠近lda並且更則誤差約束。所有行都有類似的問題。

+0

謝謝,我會檢查它。另一方面,你是否如何檢查英特爾編譯器(ifort)的錯誤? –

+1

'-check',它在回答中 –

+0

部分...它是 - 檢查邊界。檢查所有值得開始,因爲你得到的界限,接口和單位。 – Holmz