栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将pbf改为3d时数据结构的问题,ti.root.dense和ti.field太极构建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,)))

这下就完全没问题了!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1005466.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号