老师好,我在使用APIC的P2G函数时,发现经过少量时间步计算后,mpm.lg.v这个vector field里的数据在循环内外数据不同:
前一时间步,循环内外数据相等(temp代表循环内的数据,final代表循环外的数据):
后一时间步,循环内外数据不等:
请问老师这里是为什么会出现这种情况呢,谢谢老师!
老师好,我在使用APIC的P2G函数时,发现经过少量时间步计算后,mpm.lg.v这个vector field里的数据在循环内外数据不同:
前一时间步,循环内外数据相等(temp代表循环内的数据,final代表循环外的数据):
后一时间步,循环内外数据不等:
请问老师这里是为什么会出现这种情况呢,谢谢老师!
这是P2G部分的代码
@ti.kernel
def ParticleToGridAPIC(mpm: ti.template()):
for ng in mpm.lg.id:
grid.GridReset(ng, mpm.lg)
for np in mpm.lp.id:
mpm.lp.posVisual[np] = mpm.lp.x[np] / mpm.Domain
baseID = (mpm.lp.x[np] * mpm.inv_dx - 0.5).cast(int)
baseNodeID = baseID[0] + baseID[1] * mpm.NodeNum[0]
n, fx = ShFunc.APIC(mpm.lp.x[np], baseID, mpm.inv_dx)
mpm.lp.td[np] = (ti.Matrix.identity(float, 2) + mpm.Dt * mpm.lp.C[np]) @ mpm.lp.td[np]
mpm.lp.stress[np] = particle.Elastic(np, mpm.Dt, mpm.inv_dx, mpm.lp)
affine = mpm.lp.stress[np] + mpm.lp.m[np] * mpm.lp.C[np]
for i, j in ti.static(ti.ndrange(3, 3)): # Loop over 3x3 grid node neighborhood
offset = ti.Vector([i, j])
dpos = (offset.cast(float) - fx) * mpm.Dx
weight = n[i][0] * n[j][1]
offsetID = offset[0] + offset[1] * mpm.NodeNum[0]
mpm.lg.active[baseNodeID + offsetID] = 1
mpm.lg.v[baseNodeID + offsetID] += weight * (mpm.lp.m[np] * mpm.lp.v[np] + affine @ dpos)
if baseNodeID + offsetID == 850:
print(mpm.lg.v[baseNodeID + offsetID], 'temp')
mpm.lg.m[baseNodeID + offsetID] += weight * mpm.lp.m[np]
print(mpm.lg.v[850], 'final')
已经解决,谢谢!
我重新安装了一次太极之后就不会有这个问题了
可能借鉴意义不大