用条件进行循环 - 分段错误

时间:2015-09-10 03:42:41

标签: arrays segmentation-fault fortran

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

在do循环中(时间循环,从初始时间到某个时间步长经过一定时间),我使用Euler方法来积分位置和速度,并计算力(重力和弹性)和碰撞条件也是如此。

这个模型后来将被推广为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,但这没有意义,因为我没有&# 34;第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

1 个答案:

答案 0 :(得分:0)

  

当i = 2时,i + 1 = 2 + 1 = 3将被计算 - 但我没有第三个   粒子。以类似的方式,如果我把i-1和i改为i = 1   (循环开始的地方),i-1 = 0,但这没有意义,因为我   没有" 0th"颗粒

模?

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