我已经成功地实现了一个具有非归一化勒让德基础的一维 DG 代码,现在我开始使用张量积开发一个二维代码。对于我的二维码,我选择了归一化勒让德多项式,即
我的问题是:如果我们规范化勒让德多项式,我是否也必须规范化我的高斯-勒让德权重?还是我们只根据基对多项式进行归一化?
subroutine GaussQuad (xq,wq,n)
use parameters
implicit none
integer :: n
real(kind=8),dimension(n) :: xq,wq
integer :: i,iter
real(kind=8) :: xx
real(kind=8) :: legendre,dlegendre
do i=1,n
xx = cos(dpi*(i - 0.25d0)/(n + 0.5d0))
do iter=1,500
xx = xx - legendre(xx,n)/dlegendre(xx,n)
end do
xq(i) = xx
wq(i) = (2.0*dble(n) + 1.0)*2.0d0/((1.0d0-xx**2.0)*dlegendre(xx,n)**2.0)
end do
end subroutine GaussQuad
为了使我的 2D 代码工作,我需要在高斯正交例程中使用归一化的勒让德多项式以及权重的归一化(请参阅如何将其添加到 wq(i))。但是,由于临时猜测,我才让它工作。我想避免这种情况,因为我个人不明白为什么我的求解器需要这样做。
编辑 2020 年 4 月 1 日:
- 在我的代码中,我在引用元素中执行所有操作。事实上,仔细检查,我的 Gauss-Legendre 点值在范围内,我的权重总和为 2。
- 为了从物理空间映射到参考空间,我使用以下
为了整合体积通量,我使用了带有点的张量积 Gauss-Legendre 方案
do ix=1,nx do iy=1,ny do i=1,mx do j=1,my do inode=1,mx do jnode=1,my call Flux(un(:,ix,iy,inode,jnode),FFlux,GFlux) flux_vol1(:,ix,iy,i,j) = flux_vol1(:,ix,iy,i,j) + & & 0.5*FFlux(:)* & & dlegendre(xg(inode),i-1)*& & legendre(xg(jnode),j-1)*& & wg(inode)*& & wg(jnode) flux_vol2(:,ix,iy,i,j) = flux_vol2(:,ix,iy,i,j) + & & 0.5*GFlux(:)* & & dlegendre(xg(jnode),j-1)*& & legendre(xg(inode),i-1)*& & wg(inode)* & & wg(jnode) end do end do end do end do end do end do
以上是我如何执行张量积求积的片段。我对为什么去除高斯正交的归一化会导致如此严重的结果有点困惑。
解决方案:
计算张量积的标准方法是
前两篇论文改编的张量积公式为
有没有理由使用公式(1)超过公式(2)?从数学上讲,它们似乎都是正确的。