【发布时间】:2015-09-10 03:42:41
【问题描述】:
我正在做一个关于粒子动力学的项目,我首先让一个粒子(一个球体)从某个高度落向地面中的一个固定粒子。
在一个 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,但这没有意义,因为我没有“0th”粒子.在另一次尝试中,如果我将循环从 1,N 更改为 1,N-1,因为 N=1,它不会计算 N=2。另外,我考虑过将我的结果一并打印,即对于粒子 1 和 2、2 和 3、3 和 4,依此类推......(同时为每个积分计算 i AND 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
【问题讨论】:
标签: arrays segmentation-fault fortran