在学习有限元,想要利用taichi自动并行顶层for循环的特性并行计算单元刚度矩阵。
但是发现在顶层for循环下再对数组进行完操作,只能在顶层for循环里正确调用数组。
比如在如下代码中,在循环 for element in ti.ndrange(1):
中似乎无法正确使用数组J,这是为什么?如何解决?
import taichi as ti
@ti.kernel
def test():
for thread_i in ti.ndrange(1):
for element in ti.ndrange(1):
for i, j in ti.ndrange((0, 3), (0, 3)):
J[thread_i][i, j] *= 0.
for k in ti.ndrange(3):
J[thread_i][i, j] += 1.
print("second for:", J[thread_i]) # 数组没有更新
print("top for:", J[thread_i]) # 正确调用
J = ti.Matrix.field(3, 3, dtype=ti.f32, shape=3)
j_ = np.zeros((3, 3, 3), dtype=np.float32)
J.from_numpy(j_)
test()
输出如下:
second for: [[0.000000, 0.000000, 0.000000], [0.000000, 0.000000, 0.000000], [0.000000, 0.000000, 0.000000]]
top for: [[3.000000, 3.000000, 3.000000], [3.000000, 3.000000, 3.000000], [3.000000, 3.000000, 3.000000]]
求助,另外,一般在节省内存的情况下如何使用taichi加速有限元。