FESTUNG - 3. 采用 HDG 方法求解对流问题[1]

1. 控制方程

线性对流问题控制方程为

\[\begin{array}{ll}
\partial_t c + \nabla \cdot f = h, & \mathrm{in} \; J \times \Omega \\
c(x, 0) = c_0(x), & \mathrm{on} \; {0} \times \Omega \\
c(x, t) = c_D, & \mathrm{on} \; J \times \partial \Omega_{in}
\end{array}
\]

其中 \(f = [u^1, u^2]^\top c\) 为通量项。

2. 数值离散

2.1. 空间离散

采用间断有限元方法对控制方程进行离散,包括进行一次分部积分并采用 Green-Gauss 公式导出面积分项,可得

\[\int_{T_{k}} \partial_{t} c_{h} \varphi_{h} \mathrm{d} \mathbf{x}-\int_{T_{k}} \mathbf{f}\left(c_{h}\right) \cdot \nabla \varphi_{h} \mathrm{d} \mathbf{x}+\int_{\partial T_{k}} \hat{\mathbf{f}}\left(\lambda_{h}, c_{h}^{-}\right) \cdot \boldsymbol{v} \varphi_{h}^{-} \mathrm{d} s=\int_{T_{k}} h \varphi_{h} \mathrm{d} \mathbf{x},
\quad \forall \varphi_{h} \in V_{h}
\]

其中面积分中引入近似通量项 \(\hat{\mathbf{f}}\left(\lambda_{h}, c_{h}^{-}\right)\) 表达式为

\[\hat{\mathbf{f}}\left(\lambda_{h}, c_{h}^{-}\right) :=\mathbf{f}\left(\lambda_{h}\right)-\alpha\left(\lambda_{h}-c_{h}^{-}\right) \boldsymbol{v},
\]

\(\lambda_h\) 为计算边界上引入对应的未知解。为了对 \(\lambda_h\) 进行求解,需要引入附加的边界积分方程

\[\int_{E_{\overline{k}} \in \mathcal{E}_{\text { int }}} \alpha \mu_{h}\left(2 \lambda_{h}-c_{h}^{-}-c_{h}^{+}\right) \mathrm{d} s+\int_{E_{\overline{k}} \in \mathcal{E}_{\mathrm{bc}}} \mu_{h}\left(\lambda_{h}-c_{\partial \Omega}\left(c_{h}^{-}\right)\right) \mathrm{d} s=0,
\quad
\forall \mu_{h} \in M_{h}.
\]

将计算域划分为 \(K\) 个互不重叠的三角形单元,在单元和边界上分别定义多项式空间

\[V_{h} :=\left\{\varphi_{h} : \overline{\Omega} \rightarrow \mathbb{R} : \forall T \in \mathcal{T}_{h},\left.\varphi_{h}\right|_{T} \in \mathbb{P}_{p}(T)\right\}, \\
M_{h} :=\left\{\mu_{h} : \Gamma \rightarrow \mathbb{R} : \forall E \in \mathcal{E}_{h},\left.\mu_{h}\right|_{E} \in \mathbb{P}_{p}(E)\right\}.
\]

将 \(c_h\) 和 \(\lambda_h\) 分别用单元和边界上多项式进行近似

\[c_h = \sum_{j=1}^N c_{kj} \varphi_{kj}, \quad \lambda_h = \sum_{j=1}^{\hat{N}} \Lambda_{\hat{k} j} \mu_{\hat{k} j}.
\]

将上述近似公式代入积分方程中,可得

\[\begin{array}{r}
\underbrace{ \sum_{j=1}^{N} \int_{T_{k}} \varphi_{k i} \varphi_{k j} }_{\mathcal{M}_{\varphi}} \partial_{t} C_{k j} -
\underbrace{ \sum_{j=1}^{N} \sum_{m=1}^{2} \int_{T_{k}} u^{m}(t, \mathbf{x}) \partial_{x^{m}} \varphi_{k i} \varphi_{k j} }_{- \mathcal{G}^2 - \mathcal{G}^2} C_{k j} \\
+ \underbrace{ \sum_{j=1}^{\overline{N}} \int_{\partial T_{k} \backslash \partial \Omega} \varphi_{k i} (\mathbf{u}(t, \mathbf{x}) \cdot v) \mu_{\overline{k} j} }_{\mathcal{S}} \Lambda_{k j}
- \underbrace{ \alpha \sum_{j=1}^{\overline{N}} \int_{\partial T_{k} \backslash \partial \Omega} \varphi_{k i} \mu_{\overline{k} j} }_{\alpha \mathcal{R}_{\mu}} \Lambda_{k j} \\
+ \alpha \underbrace{ \sum_{j=1}^{N} \int_{\partial T_{k} \backslash \partial \Omega} \varphi_{k i} \varphi_{k j} }_{\alpha \mathcal{R}_{\varphi}} C_{k j} \\
+ \underbrace{ \int_{\partial T_{k} \wedge \partial \Omega} \varphi_{k i}(\mathbf{u}(t, \mathbf{x}) \cdot v)\left\{\begin{array}{cc}{\sum_{j=1}^{\overline{N}} \Lambda_{k j} \mu_{\overline{k} j}} & {\text { on } \partial \Omega_{\text { out }}} \\ {c_{\mathrm{D}}(t, \mathbf{x})} & {\text { on } \partial \Omega_{\text { in }}}\end{array}\right\} }_{\mathcal{S}_{out}, \mathcal{F}_{\varphi, in}}
= \underbrace{ \int_{T_{k}} h \varphi_{k i} \mathrm{dx} }_{\mathcal{H}}
\end{array}
\]

关于 \(\lambda_h\) 的控制方程为

\[\underbrace{ \alpha \sum_{j=1}^{\overline{N}} \int_{\partial T_{k} \backslash \partial \Omega} \mu_{\overline{k} j} \mu_{\overline{k} i} }_{\alpha \bar{ \mathcal{M} }_{\mu} } \Lambda_{k j}
- \underbrace{ \alpha \sum_{j=1}^{N} \int_{\partial T_{k} \backslash \partial \Omega} \mu_{\overline{k} i} \varphi_{k j} C_{k j} }_{- \alpha \mathcal{T} } \\
+ \underbrace{ \sum_{j=1}^{\overline{N}} \int_{\partial T_{k} \cap \partial \Omega} \mu_{\overline{k} j} \mu_{k i} }_{\tilde{\mathcal{M}}_{\mu}} \Lambda_{k j}
- \underbrace{ \int_{\partial T_{k} \cap \partial \Omega} \mu_{\overline{k} i}\left\{\begin{array}{cc}{\sum_{j=1}^{N} C_{k j} \varphi_{k j}} & {\text { on } \partial \Omega_{\text { out }}} \\ {c_{D}(t, \mathbf{x})} & {\text { on } \partial \Omega_{\text { in }}}\end{array}\right\} }_{- \mathcal{K}_{\mu, out}, \mathcal{K}_{\mu, in}} =0
\]

将离散方程简写为矩阵形式

\[\mathcal{M}_{\varphi} \partial_{t} \mathbf{C}+
\underbrace{ \left(-\mathcal{G}^{1}-\mathcal{G}^{2}+\alpha \mathcal{R}_{\varphi}\right) }_{\bar{\mathcal{L}}} \mathbf{C}+
\underbrace{ \left(\mathcal{S}+\mathcal{S}_{\mathrm{out}}-\alpha \mathcal{R}_{\mu}\right) }_{\bar{\mathcal{M}}} \mathbf{\Lambda}=
\underbrace{ \mathcal{H}-\mathcal{F}_{\varphi, \text { in }} }_{\mathcal{B}_{\varphi}} \\
\underbrace{ \left(-\alpha \mathcal{T}-\mathcal{K}_{\mu, \text { out }}\right) }_{\mathcal{N}} \mathbf{C} +
\underbrace{ \left(\alpha \bar{\mathcal{M}}_{\mu}+ \tilde{\mathcal{M}}_{\mu}\right) }_{\mathcal{P}} \mathbf{\Lambda}=
\underbrace{ -\mathcal{K}_{\mu, \text { in }} }_{\mathcal{B}_{\mu}}
\]

2.2. 时间离散

在获得关于时间的常微分方程,表达式为

\[\mathcal{M}_{\varphi} \partial_t \mathbf{C} =
\mathcal{B}_{\varphi} - \bar{\mathcal{L}} \mathbf{C} - \bar{\mathcal{M}} \mathbf{\Lambda} =
\mathcal{R}_{RK}(t, \mathbf{C}, \mathbf{\Lambda}) \\
0 = \mathcal{B}_{\mu} - \mathcal{N} \mathbf{C} - \mathcal{P} \mathbf{\Lambda}
\]

采用 DIRK 格式对其进行求解,其每分部表达式为

\[\mathcal{M}_{\varphi} \mathbf{C}^{(i)} = \mathcal{M}_{\varphi} \mathbf{C}^n
+ \Delta t \sum_{j=1}^i \alpha_{ij} \mathcal{R}_{RK} (t^{(j)}, \mathbf{C}^{(j)}, \mathbf{\Lambda}^{(j)}) \\
0 = \mathcal{B}_{\mu}^{(i)} - \mathcal{N} \mathbf{C}^{(i)} - \mathcal{P} \mathbf{\Lambda}^{(i)}
\]

将 \(\mathcal{R}_{RK}\) 表达式代入,并将包含 \(\mathbf{C}^{(i)}\) 和 \(\mathbf{\Lambda}^{(i)}\) 的项移到等号左侧,可得

\[\underbrace{ \left( \mathcal{M}_{\varphi} + \alpha_{ii} \Delta t \bar{\mathcal{L}} \right) }_{\mathcal{L}} \mathbf{C}^{(i)}
+ \underbrace{ \alpha_{ii} \Delta t \bar{\mathcal{M}}^{(i)} }_{\mathcal{M}} \mathbf{\Lambda}^{(i)}
= \underbrace{ \mathcal{M}_{\varphi} \mathbf{C}^n
+ \alpha_{ii} \Delta t \mathcal{B}_{\varphi}^{(i)} +
\Delta t \sum_{j=1}^{i-1} \alpha_{ij} \mathcal{R}_{RK} (t^{(j)}, \mathbf{C}^{(j)}, \mathbf{\Lambda}^{(j)}) }_{\mathcal{Q}} \\
\mathcal{N} \mathbf{C}^{(i)} + \mathcal{P} \mathbf{\Lambda}^{(i)} = \mathcal{B}_{\mu}^{(i)}
\]

\[\mathcal{L} \mathbf{C}^{(i)} + \mathcal{M} \mathbf{\Lambda}^{(i)} = \mathcal{Q} \\
\mathcal{N} \mathbf{C}^{(i)} + \mathcal{P} \mathbf{\Lambda}^{(i)} = \mathcal{B}_{\mu}^{(i)}
\]

为了求解此方程组,将第一个方程中 \(\mathbf{C}^{(i)} = \mathcal{L}^{-1} \left( \mathcal{Q} - \mathcal{M} \mathbf{\Lambda}^{(i)} \right)\) 代入,可得 \(\mathbf{\Lambda}^{(i)}\) 表达式为

\[\left( -\mathcal{N} \mathcal{L}^{-1} \mathcal{M} + \mathcal{P} \right) \mathbf{\Lambda}^{(i)} = \mathcal{B}_{\mu}^{(i)} - \mathcal{N} \mathcal{L}^{-1} \mathcal{Q}
\]

此时,即可获得每步的 \(\mathbf{\Lambda}^{(i)}\) 与 \(\mathbf{C}^{(i)}\) 数值解。


  1. Jaust A, Reuter B, Aizinger V, Schütz J, Knabner P. FESTUNG: A MATLAB / GNU Octave toolbox for the discontinuous Galerkin method. Part III: Hybridized discontinuous Galerkin (HDG) formulation. ArXiv:170904390 [Math] 2017.

FESTUNG — 3. 采用 HDG 方法求解对流问题的更多相关文章

  1. hql语句查询实体类采用list方法的返回结果集

    在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:1.查询全部字段的情况下,如"from 实体类", ...

  2. C#实现字符串按多个字符采用Split方法分割

    原文:C#实现字符串按多个字符采用Split方法分割 String字符串如何按多个字符采用Split方法进行分割呢?本文提供VS2005和VS2003的实现方法,VS2005可以用下面的方法: str ...

  3. C语言多种方法求解字符串编辑距离问题的代码

    把做工程过程经常用的内容记录起来,如下内容段是关于C语言多种方法求解字符串编辑距离问题的内容. { if(xbeg > xend) { if(ybeg > yend) return 0; ...

  4. 百度「Web 前端研发部」面试过程和常见问题 可能会采用哪些方法来面试 STAR 面试法 喜欢什么样的面试者 喜欢问的问题

    http://segmentfault.com/a/1190000002498800 在他们的github上看到的,收藏一下备用.看完觉得还有很多要努力的地方. FEX 的面试过程 我们一般会有 3 ...

  5. 三种初步简易的方法求解数值问题 of C++

    1. “二分法解方程” 在二分法中,从区间[a,b]开始,用函数值f(a)与f(b)拥有相反的符号.如果f在这个区间连续,则f的图像至少在x=a,x=b之间穿越x轴一次,因此方程f(x)=0在[a,b ...

  6. 微信的API都是通过https调用实现的,分为post方法调用和get方法调用。不需要上传数据的采用get方法(使用IntraWeb开发)

    首先需要明确的是,微信的API都是通过https调用实现的,分为post方法调用和get方法调用.不需要上传数据的采用get方法(例如获取AccessToken),而需要向微信服务器提交数据的采用po ...

  7. 使用三种方法求解前N个正整数的排列

    本篇博文给大家介绍前N个正整数的排列求解的三种方式.第一种是暴力求解法:第二种则另外声明了一个长度为N的数组,并且将已经排列过的数字保存其中:第三种方式则采用了另外一种思路,即首先获取N个整数的升序排 ...

  8. Minimum_Window_Substring两种方法求解

    题目描述: Given a string S and a string T, find the minimum window in S which will contain all the chara ...

  9. selenium采用xpath方法识别页面元素

    有些HTML页面中的元素中属性较少,经常有找不到id.class.name等常用属性的时候,这个时候xpath.css就能很好的识别到我们的元素. Firefox和chrome浏览器中均有xpath. ...

随机推荐

  1. 脚本注入2(post)

    终于写到非get类型的注入了. 不过,我懒得在这里搞代码审计了:留到存储型XSS原型的时候再来分析源码吧. 这次以Less-15为例. 框里随便输点东西,submit,抓包,发现包出现了一些改变: 同 ...

  2. 封装一个的toast弹出框(vue项目)

    逆风的方向,更适合飞翔 实现效果 实现步骤 先写出一个toast组件 // Toast.vue <template> <div id="toast" :class ...

  3. python打印爱心

    print('\n'.join([''.join([('AndyLove'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 ...

  4. Noip模拟62 2021.9.26

    T1 Set 真就随机化拿了$90$?? 不过还是有依据的,毕竟这道题出解的几率很大,随出答案的概率也极大 所以不妨打一个随机化 1 #include<bits/stdc++.h> 2 # ...

  5. 【做题记录】 [JLOI2011]不等式组

    P5482 [JLOI2011]不等式组 超烦人的细节题!(本人调了两天 QAQ ) 这里介绍一种只用到一只树状数组的写法(离线). 树状数组的下标是:所有可能出现的数据进行离散化之后的值. 其含义为 ...

  6. 利用Microsoft Graph开发微软的Exchange Calendar会议、Team

    Microsoft Graph是什么? Microsoft Graph 是 Microsoft 365 中通往数据和智能的网关. 它提供统一的可编程模型,可用于访问 Microsoft 365.Win ...

  7. 转:bash shell 语法1

    1 Shell介绍 Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batc ...

  8. hdu 1166 敌兵布阵(简单线段树or树状数组)

    题意: N个工兵营地,第i个营地有ai个人. 三种操作: 1.第i个营地增加x个人. 2.第i个营地减少x个人. 3.查询第i个到第j个营地的总人数. 思路: 线段树or树状数组 代码:(树状数组) ...

  9. coreseek使用心得

    基本使用方法: D:\coreseek-4.1\bin\searchd -c D:\coreseek-4.1\etc\article.conf --stop 停止服务 D:\coreseek-4.1\ ...

  10. Spring Security OAuth2 单点登录

    1. OAuth 2.0 OAuth(Open Authorization)为用户资源的授权提供了一个安全的.开放而又简易的标准.最简单的理解,我们可以看一下微信OAuth2.0授权登录流程: 通过O ...