二维反应扩散系统模拟

计算科学 有限元 数值分析 Python
2021-12-11 13:19:45

我是数值模拟的初学者,对于如何解决这个问题我很迷茫。

我已经尝试了一段时间来找到稳定状态(或模拟),以下系统

S˙=DSΔS+ρSFnFn+1δSSδCP2S

P˙=DPΔP+ρPδPP+(v2δC)P2S

F˙=Δ+ρF1(P2S)n+1δFF

在看起来像这样的网格上(没有给出边界条件):

在此处输入图像描述

我意识到这个系统包含时间导数,所以我没有明确地追求稳定状态,但是当我拿出它时,TransientTerm它抱怨它是Exactly singular.

S = CellVariable(mesh = mesh, hasOld=True)
P = CellVariable(mesh = mesh, hasOld=True)
F = CellVariable(mesh = mesh, hasOld=True)

sdot = TransientTerm(var=S) == DiffusionTerm(coeff=Ds, var=S) + \
rs * pow(F,2) / (pow(F,2) + 1) - ds * S - dc * pow(P, 2) * S

pdot = TransientTerm(var=P) == DiffusionTerm(coeff=Dp, var=P) + \
rp  - dp * P  + (v - 2. * dc) * S * pow(P, 2)

fdot = TransientTerm(var=F) == DiffusionTerm(coeff=1, var=F) + \
rf / (pow(S * pow(P, 2), 2)  + 1.0 ) - df * F

dt = 0.005
coupled.sweep(dt = dt)

for i in range(0, 100000):

    v1.plot('plots/SHH_'+str(dt * i)+'.png')
    v2.plot('plots/Ptc_' + str(dt * i)+'.png')
    v3.plot('plots/FGF_'+str(dt * i)+'.png')

    S.updateOld()
    P.updateOld()
    F.updateOld()


dt = 0.005

for i in range(0, 100000):

    v1.plot('plots/SHH_'+str(dt * i)+'.png')
    v2.plot('plots/Ptc_' + str(dt * i)+'.png')
    v3.plot('plots/FGF_'+str(dt * i)+'.png')

    S.updateOld()
    P.updateOld()
    F.updateOld()
    coupled.sweep(dt = dt)

模拟最初似乎正常进行,但最终,无论我的时间步长如何,值和值都降到零以下,随后爆炸了,因为它的高生产率导致溢出错误。SPSρs=1600

我应该提一下,当我使用 在一维中模拟这个问题时pdepe,发现模拟并收敛到一个稳定状态。

我该如何调试,我的模拟还有其他问题吗?我应该尝试不同的软件包,例如 Firedrake 吗?如果是这样,我该如何解决那里的收敛问题?

首先十分感谢。

0个回答
没有发现任何回复~