请问可以在struct中定义稀疏结构吗

各位老师好:

我看到taichi doc中关于struct的说明

我现在希望定义粒子的邻域粒子,所以我在这里增加了一个neighbor属性

particle_field = ti.Struct.field({
    "pos": ti.types.vector(3, ti.f32),
    "vel": ti.types.vector(3, ti.f32),
    "acc": ti.types.vector(3, ti.f32),
    "mass": ti.f32,
    "neighbor":ti.types.vector(10, ti.f32)
  }, shape=(n,))

但是taichi是不支持变量作为vector下标的,所以我每次使用的时候都要遍历所有的10个数字,然后看他们是不是默认值。而且用10维的vector还占用了额外的内存。所以我想,如果能够使用稀疏数据结构就好了,我希望能这样写:

particle_field = ti.Struct.field({
    "pos": ti.types.vector(3, ti.f32),
    "vel": ti.types.vector(3, ti.f32),
    "acc": ti.types.vector(3, ti.f32),
    "mass": ti.f32,
    "neighbor":ti.types.bitmasked(10, ti.f32)
  }, shape=(n,))

但是这样是不可的。
请问有什么方法可以实现相同的效果吗?

如果我理解的没错,你应该是要仿真一个带显式拓扑结构的网格对么?
目前非常遗憾,也许你只能把仿真数据和拓扑结构分开定义,来达到这个效果。其中你的拓扑结构可以用两种方法定义:
一种还是稀疏的particle-particle关系,即开一个n-by-n的scalar field,叶节点使用bitmasked来定义。
第二种是稠密的element-particle。用弹簧质点系统来举例,当你有m个弹簧时,就可以开一个m-by-2的scalar field,表示每个弹簧连接了几个节点。

1 个赞