菜鸟求助autodiff在LBM的应用, 问题是这样的:
求解水流过一个隧道, 即Poiseuille’s flow. 左右边界各自施加一个固定pressure, 左边界pressure已知, 右边界未知, 设右边pressure为需要求导的变量p. 左右两边的pressure是固定的, 不会随着step变化.
目标是在3000个step后使得流体速度场的大小达到目标值, 故
@ti.kernel
def compute_loss():
for i,j in ti.ndrange(lx,ly):
loss += (v[i,j].norm()-target_v[i,j].norm())**2
到这里都能converge, 能返回正确的求导结果.
但是我发现,当求解速度场并不包括右边界时, 得到的p.grad[None]恒为0,
@ti.kernel
def compute_loss():
for i,j in ti.ndrange(lx-1,ly):
loss += (v[i,j].norm()-target_v[i,j].norm())**2
这是为什么呢?
相关代码如下:
learning_rate = 0.1
for iteration in range(100):
initialization()
for step in range(3000):
with ti.ad.Tape(loss):
collision()
streaming()
boundary_condition()
compute_loss()
p[None] -= p.grad[None] * learning_rate