2017-02-10 9 views
0

私は、きつい結合ハミルトニアンを構築するための簡単なサブルーチンを用意しました。これは、対角線上で最も近いオフ対角にのみ2×2ブロックの行列を構築する。Fortranでの行列構築に関する問題

call hlayer(a,b) 

:私は、メインプログラム(それが途中で問題なく動作します)でサブルーチンを呼び出す場合

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 

:それは、この(私のコードでは上記で定義された多くのパラメータがある)のようなものです私はのために、次の行列を取得し、サブルーチン内の変数(この場合、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は、すべてのエントリの私のサブルーチンであるため、どこから来るか私は理解していませんthのe行列(明示的に割り当てられた行列を除く)は0に設定されます。 私が考慮していないインデックスに問題はありますか?

+0

サブルーチンであなたが望む値を 'lda'で得るにはどうしたらいいですか? – francescalus

+0

こんにちは。この場合、整数パラメータは10に設定されています。 –

答えて

5

あなたは配列境界を超えています。類似のエラーを診断するために、エラーチェック(-fcheck=allまたは-checkまたはそれ以外のもの)をコンパイルします。 ildaに近く、結合されたエラー、よりとき

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

両方i+1i+2+1例えば

は大きすぎます。すべての行に同様の問題があります。

+0

ありがとう、私はそれをチェックします。一方、インテルコンパイラ(ifort)でエラーをチェックする方法はありますか? –

+1

'-check'、それは答えにあります –

+0

部分的に...それはチェック境界です。 -checkは、境界、インターフェース、ユニット化されたものから始めてみる価値があります。 – Holmz

関連する問題