2017-02-10 79 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