FORTRAN 变量输出不等于输入
FORTRAN variable output not equal to input
首先,我是 FORTRAN 和大多数编程形式的完全新手。话虽如此,我正在尝试构建一个盒子,然后为 100 个原子随机生成 x、y、z 坐标。从那里开始,目标是计算每个原子之间的距离并对距离结果执行一些数学运算。下面是我的代码。尽管 n 被定义为 100,并且将打印“100”,但当我打印 cx 时,我只得到 20 个结果。
program energytot
implicit none
integer :: i, n, j, seed(12), k, m
double precision:: sigma, r, epsilon, lx, ly, lz
double precision, dimension(:), allocatable :: cx, cy, cz, dx, dy, dz, x, y, z, LJx, LJy, LJz
allocate(x(n), y(n), z(n), LJx(n), LJy(n), LJz(n), dx(n), dy(n), dz(n))
n = 100 !Number of molecules inside the box
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)=1+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 with (0,0,0) as the central point
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(j+1)))
LJx = 4 * epsilon * ((sigma/dx(j))**12 - (sigma/dx(j))**6)
dy = ABS((cy(j) - cy(j+1)))
LJy = 4 * epsilon * ((sigma/dy(j))**12 - (sigma/dy(j))**6)
dz = ABS((cz(j) - cz(j+1)))
LJz = 4 * epsilon * ((sigma/dz(j))**12 - (sigma/dz(j))**6)
end do
end do
print*,cx
print*,x
end program energytot
您声明 cx
(以及 cy
和 cz
)allocatable
,但您没有为它们分配 space。此外,在为变量 n
赋值之前,您将其用作要为其他 allocatable
分配的元素数。为什么其中任何一个甚至需要首先动态分配?
我会替换此代码...
integer :: i, n, j, seed(12), k, m
double precision:: sigma, r, epsilon, lx, ly, lz
double precision, dimension(:), allocatable :: cx, cy, cz, dx, dy, dz, x, y, z, LJx, LJy, LJz
allocate(x(n), y(n), z(n), LJx(n), LJy(n), LJz(n), dx(n), dy(n), dz(n))
n = 100 !Number of molecules inside the box
...有了这个:
integer, parameter :: n = 100
integer :: i, j, seed(12), k, m
double precision :: sigma, r, epsilon, lx, ly, lz
double precision, dimension(n) :: cx, cy, cz, dx, dy, dz, x, y, z, LJx, LJy, LJz
我还观察到,在计算距离的循环中,您遍历了变量 k
,但没有使用它的值。结果,您似乎多次计算相同的距离。
首先,我是 FORTRAN 和大多数编程形式的完全新手。话虽如此,我正在尝试构建一个盒子,然后为 100 个原子随机生成 x、y、z 坐标。从那里开始,目标是计算每个原子之间的距离并对距离结果执行一些数学运算。下面是我的代码。尽管 n 被定义为 100,并且将打印“100”,但当我打印 cx 时,我只得到 20 个结果。
program energytot
implicit none
integer :: i, n, j, seed(12), k, m
double precision:: sigma, r, epsilon, lx, ly, lz
double precision, dimension(:), allocatable :: cx, cy, cz, dx, dy, dz, x, y, z, LJx, LJy, LJz
allocate(x(n), y(n), z(n), LJx(n), LJy(n), LJz(n), dx(n), dy(n), dz(n))
n = 100 !Number of molecules inside the box
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)=1+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 with (0,0,0) as the central point
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(j+1)))
LJx = 4 * epsilon * ((sigma/dx(j))**12 - (sigma/dx(j))**6)
dy = ABS((cy(j) - cy(j+1)))
LJy = 4 * epsilon * ((sigma/dy(j))**12 - (sigma/dy(j))**6)
dz = ABS((cz(j) - cz(j+1)))
LJz = 4 * epsilon * ((sigma/dz(j))**12 - (sigma/dz(j))**6)
end do
end do
print*,cx
print*,x
end program energytot
您声明 cx
(以及 cy
和 cz
)allocatable
,但您没有为它们分配 space。此外,在为变量 n
赋值之前,您将其用作要为其他 allocatable
分配的元素数。为什么其中任何一个甚至需要首先动态分配?
我会替换此代码...
integer :: i, n, j, seed(12), k, m
double precision:: sigma, r, epsilon, lx, ly, lz
double precision, dimension(:), allocatable :: cx, cy, cz, dx, dy, dz, x, y, z, LJx, LJy, LJz
allocate(x(n), y(n), z(n), LJx(n), LJy(n), LJz(n), dx(n), dy(n), dz(n))
n = 100 !Number of molecules inside the box
...有了这个:
integer, parameter :: n = 100
integer :: i, j, seed(12), k, m
double precision :: sigma, r, epsilon, lx, ly, lz
double precision, dimension(n) :: cx, cy, cz, dx, dy, dz, x, y, z, LJx, LJy, LJz
我还观察到,在计算距离的循环中,您遍历了变量 k
,但没有使用它的值。结果,您似乎多次计算相同的距离。