0

まず第一に、私はFORTRANの完全な初心者です。そうは言っても、ボックスを「構築」してから、100個の原子のx、y、z座標をランダムに生成しようとしています。そこから、目標は各原子間の距離を計算することであり、これがレナード・ジョーンズのポテンシャルエネルギー方程式の値「r」になります。次に、LJ ポテンシャルを計算し、最後にボックス全体のポテンシャルを合計します。このプロジェクトについて私が尋ねた以前の質問はこちらです。問題は、同じ計算値が何度も何度も得られることです。私のコードは以下です。

    program energytot
    implicit none

    integer, parameter :: n = 100
    integer :: i, j, k, seed(12)
    double precision :: sigma, r, epsilon, lx, ly, lz
    double precision, dimension(n) :: x, y, z, cx, cy, cz
    double precision, dimension(n*(n+1)/2) :: dx, dy, dz, LJx, LJy, LJz
    sigma = 4.1
    epsilon = 1.7
    !Box length with respect to the axis
    lx = 15
    ly = 15
    lz = 15

    do i=1,12
        seed(i)=i+3
    end do
    !generate n random numbers for x, y, z
    call RANDOM_SEED(PUT = seed)
    call random_number(x)
    call random_number(y)
    call random_number(z)
    !convert random numbers into x, y, z coordinates
    cx = ((2*x)-1)*(lx*0.5)
    cy = ((2*y)-1)*(lx*0.5)
    cz = ((2*z)-1)*(lz*0.5)

    do j=1,n-1
        do k=j+1,n
            dx = ABS((cx(j) - cx(k)))
            LJx = 4 * epsilon * ((sigma/dx(j))**12 - (sigma/dx(j))**6)
            dy = ABS((cy(j) - cy(k)))
            LJy = 4 * epsilon * ((sigma/dy(j))**12 - (sigma/dy(j))**6)
            dz = ABS((cz(j) - cz(k)))
            LJz = 4 * epsilon * ((sigma/dz(j))**12 - (sigma/dz(j))**6)
        end do
    end do

    print*, dx
    end program energytot
4

2 に答える 2

1

あなたの質問は正確には何ですか?コードに何をさせたいのか、代わりに何をするのか?

最後の print ステートメントprint*, dxに問題がある場合は、代わりに次の方法を試してください。

  print *, 'dx = '
  do i = 1, n * (n + 1) / 2
    print *, dx(i)
  end do

ループなしで印刷するには dx が大きすぎるようです。

また、配列 dx (およびループ内の他の配列) を単一の値に繰り返し割り当てているようです。代わりにこれを試してください:

  i = 0
  do j=1,n-1
      do k=j+1,n
          i = i + 1
          dx(i) = ABS((cx(j) - cx(k)))
      end do
  end do

このようにして、以前に保存された値を上書きするのではなく、各値cx(j) - cx(k)が の異なる要素に保存されます。dx

于 2015-04-14T00:07:05.683 に答える
0

私の新しいコードは次のようになります。

    program energytot
    implicit none

    integer, parameter :: n = 6
    integer :: i, j, k, seed(12)
    double precision :: sigma, r, epsilon, lx, ly, lz, etot, pot, rx, ry, rz
    double precision, dimension(n) :: x, y, z, cx, cy, cz
    sigma = 4.1
    epsilon = 1.7
    etot=0
    !Box length with respect to the axis
    lx = 15
    ly = 15
    lz = 15

    do i=1,12
        seed(i)=i+90
    end do
    !generate n random numbers for x, y, z
    call RANDOM_SEED(PUT = seed)
    call random_number(x)
    call random_number(y)
    call random_number(z)
    !convert random numbers into x, y, z coordinates
    cx = ((2*x)-1)*(lx*0.5)
    cy = ((2*y)-1)*(lx*0.5)
    cz = ((2*z)-1)*(lz*0.5)

    do j=1,n-1
        do k=j+1,n
            rx = (cx(j) - cx(k))
            ry = (cy(j) - cy(k))
            rz = (cz(j) - cz(k))
            !Apply minimum image convention
            rx=rx-lx*anint(rx/lx)
            ry=ry-ly*anint(ry/ly)
            rz=rz-lz*anint(rz/lz)

            r=sqrt(rx**2+ry**2+rz**2)
            pot=4 * epsilon * ((sigma/r)**12 - (sigma/r)**6)
            print*,pot
            etot=etot+pot

        end do
    end do

    print*, etot

    end program energytot
于 2015-04-14T22:19:19.177 に答える