原本的代码
原本的代码(pbf2d.py)
grid_num_particles = ti.field(int)
grid2particles = ti.field(int)
grid_snode = ti.root.dense(ti.ij, grid_size)
grid_snode.place(grid_num_particles)
grid_snode.dense(ti.k, max_num_particles_per_cell).place(grid2particles)
这里grid_size是个元组,可以认为是(32,32)
max_num_particles_per_cell是个常数,认为是100
这里面其实就是声明了两个数组grid_num_particles和grid2particles
假如我们想把它改为3维的。这时候grid_size=(32,32,32)
grid_num_particles的更改
这时候grid_num_particles这个变量只需要一点点变化
grid_snode = ti.root.dense(ti.ijk, grid_size)
也就是把ti.ij改为ti.ijk
grid2particles的更改
grid2particles改造的时候则不好弄。原因是ti.root.dense这种排列内存块的方式,最多也就到ijk为止。我们没法再找出个lmn来。
假如我们就仍然用ti.k呢?
print(grid2particles.shape)
结果
(32, 32, 3200)
显然只是在k方向上倍增了长度而已。本质仍然是3维数组。
所以这样的方式没法用作4维数组。
退回到
grid2particles= ti.field(int, shape=(32,32,32,100))
结果
(32, 32, 32, 100)
也就是
这时是可以使用四维数组的
但是我们要让grid_size塞进去。而不是hard code一个数字
这时候我们就期望
grid2particles= ti.field(int, shape=(grid_size,max_num_particles_per_cell))
结果不通过,会报错。
这是为什么呢?
我们打印出来就知道了
print((grid_size,max_num_particles_per_cell))
结果
((32, 32, 32), 100)
天,怎么会这样嵌套组合呢?!
原来,python中的元组是不允许重新赋值,只能初始化。
但是,元组是可以连接的!
怎么连接呢?
把代码改成
print(grid_size + (max_num_particles_per_cell,))
结果
(32, 32, 32, 100)
就可以啦!
所以我们把原来的代码改为
grid_size = (32,32,32)
max_num_particles_per_cell = 100
grid2particles = ti.field(int, (grid_size + (max_num_particles_per_cell,)))
这下就完全没问题了!