使用粗粒度计算的项在 Python 中数值求解 PDE

计算科学 pde 有限差分 Python 模拟 有限体积
2021-12-06 18:59:01

我正在尝试以 Python 形式解决 PDE,

c(x,t)t=D2c(x,t)γρ(x,t)c(x,t)

在哪里c表示化学物质的浓度,Dγ是常数,并且ρ表示一些大点粒子(实际上是细菌模型)的密度场。这一切都是在 2D 中完成的。

问题是我正在模拟由ρ作为在连续空间中移动的个体代理,而不是作为服从 PDE 的密度场。

我如何解决这个问题是获取所有粒子的位置并将其变成粗密度场ρ,然后用它来求解 PDE。

到目前为止,我一直在手动执行此操作,将粒子位置分箱到笛卡尔网格上,然后使用有限差分迭代 PDE。到目前为止,这工作得很好。

但是现在我想在具有弯曲边界的更复杂的 2D 几何中求解 PDE,所以我认为我需要使用有限体积法而不是有限差分法。这超出了我的手工能力范围,所以我一直在研究像 FiPy 和 FEniCS 这样的包。

对我来说,似乎有两个问题我不知道他们是否可以处理:

  1. 有没有一种简单的方法可以确定特定点位于哪个体积元素中?如果是这样我可以计算ρ在每个时间步手动,这样很好。
  2. 假设我可以计算ρ,我可以将这样的变量字段提供给 PDE 求解器,然后它将用于迭代方程吗?
1个回答

在我看来,关键步骤是真正确定领域ρ通过评估每个单元格中有多少粒子。剩下的只是一个带有特定源项的标准热方程,并不太复杂。例如,您可以从 deal.II 教程的第 26 步开始:http ://www.dealii.org/developer/doxygen/deal.II/step_26.html它背后的图书馆)。

一般来说,如果你有一个非结构化网格,找出一个特定点位于哪个单元格并不是一件容易的事。但是,还有一些更简单的情况:

  • 如果您有一个由三角形(2d 中)或四面体(3d)组成的网格,那么每个单元格都受线性约束,并且查找一个点是否在单元格内只需要检查 3(在 2d 中)或 4(在 3d 中) 线性不等式。

  • 如果您在 2d 中有四边形网格,则每个单元格都由 4 个线性不等式限定,只要每个单元格都是凸的(出于其他原因您也需要这样做)。

  • 在具有六面体的 3d 中,单元受到非线性约束,事情变得更加复杂。

但即使在线性约束的情况下,令人惊讶的是,经常会遇到点在边界线/平面的舍入距离内的情况,并且确定该点是否位于单元格中的函数可能会说“是”两个或没有细胞。你必须弄清楚如何处理这个问题。