Fortran

时间:2017-02-10 14:23:01

标签: matrix fortran

我有一个简单的子程序来构造紧束缚哈密顿量。它构造一个仅在对角线和最近的对角线上具有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的来源,因为在我的子程序中,矩阵的所有条目(除了明确指定的条目除外)都设置为零。 我没有考虑的索引是否存在任何问题?

1 个答案:

答案 0 :(得分:5)

您超出了数组范围。编译时使用错误检查(-fcheck=all-check或其他内容(取决于编译器)来诊断类似错误。

例如

 s(i+1,i+2+1) 
i+1接近i+2+1时,{p} ilda都太大,而且误差超过了误差范围。所有行都有类似的问题。