-1

Fortran 90 で配列をゼロに設定して、何度も行ったことを実行しています。しかし、何らかの理由でこの場合は機能せず、その理由がわかりません。

配列を割り当てて使用しますA = 0.d0が、コンポーネントの1つを書き出すと、0.4xxxとして出力されます

これが違いを生む場合、私の配列はモジュールレベルの配列であり、サブルーチン内で初期化しています。

なぜこれが起こっているのか、誰にも分かりますか?

編集:申し訳ありませんが、私は不在だったので応答していません。これはまだ起こっています。gfortran 4.3 を使用しています。役立つかどうかを確認するためにいくつかのことを変更しましたが、そうではありません。以下で、要素を2 つの方法でゼロに設定していることに注意してください。ループ内ではそれらは確実にゼロに設定されていますが、ループ後に少なくとも 1 つの要素が明確な理由もなく非ゼロになっています。他のすべての要素もゼロではないことを知っています。関連する配列をローカル サブルーチン配列に変更しましたが、これは効果がありません。以下は、私に間違った出力を与えているコードです:

subroutine coeff_cube(f, Ng,x_max_8,coeffs)
  integer, intent(in)   :: Ng
  real(8), intent(in)   :: f(Ng,Ng,Ng)
  real(8), intent(in)   :: x_max_8


  integer               :: i,j,k,ii,jj,kk

  real(8)                :: Ints(Ng,nmax+1)
  real(8), intent(out)  :: coeffs(nmax+1,nmax+1,nmax+1)

  call cube_ints(x_max_8,Ng,Ints)

  write(*,*) "NOW NMAX IS: ", nmax       !Prints '24'
  coeffs = 0.0d0
  do i=1,nmax+1
    do j=1,nmax+1
      do k=1,nmax+1
        coeffs(i,j,k) = 0.d0
        write(*,*) coeffs(i,j,k)  !Prints 0.0000000000000000 for all i,j,k
      end do
    end do
  end do

  write(*,*) coeffs(1,3,28)               !Prints a non-zero number
  coeffs(1,3,28) = 0.0d0
  write(*,*) coeffs(1,3,28)               !Prints 0.0000000000000000

  do k=1,nmax+1
    i=1
    j=1
    if (i+j+k .GT. nmax+1)then
            exit
    end if
    do j=1,nmax+1
        i=1
        if (i+j+k .GT. nmax+1)then
            exit
        end if
      do i=1,nmax+1
        if (i+j+k .GT. nmax+1)then
            exit
        end if
        do kk=1,Ng
          do jj = 1,Ng
            do ii = 1,Ng
                coeffs(i,j,k) = coeffs(i,j,k) + &
                & f(ii,jj,kk)*Ints(ii,i)*Ints(jj,j)*Ints(kk,k)
                if(i==1.AND.j==3.AND.k==28)then
                    if (kk==1) then
                    write(*,*) coeffs(i,j,k)
                    end if
                end if
            end do
          end do
        end do
      end do
    end do
  end do
  write(*,*) coeffs(1,3,28)          !Prints 0.0000000000000000
end subroutine

誰にもアイデアはありますか?ありがとう。

4

2 に答える 2

2

すみません・・・分かってしまいました。

実際には配列をゼロに設定しますが、何らかの理由で配列にない (範囲外) 要素を書き込んでいます。古いものを書き出すのではなく、エラーが発生することを期待していましたが、それは単なるfortranだと思います...

于 2012-07-24T23:49:42.963 に答える
1

単一のステートメントで配列全体を初期化できることをご存知ですか?

coeffs = 0.0d

配列のすべての要素を 0 に設定します。

于 2012-07-20T21:12:40.553 に答える