Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何将$n$粒子之间的距离保持在一定范围内?_Algorithm_Fortran_Graph Algorithm_Fortran90_Fortran77 - Fatal编程技术网

Algorithm 如何将$n$粒子之间的距离保持在一定范围内?

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就在其中一些粒子之间?想要的图像表明后面的情况在这种情况下规则是什么?不确定我是否得到了你想要的,例如,你能定义“相邻”吗请?以上不是您的代码,请显示变量声明,它们很重要!如果您真的需要帮助,最好显示您实际编译和运行的内

我正在研究分子动力学中的一个问题,需要在一个大小为[-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个粒子,中间有一个粒子(很难在评论中画出来)。
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