我有一个简单的子程序来构造紧束缚哈密顿量。它构造一个仅在对角线和最近的对角线上具有2x2块的矩阵。它是这样的(我的代码中有许多参数定义):
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的来源,因为在我的子程序中,矩阵的所有条目(除了明确指定的条目除外)都设置为零。 我没有考虑的索引是否存在任何问题?
答案 0 :(得分:5)
您超出了数组范围。编译时使用错误检查(-fcheck=all
或-check
或其他内容(取决于编译器)来诊断类似错误。
例如
s(i+1,i+2+1)
当i+1
接近i+2+1
时,{p} i
和lda
都太大,而且误差超过了误差范围。所有行都有类似的问题。