dataclass在多层for loop中的问题

各位老师同学好,

有这样一个问题想请教大家,我定义了两个data class:particles 和 waves.
在如下的计算中,如果在最后一层loop外把particles[n].r 和 t 赋值给rrr 和 ttt, 程序能够得到正确的值,但如果不赋值,直接在最内层的loop中使用particles[n].r 和 particles[n].t, 程序并不能得到正确的值, 在最内层循环中,particles[n].t和 particles[n].r 一直都是设定的初始值,并没有被更新。请问问题出在什么地方呢? 按照我的理解,并行化是并行化了n,但是里面的两个for loop都是正常的。
代码如下,
完整代码在GitHub - donglai96/taiparticle-uniform: taichi test particle code for uniform background magnetic field
python main_timesim.py就可以运行。
感谢大家:pray:

@ti.kernel
def simulate_t():
    for n in range(Np): # This will be Parallelized
        #particles
        for tt in range(Nt): # This will be Serialized
            #time
            B =ti.Vector([0.0,0.0,B0])
            E = ti.Vector([0.0,0.0,0.0])
            rrr = particles[n].r #?
            ttt = particles[n].t #?
            
            for m in range(nw):
                #print('ttt',ttt,nn,n, particles[n].t)
                waves[m].get_wavefield(rrr, ttt) # get Bw and Ew
                # if use particles[n].r and t would be wrong
                
                B += waves[m].Bw
                E += waves[m].Ew
            
            particles[n].t += dt_taichi[None] 
            particles[n].leap_frog(dt_taichi[None],E,B) # change nth particle's p and r

            # save particle info
            if tt%record_num ==0:
                #print('tt',tt)
                p_record_taichi[tt//record_num, n] = particles[n].p
                r_record_taichi[tt//record_num, n] = particles[n].r

这应该是个 bug。一个更小的复现例子:

import taichi as ti
ti.init()
vec3 = ti.math.vec3

@ti.dataclass
class Particle:
    r: vec3

particle = Particle.field(shape=1)

@ti.kernel
def simulate():
    for i in range(1):
        for _ in range(5):
            for __ in range(1):
                print('inside', particle[i].r)
            particle[i].r += vec3(1)
            print('outside', particle[i].r)

simulate()

可以看到 inside 部分打印的都是错误的值,但是 outside 打印的值又是对的。

2 个赞

请问这个bug修复好了吗

修好了,但是要用nightly 版本
pip install -i Simple Index taichi-nightly

谢谢