-1

2 つの配列を追加しようとしていますが、何らかの理由でターゲット配列にゼロしか含まれていません。プログラムをコンパイルして実行すると、エラーは発生しませんが、出力ファイルが間違っています。コードでは、配列 Gnaatm と Gnascf に値を入力する dhscf を呼び出し、givenaa と Givenas にそれらを保存しようとし、dhscf を再度呼び出して、Gnaatm と Gnascf の新しい値を取得します。これらすべての配列をファイルに書き込むと、gnaatm と Gnascf は空ではありませんが、givenas en Givenaa は空に見えます。

私が使用しているコードは次のとおりです。

モジュール変数

   real(dp), dimension(:), allocatable :: Gnaatm(:), Gnascf(:), gavenaa(:), &
 & gavenas(:)

エンドモジュール

grdsam.f:

allocate (Gnaatm(nasize))
allocate (Gnascf(nasize))
allocate (gavenaa(nasize))
allocate (gavenas(nasize))

    call dhscf(.....)
    gavenaa = Gnaatm 
        gavenas = Gnascf

    do ipt = 1, npt

      call dhscf(....)
       gavenaa = Gnaatm + gavenaa
       gavenas = Gnascf + gavenas
    enddo

open(unit=12, file="Zgavenaatm.txt", status="replace")
  do iwrite = 1, nasize
    write(12, *), iwrite, gavenaa(iwrite), Gnaatm(iwrite) 
  enddo
close(12)

open(unit=12, file="Zgavenascf.txt", status="replace")
  do iwrite = 1, nasize
    write(12, *), iwrite, gavenas(iwrite), Gnascf(iwrite) 
  enddo
close(12)

deallocate (Gnaatm)
deallocate (Gnascf)
deallocate (gavenaa)
deallocate (gavenas)

エンドグラサム

プログラムを実行するとエラーは発生しませんが、出力ファイルが間違っています。典型的な出力は次のようになります。

      10   0.0000000000000000      -2.35488624992556957E-015
      11   0.0000000000000000      -4.75822627213221874E-017
      12   0.0000000000000000      -7.16040821425613171E-014
      13   0.0000000000000000       8.33283089385797112E-021
      14   0.0000000000000000      -1.04121906025281556E-014

2 列目にはゼロのみが含まれていますが、3 列目には数値が含まれています。したがって、配列 'Gnaatm' と 'Gnascf' には数字が含まれていますが、なぜか 'gavenaa' と 'gavenas' にそれらを追加するとうまくいきません。誰が私が間違っているのか教えてもらえますか?

ps。Ubuntu 12 で gfortran コンパイラを使用しています。

4

2 に答える 2

3

fortranコンパイラーが2つの配列を追加するなどの基本的な問題を抱えていた場合、私は本当に驚きます。そのため、表示されているコードが使用しているコードと正確に一致していないか、コードの一部が省略されています。

まず、ここでは表示しないので、質問implicit noneします。コードに含まれていますか?それなしで続けるのは時間の無駄です。変数名のつづりの間違いなど、多くの「ばかげた」エラーを回避します。

次に、関心のある配列(の一部)を画面に書き込む、昔ながらのデバッグ方法を試しましたか?次のようなステートメントを入力するだけです

write(*,*) gavenaa(:5)

代入ステートメントの直後に、配列に期待する値が含まれているかどうかを確認します。

それでも問題が発生する場所が見つからない場合は、同じ問題が発生する最小限の、しかし完全な例にコードを減らしてみてください。多くの場合、これを実行しているときに間違いが見つかりますが、そうでない場合は、完全で直接コンパイルされるコードを提供できれば、他の人があなたを助けるのははるかに簡単です。

于 2013-01-31T19:41:11.510 に答える
1

配列全体の割り当てを行っているだけなら、なぜforall構造体に悩まされているのですか? 問題の配列はすべて同じサイズであるため、このブロックを単純化できます。

gavenaa(1:nasize) = Gnaatm(1:nasize)
forall(icount = 1:nasize) 
    gavenas(icount) = Gnascf(icount) + gavenas(icount)
end forall

gavenaa = Gnaatm
gavenas = Gnascf + gavenas

コードの残りの部分でも同様です。

あなたの の使用が間違っているとは言えませんがforall、それは不必要であり、コードを少しスリム化することは、あなたと私たちが問題を適切に診断して修正するのに役立ちます.

于 2013-01-31T14:07:00.280 に答える