gpt4 book ai didi

python - 如何将平流扩散 react 偏微分方程与 FiPy 耦合

转载 作者:行者123 更新时间:2023-12-01 08:29:34 31 4
gpt4 key购买 nike

我尝试使用 Matlab 函数 Pdepe ( https://www.mathworks.com/help/matlab/ref/pdepe.html ) 求解平流扩散 react 问题的一维耦合偏微分方程。与扩散项相比,在平流项较高的情况下,此函数无法正常工作。因此,我搜索并找到了使用Python库FiPy来解决我的偏微分方程系统的选项。我的初始条件是 u1=1 for 4*L/10

我的耦合方程具有以下形式:

du1/dt = d/dx(D1 * du1/dx) + g * x * du1/dx - mu1 * u1/(K + u1) * u2

du2/dt = d/dx(D2 * du2/dx) + g * x * du2/dx + mu2 * u1/(K + u1) * u2

我尝试通过结合 FiPy 示例(examples.convection.exponential1DSource.mesh1D、examples.levelSet.advection.mesh1D、examples.cahnHilliard.mesh2DCoupled)来编写它。

以下几行不是一个有效的示例,而是我第一次尝试编写代码。这是我第一次使用 FiPy(在文档的测试和示例之外),因此对于普通用户来说,这似乎完全没有捕获要点。

from fipy import *

g = 0.66
L = 10.
nx = 1000
mu1 = 1.
mu2 = 1.
K = 1.
D1 = 1.
D2 = 1.

mesh = Grid1D(dx=L / 1000, nx=nx)

x = mesh.cellCenters[0]
convCoeff = g*(x-L/2)

u10 = 4*L/10 < x < 6*L/10
u20 = 1.

u1 = CellVariable(name="u1", mesh=mesh, value=u10)
u2 = CellVariable(name="u2", mesh=mesh, value=u20)

## Neumann boundary conditions
u1.faceGrad.constrain(0., where=mesh.facesLeft)
u1.faceGrad.constrain(0., where=mesh.facesRight)
u2.faceGrad.constrain(0., where=mesh.facesLeft)
u2.faceGrad.constrain(0., where=mesh.facesRight)

sourceCoeff1 = -1*mu1*u1/(K+u1)*u2
sourceCoeff2 = 1*mu2*u1/(K+u1)*u2

eq11 = (TransientTerm(var=u1) == DiffusionTerm(coeff=D1, var=u1) + ConvectionTerm(coeff=convCoeff))
eq21 = (TransientTerm(var=u2) == DiffusionTerm(coeff=D2, var=u2) + ConvectionTerm(coeff=convCoeff))

eq12 = ImplicitSourceTerm(coeff=sourceCoeff1, var=u1)
eq22 = ImplicitSourceTerm(coeff=sourceCoeff2, var=u2)

eq1 = eq11 & eq12
eq2 = eq21 & eq22

eqn = eq1 & eq2
vi = Viewer((u1, u2))

for t in range(100):
u1.updateOld()
u2.updateOld()
eqn.solve(dt=1.e-3)
vi.plot()

感谢您的任何建议或指正。如果您碰巧知道针对此类特定问题的好教程,我会很乐意阅读它,因为我没有找到比 FiPy 文档中的示例更好的内容。

最佳答案

几个问题:

  • python chained comparisons不适用于 numpy,因此不适用于 FiPy。所以,写
    u10 = (4*L/10 < x) & (x < 6*L/10)
    此外,这使得 u10 成为 bool 值字段,这使 FiPy 感到困惑,因此写
    u10 = ((4*L/10 < x) & (x < 6*L/10)) * 1.
    或者,更好的是,写
    u1 = CellVariable(name="u1", mesh=mesh, value=0., hasOld=True)
    u2 = CellVariable(name="u2", mesh=mesh, value=1., hasOld=True)
    u1.setValue(1., where=(4*L/10 < x) & (x < 6*L/10))
  • ConvectionTerm 采用矢量系数。获得这个的一种方法是
    convCoeff = g*(x-L/2) * [[1.]]
    代表一维 1 级变量
  • 如果您声明 Term 适用于哪个 Variable,则必须对所有 Term 执行此操作,因此请编写,例如:
    ConvectionTerm(coeff=convCoeff, var=u1)
  • ConvectionTerm(coeff=g*x, var=u1)不代表 g * x * du1/dx。它表示 d(g * x * u1)/dx。所以,我相信你会想要
    ConvectionTerm(coeff=convCoeff, var=u1) - ImplicitSourceTerm(coeff=g, var=u1)
  • ImplicitSourceTerm(coeff=sourceCoeff1, var=u1 不代表-1*mu1*u1/(K+u1)*u2,而是代表-1*mu1*u1/(K+u1)*u2*u1。因此,为了获得方程之间的最佳耦合,请编写

    sourceCoeff1 = -mu1*u1/(K+u1)
    sourceCoeff2 = mu2*u2/(K+u1)

    ... ImplicitSourceTerm(coeff=sourceCoeff1, var=u2) ...
    ... ImplicitSourceTerm(coeff=sourceCoeff2, var=u1) ...
  • 正如 @wd15 在评论中所指出的,您正在为两个未知数声明四个方程。 & 并不表示“将两个方程相加”(可以使用 + 完成),而是表示“同时求解这两个方程”。所以,写一下

    sourceCoeff1 = mu1*u1/(K+u1)
    sourceCoeff2 = mu2*u2/(K+u1)

    eq1 = (TransientTerm(var=u1)
    == DiffusionTerm(coeff=D1, var=u1)
    + ConvectionTerm(coeff=convCoeff, var=u1)
    - ImplicitSourceTerm(coeff=g, var=u1)
    - ImplicitSourceTerm(coeff=sourceCoeff1, var=u2))
    eq2 = (TransientTerm(var=u2)
    == DiffusionTerm(coeff=D2, var=u2)
    + ConvectionTerm(coeff=convCoeff, var=u2)
    - ImplicitSourceTerm(coeff=g, var=u2)
    + ImplicitSourceTerm(coeff=sourceCoeff2, var=u1))

    eqn = eq1 & eq2
  • 必须使用 hasOld=True 声明 CellVariable 才能调用 updateOld(),因此
    u1 = CellVariable(name="u1", mesh=mesh, value=u10, hasOld=True)
    u2 = CellVariable(name="u2", mesh=mesh, value=u20, hasOld=True)

似乎有效的完整代码是 here

关于python - 如何将平流扩散 react 偏微分方程与 FiPy 耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53977269/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com