在非均匀网格(仅限一维)有限体积法上求解泊松方程时出现特殊错误

计算科学 离散化 有限体积 泊松
2021-11-25 08:00:33

过去几天我一直在尝试调试此错误,我想知道是否有人对如何继续提出建议。

我正在求解非均匀有限体积网格上的阶跃电荷分布(静电/半导体物理学中的常见问题)的泊松方程,其中未知数定义在单元中心和单元面上的通量。

0=(ϕx)x+ρ(x)

电荷曲线(源项)由下式给出,

ρ(x)={1,if 1x01,if 0x10,otherwise

边界条件是,

ϕ(xL)=0ϕx|xR=0

域是[10,10].

我正在使用开发的代码来求解平流-扩散-反应方程(我已经写了自己,请参阅我的笔记,http://danieljfarrell.github.io/FVM)。对流-扩散-反应方程是泊松方程的更一般情况。事实上,泊松方程可以通过将平流速度设置为零并去除瞬态项来恢复。

该代码已经针对均匀、非均匀和随机网格的多种情况进行了测试,并且始终为平流-扩散-反应方程生成合理的解决方案 ( http://danieljfarrell.github.io/FVM/examples.html )。

为了显示代码在哪里发生故障,我制作了以下示例。我设置了一个由 20 个单元组成的均匀网格,然后通过移除一个单元使其不均匀。在左图中,我删除了单元格Ω8在右边Ω9已被删除。第 9 个单元格覆盖了源项(即电荷)改变符号的区域。当反应项改变符号的区域中的网格不均匀时,就会出现该错误正如你在下面看到的。

有什么想法可能导致这个问题吗?让我知道有关离散化的更多信息是否会有所帮助(我不想在这个问题中包含太多细节)。

求解泊松方程时的特殊错误

2个回答

顺便说一句,您的 github 文档非常棒。

这只是 DG 方法的一个猜测,如果没有仔细选择数值通量,它可能会出现类似的问题(我认为 FV 方法是 DG 方法的一个子集)。如果您使用单元中心的插值来定义通量,那么这应该等同于使用平均值作为 DG 中的数值通量并使用分段常数基础。对于泊松的标准 DG 方法,这会导致数值上非唯一的解决方案 - 您可以获得离散运算符的非平凡零空间,我认为这是导致您在第二个示例中出现问题的原因。有关他们从 DG 方面的理论,请参阅此 DG 论文。

我将尝试为 FV 模拟一个示例,以展示它是如何发挥作用的。

编辑:所以这是发生了什么的一个小例子。考虑单元格 1-9 和 11-20,其中ρ(x)=0. 从右侧(11-20),我们有f(x20)=0由于 Neumann 条件,它告诉我们从该细胞的守恒f(x19)==f(x11)=0. 由于通量是细胞值的平均值,这告诉我们ϕ(x)在所有这些细胞中是恒定的。

从左侧(1-9),我们有f(xi+1)f(xi)=0. 如果f(10)=0我们使用幽灵细胞,然后f(10)=ϕ9.5ϕghost=ϕ9.5. 接下来的几个单元格的守恒给出了f(xi)=f(10)=ϕ9.5(即恒定斜率)。但是,请注意,这可以是任何斜率,只要是常数即可。

问题出现在中间单元格中。就像 Jan 提到的那样,您对第二个网格中的强制进行了欠采样。这会在这一点上抛出平衡方程,给你一个错误f(10),然后向后传播并弄乱域左半部分的斜率以及ϕ(9.5).

这种对强制错误的敏感性是有问题的 - 与 FEM 或 FD 方法不同,它们在x=10, FV 使用幽灵节点弱执行它。直观地说,虚节点弱拼版就像在你的左边界设置一个 Neumann 条件。如果您有两个用于扩散问题的 Neumann 条件,那么您的问题是病态的并且有一个非唯一的解决方案(您可以向该问题添加任何常数并且仍然有一个解决方案)。在这里,您在离散级别上并没有完全理解这一点,但是正如您在实验中看到的那样,您确实得到了非常敏感和依赖于网格的行为。

首先要注意的是您的边界条件。由于您可以更改斜率和值,因此您既没有 Dirichlet 条件,也没有 Neumann 条件。

那么,每条直线都是右手边为零的解。你得到了那部分。

您的通量可能取决于h. 你用对了吗h你在哪里消除一个细胞?