各位老师同学好,
有这样一个问题想请教大家,我定义了两个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就可以运行。
感谢大家
@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