循环内外同一field中的数据不相同

老师好,我在使用APIC的P2G函数时,发现经过少量时间步计算后,mpm.lg.v这个vector field里的数据在循环内外数据不同:
前一时间步,循环内外数据相等(temp代表循环内的数据,final代表循环外的数据):
Selection_002

后一时间步,循环内外数据不等:

请问老师这里是为什么会出现这种情况呢,谢谢老师!

这是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')

已经解决,谢谢!

hi @Otis, 能把你问题的解决方法写出来么?如果有其他人遇到也可以借鉴。

我重新安装了一次太极之后就不会有这个问题了 :joy:
可能借鉴意义不大

1 个赞