DG FEM右手边的计算(带代码)

计算科学 有限元 matlab 不连续-galerkin
2021-12-10 02:51:33

我被 Hestaven/Warburton 的 dG-FEM Matlab 代码卡住了。文件 AdvecRHS1D.m开始,我们在第 11 行看到

du(:) = (u(vmapM)-u(vmapP)).*(a*nx(:)-(1-alpha)*abs(a*nx(:)))/2;

计算跳跃[u]在相邻元素之间并将其乘以某个因子,给出

du=[u]an(1α)|an|2=[u]an(1α)2,n{1,1},a>, 1α0

这看起来与描述为的数值通量非常相似

(au)={{u}}+a1α2[u]

如果我们忽略平均值{{u}}. 然而,这些术语显然并不相同。

然后,对于 PDE 右侧的计算,会发生这种情况:

rhsu = -a*rx.*(Dr*u) + LIFT*(Fscale.*(du));

应该计算积分

[lk(x)(auhk)(au)]xlkxrk=δDkn^(auh(au))li(r)

但我不明白这行代码是如何表达这一点的。

编辑:我找到了一篇论文,见第 5 页,它对 的计算给出了一些解释rhsu但是,我仍然不清楚。

1个回答

我们可以分解代码

rhsu = -a*rx.*(Dr*u) + LIFT*(Fscale.*(du));

分为两部分

-a*rx.*(Dr*u)

LIFT*(Fscale.*(du));

第一部分是简单地通过乘以矩阵 Dr 在参考空间中求导,然后通过乘以雅可比 rx 和系数 a 转换为物理空间。接下来我们需要做面部积分,即

δDkn^(auh(au))li(r).

在这种情况下,LIFT 只返回矩阵

M1E
之前在书中定义,du之前定义为表示
(auh(au)).

简而言之,DG 半离散化是

dudt=aM1SuM1EN(auE(au))

这是 rhsu 给出的M1S=rx(Dr)LIFT=M1EN(auE(au))=du