求助帖 关于初始化问题

   @ti.kernel
    def initialize(self):
        for i in range(self.n_particles):
            self.pos[i] = [ti.random(), ti.random()]
            self.vel[i] = [0, 0]
            self.acc[i] = self.gravity

显然这是一个创建粒子并初始化其位置、速度、加速度的过程
但是倘使我给予粒子半径,并且不希望创建的粒子相互之间存在接触,我创建了如下的代码

    @ti.kernel
    def initialize(self):
        i = 0
        while(i < self.n_particles):
            self.pos[i] = [ti.random(), ti.random()]
            flag = 0
            j = 0
            while(j < i):
                distance = (self.pos[i] - self.pos[j]).norm()
                if distance < 2 * self.circle_radius:
                    flag = 1
                    break
                j = j + 1
            if flag == 0:
                self.vel[i] = [0, 0]
                self.acc[i] = self.gravity
                i = i + 1

这段代码类的初始化过程中被调用,用于生成一组粒子并在二维空间中确保它们之间的距离大于给定的circle_radius。经我检查,在逻辑上并无问题,但是在具体过程中会出现错误,程序会一直卡在这一段过程中,加断点测试也找不到,麻烦请教一下是什么问题

你可以在这里加入一些print来看看运行到哪里
或者就写一个一般的python函数来做完成这个事情,不用taichi kernel函数做这个(毕竟这个算法看起来也没法并行)
还有一个需要注意的是ti.random()产生的数字是在0-1之间,会不会因为这个导致粒子之间距离一直很小而一直循环?

还没有看,但是你为什么不考虑直接使用一个位置的偏移来生成物质点,这样又好看规整又简单 :grinning:

self.pos 和self.vel 应该是vector, 你试试
self.pos = ti.math.vector([ti.random(), ti.random()]);
self.vel = ti.math.vector([0, 0])