带条件循环 - 分段错误

Do loop with condition - segmentation fault

我正在做一个关于粒子动力学的项目,我开始让一个粒子(一个球体)从一定高度落向地面上的一个固定粒子。

在一个do循环中(一个时间循环,从初始时间到以特定时间步长经过的特定时间),我使用欧拉方法对位置和速度进行积分,并计算力(重力和弹性)和碰撞条件。

此模型稍后将推广到 3、4、...、n 个粒子(以数十万为单位),因此我使用数组来标记随时间推移其位置和速度的粒子我正在整合。这样,我还在时间循环内放置了一个 do 循环 - 对于每个粒子 - 从 1 到 N(粒子数),并将 N 定义为 2(因为在这种情况下我只有两个粒子)。这是分段错误,因为当我只指定我有两个时,我告诉它计算 3 个东西。

在尝试修复它时,当我为 i 和 i+1 定义参数时,当 i=2 时,将计算 i+1 = 2+1 = 3 - 但我没有第三个粒子。以类似的方式,如果我用 i-1 和 i 代替,对于 i = 1(循环开始的地方),i-1 = 0,但这没有意义,因为我没有“第 0 个”粒子.在另一次尝试中,如果我将循环从 1,N 更改为 1,N-1,因为 N=1,它不会计算 N=2。此外,我考虑过将我的结果打印成两份,即对于粒子 1 和 2、粒子 2 和 3、粒子 3 和 4 等等……(同时为每个积分计算 i 和 i+1,使 运行 时间更长——这会在以后花费我很多时间,因为这些对大量粒子的模拟可能需要数周时间)。但是如果我在文件中声明,它会为所有粒子重复创建文件,除了第一个和最后一个(甚至浪费更多时间)。我如何 运行 它只考虑第一个和两个粒子,泛化我选择的任意数量的粒子?

do t = tmin, tmax, dt
    do i = 1,N
        call contact (xold(i), xold(i+1), r(i), r(i+1))
        call forces (m(i),  g, k, r(i), r(i+1), xold(i), xold(i+1))
        call euler(xold(i), xnew(i), vold(i), vnew(i), dt, F(i), m(i))
        write(i, *), "t=", t, "x=", xold(i), "v=", vold(i), "dx=", dx, "force=", F(i)
    end do
end do

when i=2, i+1 = 2+1 = 3 will be calculated - but I do not have a third particle. In a similar way, if I put i-1 and i instead, for i = 1 (where the loop starts), i-1 = 0, but that doesn't make sense, since I do not have a "0th" particle

取模?

when i = 0, i % 2 = 0, (i % 2) + 1 = 1
when i = 1, i % 2 = 1, (i % 2) + 1 = 2
when i = 2, i % 2 = 0, (i % 2) + 1 = 1
when i = 3, i % 2 = 1, (i % 2) + 1 = 2

我不太清楚,你到底想达到什么目的。对于粒子模拟,每个粒子与其他粒子相互作用,您需要有第二个循环,不是吗? 有点像这样:

do i = 1,N
   do j=i+1,N
    call contact (xold(i), xold(j), r(i), r(j))
    call forces (m(i),  g, k, r(i), r(j), xold(i), xold(j))
   end do

   call euler(xold(i), xnew(i), vold(i), vnew(i), dt, F(i), m(i))
   write(i, *), "t=", t, "x=", xold(i), "v=", vold(i), "dx=", dx, "force=", F(i)

end do

如果i+1 > N则不会执行内循环,所以应该没问题。对于 N=2,您只需使用 i=1j=2.

执行一次

编辑:

calculating i AND i+1 simultaneously for each integration, making the run time longer - which will cost me a lot of time later, since these simulations for a big number of particles can take weeks

您很可能想要对大量粒子进行全面的粒子模拟。大多数人使用一些树算法来大大加快速度。考虑为此使用现有的框架,例如 PEPC.