将pbf改为3d时数据结构的问题,ti.root.dense和ti.field太极构建4维数组的方法,元组的连接

13 篇文章 4 订阅

原本的代码

原本的代码(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,)))

这下就完全没问题了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值