Algorithm 如何将$n$粒子之间的距离保持在一定范围内?
我正在研究分子动力学中的一个问题,需要在一个大小为[-L,L]x[-L,L]的盒子内随机生成np粒子的位置数组。实际上,我需要为x(1)=0的x坐标生成x数组,为y(1)=y(2)=0的y坐标生成y数组。我需要粒子之间的距离在某个范围内(例如:0.9你需要所有粒子之间的距离范围o就在其中一些粒子之间?想要的图像表明后面的情况在这种情况下规则是什么?不确定我是否得到了你想要的,例如,你能定义“相邻”吗请?以上不是您的代码,请显示变量声明,它们很重要!如果您真的需要帮助,最好显示您实际编译和运行的内容。最后,为什么您不能设置一个规则晶格,使粒子之间的间距在您想要的范围的中间,然后稍微扰动一下?@Spektre如果拾取粒子,则该粒子与其最近邻居之间的距离在范围内,例如(0.8,1.2)@IanBush我所做的是为粒子数生成随机位置,比如说10,然后应用一些数值方案来找到它们的潜在最小值,或者换句话说,它们的配置将是什么样子。这是我的代码,请参阅上面编辑的代码。例如,让np=7个粒子,然后如果它们的初始位置与第一张图片中的位置相同RE(即,每个粒子和它最近的邻居之间的距离在一定范围内),然后这个系统有4种可能的构型,其中一个看起来像六边形,顶点上有6个粒子,中间有一个粒子(很难在评论中画出来)。Algorithm 如何将$n$粒子之间的距离保持在一定范围内?,algorithm,fortran,graph-algorithm,fortran90,fortran77,Algorithm,Fortran,Graph Algorithm,Fortran90,Fortran77,我正在研究分子动力学中的一个问题,需要在一个大小为[-L,L]x[-L,L]的盒子内随机生成np粒子的位置数组。实际上,我需要为x(1)=0的x坐标生成x数组,为y(1)=y(2)=0的y坐标生成y数组。我需要粒子之间的距离在某个范围内(例如:0.9你需要所有粒子之间的距离范围o就在其中一些粒子之间?想要的图像表明后面的情况在这种情况下规则是什么?不确定我是否得到了你想要的,例如,你能定义“相邻”吗请?以上不是您的代码,请显示变量声明,它们很重要!如果您真的需要帮助,最好显示您实际编译和运行的内
REAL, DIMENSION(np) :: x, y
REAL :: w1, w2, minv, maxv, xij, yij, rij
INTEGER :: i, j
!Generating random coordinates for the particles
x(1) = 0.0d0
y(1) = 0.0d0
y(2) = 0.0d0
!-------------------------------------------------------------------------
! translation and rotaion of the whole system were froze (saving 4 degrees of
! freedome)
! x(1) = 0.0d0; y(1) = 0.0d0 fix one particle in the origin
! y(2) = 0.0d0 fix the second particle on the x-axis
!-------------------------------------------------------------------------
rmatrix = 100.0
minv = 0.0
maxv = 10
iter0 = 0
101 DO WHILE(maxv >= 1.1 .OR. minv <= 0.9)
iter0 = iter0 + 1
PRINT *, iter0
CALL init_random_seed()
DO i = 2, np
CALL RANDOM_NUMBER(w1)
x(i) = 10 * w1 - 5
END DO
DO i = 3, np
CALL RANDOM_NUMBER(w2)
y(i) = 10 * w2 - 5
END DO
! rmatrix contains the distances between all particles
DO i = 1, np
DO j = 1, np
IF(j .NE. i) THEN
xij = x(i) - x(j)
yij = y(i) - y(j)
rij = SQRT(xij * xij + yij * yij)
rmatrix(i,j) = rij
END IF
END DO
END DO
minv = MINVAL(rmatrix) ! This is the minimum distance between any two
! particles ( distance cannot be smaller)
! which is the left endpoint of the range interval
DO i = 1, np ! Here is my attempt to control the righ endpoint of
DO j = 1, np ! the range interval. ( This needs to be edited)
IF(j .NE. i) THEN
maxv = MIN(maxv, rmatrix(i,j))
END IF
END DO
IF(maxv >= 1.1) THEN
GOTO 101
END IF
END DO
END DO
CONTANIS
SUBROUTINE init_random_seed()
INTEGER :: i, n, clock
INTEGER, DIMENSION(:), ALLOCATABLE :: seed
CALL RANDOM_SEED(size = n)
ALLOCATE(seed(n))
CALL SYSTEM_CLOCK(COUNT=clock)
seed = clock + 37 * (/ (i - 1, i = 1, n) /)
CALL RANDOM_SEED(PUT = seed)
END SUBROUTINE init_random_seed