在 FiPy 中使用 ConvectionTerm() 或 DiffusionTerm()

我目前正在学习如何使用 FiPy,并最终想用它来解决一些生物学问题。我一直在尝试实施以下描述真菌菌丝生长的 PDE 系统:

PDE系统

我可以毫无问题地实现这个系统,只要我忽略了第四个方程 dsi/dt 中si 随时间的变化取决于p 在空间 abs(dp/dx) 上的绝对变化。这是我没有 abs() 的代码:

现在,我试着简单地写


eqsi = (TransientTerm(var=si)== DiffusionTerm(var=si,coeff=Di*m)- DiffusionTerm(var=p,coeff=Da*m*si) + ImplicitSourceTerm(var=si,coeff=c1*m*se) - ImplicitSourceTerm(var=si,coeff=c2*v*p) - abs(ConvectionTerm(var=p,coeff=[[c4*Da]]*(m*si))))

这(预期)给出了一个错误:“abs()的错误操作数类型:'PowerLawConvectionTerm'”


我试图通过添加另一个 CellVariable dpdx 来解决这个问题:


dpdx= CellVariable(name="dpdx",mesh=mesh,hasOld=True,value=0.)

eqdpdx= (dpdx == ConvectionTerm(var=p,coeff=[[1]]))

eqsi = (TransientTerm(var=si)== DiffusionTerm(var=si,coeff=Di*m)- DiffusionTerm(var=p,coeff=Da*m*si) + ImplicitSourceTerm(var=si,coeff=c1*m*se) - ImplicitSourceTerm(var=si,coeff=c2*v*p) - abs(dpdx)*c4*Da*m*si)

然后给出错误“ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()”,这可能是由于 eqdpdx 不是导函数这一事实造成的?


我的问题是:是否可以使用 ConvectionTerm 执行数学运算?我能以某种方式表达 p 的绝对变化吗?而且,我如何表达像 eqdpdx (或任何动态参数)这样随空间变化的非导数函数?我查看了 FiPy 手册但找不到解决方案 - 如果我的问题微不足道或已在其他地方得到解答,我深表歉意。


慕森王
浏览 105回答 1
1回答

回首忆惘然

了解 FiPyTerms是什么很重要。它们是可离散化为线性代数的 PDE 部分的人类可读表达式。如果您将一些潜在的非线性函数应用于该线性代数,那么它就不再是线性代数了。不支持这种用途,我不确定它是怎么回事。幸运的是,您不需要它。dp/dx 不是ConvectionTerm,它是渐变。我会把这个词写成- ImplicitSourceTerm(coeff=c4*Da*m*p.grad.mag, var=si)作为旁注,一维方程是魔鬼的工作。他们每次都会让你误入歧途。您可以像我们在手册中那样使用 nabla 表示法,也可以使用 Einstein 表示法,但请始终牢记您的表达式是标量还是矢量(或张量或...)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python