我有一个简单的子程序来构造一个紧束缚哈密尔顿函数。它只在对角线和最近的对角线上构造一个具有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矩阵(除了那些明确指定的)被设置为零。 我没有考虑到索引有问题吗?
'lda'如何在子程序中获得所需的值? – francescalus
嗨。在这种情况下,它是一个设置为10的整数参数。 –