FESTUNG模型介绍—1.对流方程求解
FESTUNG模型介绍—1.对流方程求解
1. 控制方程
对流问题中,控制方程表达式为
\]
其中边界处包含 Dirichlet 和 Neumann 边界条件,分别为
C = C_D & \mathrm{on} \; \partial \Omega_D, \\
- \nabla C \cdot \mathbf{v} = g_N & \mathrm{on} \; \partial \Omega_N.
\end{array}
\]
2. 数值离散
将控制方程利用间断有限元离散后,积分方程形式为
- \underbrace{ \int_{\mathcal{T}_k} \partial_x \varphi_{ki} \sum_{j=1}^N C_{kj} \varphi_{kj} \sum_{j=1}^N u^1_{kl} \varphi_{kl}
- \int_{\mathcal{T}_k} \partial_y \varphi_{ki} \sum_{j=1}^N C_{kj} \varphi_{kj} \sum_{j=1}^N u^1_{kl} \varphi_{kl} }_{II} \\
+ \underbrace{ \left \{
\begin{array}{c}
\sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^1 u^1_{k} \varphi_{ki} \sum_{j=1}^N C_{kj}^* \varphi_{kj}
+ \sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^2 u^2_{k} \varphi_{ki} \sum_{j=1}^N C_{kj}^* \varphi_{kj} \quad \mathrm{on} \; \mathcal{E}_{\Omega} \\
\sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^1 u^1_{k} \varphi_{ki} \sum_{j=1}^N C_D^* \varphi_{kj}
+ \sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^2 u^2_{k} \varphi_{ki} \sum_{j=1}^N C_D^* \varphi_{kj} \quad \mathrm{on} \; \mathcal{E}_{D}
\end{array} \right \}
}_{III} = 0.
\]
将方程写为矩阵形式
\]
其中 \(\mathbf{C}=[C_{11}, \cdots, C_{1N}, \cdots, C_{K1}, \cdots, C_{KN}]^\top\) 未知数待求系数。在方程中,\(\mathbf{M}, \mathbf{G}^1,\mathbf{G}^2,\mathbf{S}\) 为各系数矩阵,下面分别介绍各个矩阵表达式。
\(\mathbf{M}\) 为质量矩阵,由于间断有限元局部性,可由各个单元质量矩阵组合而成
M_{\mathcal{T}_1} & & \\
& \ldots & \\
& & M_{\mathcal{T}_K}
\end{bmatrix} \quad
M_{\mathcal{T}_k} = \int_{\mathcal{T}_k} \begin{bmatrix}
\varphi_{k1} \varphi_{k1} & \ldots & \varphi_{k1} \varphi_{kN} \\
\ldots & \ldots & \ldots \\
\varphi_{kN} \varphi_{k1} & \ldots & \varphi_{kN} \varphi_{kN}
\end{bmatrix}
\]
或者也可写为 \(\mathbf{M} = \mathrm{diag} \left ( M_{\mathcal{T}_1}, \ldots, M_{\mathcal{T}_K} \right )\)。在第 \(II\) 项面积分中,由于包含三个基函数积分形式,因此 \(\mathbf{G}^1,\mathbf{G}^2\) 与传统刚度矩阵并不相同。与质量矩阵类似,\(\mathbf{G}^m = \mathrm{diag} \left ( G^m_{\mathcal{T}_1}, \ldots, G^m_{\mathcal{T}_K} \right ), m\in \{1,2 \}\) 可写为对角矩阵块形式,其中每个单元内矩阵系数可写为
\partial_{x^m} \varphi_{k1} \varphi_{kl} \varphi_{k1} & \ldots & \partial_{x^m} \varphi_{k1} \varphi_{kl} \varphi_{kN} \\
\ldots & \ldots & \ldots \\
\partial_{x^m} \varphi_{kN} \varphi_{kl} \varphi_{k1} & \ldots & \partial_{x^m} \varphi_{kN} \varphi_{kl} \varphi_{kN}
\end{bmatrix}
\]
在第 \(III\) 项面积分中,与前两项不同的是,由于面积分计算时边界通量可能采用其他单元内数值解,因此系数矩阵 \(\mathbf{S}\) 不为对角形式。在文献 [1] 中,Frank 等将 \(\mathbf{S}^m, m\in \{1,2 \}\) 写为对角块 (8a) 和非对角块 (8c) 部分,分别表示为
\sum_{E_{k n} \in \partial T_{k} \cap \mathcal{E}_{\Omega}} v_{k n}^{m} \left[ \mathbf{S}_{E_{kn}} \right]
\]
\]
上式中由于试验函数定义在 \(k^-\) 单元上,因此相邻单元基函数 \(\varphi_{k^{+} l}\) 和 \(\varphi_{k^{+} j}\) 在 \(k^-\) 单元边界 \(E_{k^{-} n^{-}}\) 上始终为 0,所以第二项表达式存在一定问题。但是由于相邻单元内相同编号的基函数 \(\varphi_{k^{-} j}\) 和 \(\varphi_{k^{+} j}\) 在边界 \(E_{k^{-} n^{-}}\) 上函数值分布不同,因此必须采用单元 \(k^{+}\) 的基函数进行表示。
在 Dirichlet 边界处,面积分计算需考虑边界条件 \(C = C_D\),由此包含右端项 \(\mathbf{K}_D\) 等。
获得矩阵形式离散方程后,即可采用 Runge-Kutta 等方法进行计算,右端项表达式为
\]
其中
\]
2.1. 体积分与面积分主要区别
在离散后得到的控制方程中,面积分和体积分系数矩阵中基函数个数并不相同,其中体积分中为两个基函数与一个基函数导数相乘,而面积分为两个基函数相乘。存在这种区别的原因是,在体积分中,用基函数近似值 \(u_h = \sum_{j=1}^N u^m_{kl} \varphi_{kl}\) 来近似流速,而在面积分中,则直接采用 \(u_h^m\) 在边界积分节点函数值进行计算。因此面积分中省去了基函数 \(\varphi_{kl}\) 项,仅包含 \(\varphi_{ki}\) 与 \(\varphi_{kj}\) 的积分计算。
3. 模型实现
3.1. 计算流程
在 FESTUNG 模型中建立求解器时,需要在文件夹内包含以下 4 个文件:
文件名 | 函数功能 |
---|---|
configureProblem.m | 算例设置文件,包括网格宽度,计算步数,边界条件等 |
preprocessProblem.m | 前处理需要数据,包括计算网格,常系数矩阵等 |
initializeProblem.m | 初始化函数 |
主循环 | 计算过程 |
postprocessProblme.m | 后处理函数 |
其中主循环求解部分包括四个步骤:
函数名 | 说明 |
---|---|
preprocessStep | 计算前处理 |
solveStep | 采用 Runge-Kutta 进行每步计算 |
postprocessStep | 每步计算后执行必要的数值处理 |
outputStep | 输出以及插值过程 |
在计算步 solveStep.m
中,调用了函数 iterateSubSteps
,在此函数中每一步进行了 \(m\) 次 Runge-Kutta 时间递进分步的计算,每步调用如下三个函数
函数名 | 说明 |
---|---|
preprocessSubStep | 组装 \(\mathbf{G}, \mathbf{R}, \mathbf{K}_D, \mathbf{K}_N, \mathbf{L}\) 等系数矩阵 |
solveSubStep | 计算右端项,求解线性方程组 |
postprocessSubStep | 判断 RK 迭代是否完成 |
在 preprocessSubStep
函数中,需要组装系数矩阵 \(\mathbf{G}^m, \mathbf{R}, \mathbf{K}_D, \mathbf{K}_N, \mathbf{L}\) 等系数矩阵,这是由于在每步计算过程中需要更新 \( u^1, u^2, f\) 等变量数值表达式,以及边界条件 \(C_D, g_N\) 等也可能随时间发生变化。
3.2. 通量计算
在对流方程计算中,面积分计算时采用迎风格式计算,因此在 \(\mathbf{S}^m\) 组装时需要考虑边界处流速方向。在组装边界积分矩阵时,调用函数 assembleMatEdgePhiPhiValUpwind
。
首先考察面积分的化简,在 \(\mathbf{S}_{E_{kn}}\) 中,其表达式为
v_{k n}^{m} u^m_{kn} \int_{E_{kn}} \begin{bmatrix}
\varphi_{k1} \varphi_{k1} & \ldots & \varphi_{k1} \varphi_{kN} \\
\ldots & \ldots & \ldots \\
\varphi_{kN} \varphi_{k1} & \ldots & \varphi_{kN} \varphi_{kN}
\end{bmatrix}
\]
对于面积分,首先将其投影至标准单元,随后转化为 \(s \in [0,1]\) 范围进行计算
= \frac{\left|E_{k n}\right|}{\left|\hat{E}_{n}\right|} \int_{\hat{E}_{n}} \hat{\varphi}_{i}(\hat{\boldsymbol{x}}) \hat{\varphi}_{j}(\hat{\boldsymbol{x}}) \mathrm{d} \hat{\boldsymbol{x}}
= \left|E_{k n}\right|
\underbrace {\int_{0}^{1} \hat{\varphi}_{i} \circ \hat{\gamma}_{n}(s) \hat{\varphi}_{j} \circ \hat{\gamma}_{n}(s) \mathrm{d} s }_{=:\left[ \mathbf{ \hat{S} }^{\mathrm{diag}} \right]_{i,j,n}}
\]
其中 \(\hat{\gamma}_{n}(s) : [0,1] \rightarrow \hat{E}_{n}\) 为标准单元边界投影,可将一维线单元的局部坐标转换为标准单元内边界节点坐标,表达式为
\]
对于单位长度上面积分表达式,可将 \([ \mathbf{ \hat{S} }^{\mathrm{diag}} ]_{i,j,n}\) 提前进行计算,随后系数矩阵可表示为
\]
首先考察对角部分矩阵块
\sum_{n=1}^{3} \left[\begin{array}{ccc}{\delta_{E_{1 n} \in \mathcal{E}_{\Omega}}} & {} \\ {} & {\ddots} & {} \\ {} & {} & {\delta_{E_{K n} \in \mathcal{E}_{\Omega}}}\end{array}\right] \circ \left[\begin{array}{cccc}{v_{1}^{m}\left|E_{1 n}\right| u_{1 n}^m} & {} & {} \\ {} & {\ddots} & {} \\ {} & {} & {} & {v_{K n}^{m} \left|E_{K n}\right| u_{K n}^m}\end{array}\right]
\otimes [\hat{\mathbf{S}}^{\mathrm{diag}} ]_{ :, :, n} \\
= \sum_{n=1}^{3} \boldsymbol{\delta}_E \circ \mathrm{diag} (v_k^m u_{kn}^m |E_{kn}| ) \otimes [\hat{\mathbf{S}}^{\mathrm{diag}} ]_{ :, :, n}
\]
在上式中 \(\boldsymbol{\delta}_E\) 为 \(K \times K\) 大小的对角矩阵,其中每个元素代表单元对应面是否位于内部面 \(\delta_{E_{k n} \in \mathcal{E}_{\Omega}}\),\(\mathrm{diag} (v_k^m u_{kn}^m |E_{kn}| )\) 则为每个单元上面积分时对应积分系数,最终 \([\hat{\mathbf{R}}^{\mathrm{diag}} ]_{ :, :, l, n}\) 为标准单元中基函数面积分大小。符号 \(\circ\) 代表 Hadamard 乘积(矩阵元素点乘),\(\otimes\) 为 Kronecker 算子。
为了考虑迎风通量,面积分时需要对系数 \(v_k^m u_{kn}^m\) 正负进行判断,当 \(v_k^m u_{kn}^m > 0\) 时采用原始系数矩阵,而当 \(v_k^m u_{kn}^m \le 0\) 时则应将对应系数修改为 0,代表本单元数值解并不参与此单元面的计算。
此外,在面积分计算时必须采用数值积分方法进行计算。令 \(R\) 为积分节点总数,数值积分可进一步写为
\]
其中
\varphi_{k1}(\hat{q}_r) \varphi_{k1}(\hat{q}_r) & \ldots & \varphi_{k1}(\hat{q}_r) \varphi_{kN}(\hat{q}_r) \\
\ldots & \ldots & \ldots \\
\varphi_{kN}(\hat{q}_r) \varphi_{k1}(\hat{q}_r) & \ldots & \varphi_{kN}(\hat{q}_r) \varphi_{kN}(\hat{q}_r)
\end{bmatrix}
\]
在非对角部分,同样可将面积分投影至标准长度线段中进行计算。需要注意的是,由于非对角部分表示相邻单元边界数值解在本单元边界上展开,因此积分计算时必须选取本地单元边界上相同位置的高斯节点进行计算。例如,当本地单元 \(k^{-}\) 边 \(n^- = 1\) 和相邻单元 \(k^{+}\) 边 \(n^+ = 3\) 相邻时,\(n^{+}\) 边界上的高斯节点局部坐标 \(s^{+}\) 与 \(n^{-}\) 边界上局部坐标是完全相反的 \(s^{+} = 1 - s^{-}\)。为此,模型提出了一个投影算子 \(\theta_{n^-, n^+}: \hat{E}_{n^-} \rightarrow \hat{E}_{n^+}\)(theta.m
),保证最终两侧边界计算时投影至相同高斯积分节点局部坐标大小相同,即二者有相同的坐标,保证 \(\varphi_{k^+, j}(s^{+}) = \varphi_{k^-, j}(s^{-})\),其中
\hat{\boldsymbol{\vartheta}}_{11} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{1-\hat{x}^{1}} \\ {1-\hat{x}^{2}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{12} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{0} \\ {\hat{x}^{2}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{13} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{\hat{x}^{1}} \\ {0}\end{array}\right] \\
\hat{\boldsymbol{\vartheta}}_{21} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{1-\hat{x}^{2}} \\ {\hat{x}^{2}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{22} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{0} \\ {1-\hat{x}^{2}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{23} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{\hat{x}^{2}} \\ {0}\end{array}\right] \\
\hat{\boldsymbol{\vartheta}}_{31} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{\hat{x}^{1}} \\ {1-\hat{x}^{1}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{32} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{0} \\ {\hat{x}^{1}}\end{array}\right] &
\hat{\boldsymbol{\vartheta}}_{33} :\left[\begin{array}{c}{\hat{x}^{1}} \\ {\hat{x}^{2}}\end{array}\right] \mapsto\left[\begin{array}{c}{1-\hat{x}^{1}} \\ {0}\end{array}\right] \\
\end{matrix}
\]
而标准单元中面积分矩阵表达式可写为
\]
尽管 \(\theta_{n^-, n^+}\) 表达式较为复杂,但是可以看出,其作用就是根据 \(k^{+}\) 单元相邻面的编号将面局部坐标投影为相反顺序,如
\hat{\boldsymbol{\vartheta}}_{n^{-}2} \circ \hat{\gamma}_{n^{-}}(s) = \left[\begin{array}{c}{0} \\ {s}\end{array}\right], \quad
\hat{\boldsymbol{\vartheta}}_{n^{-}3} \circ \hat{\gamma}_{n^{-}}(s) = \left[\begin{array}{c}{1-s} \\ {0}\end{array}\right]
\]
可以看出,经过 \(\hat{\boldsymbol{\vartheta}}_{n^{-}n^{+}}\) 变换后,局部坐标与原始标准单元边界投影是完全相反的,保证边界两侧基函数在相同高斯节点进行计算。
在组装全局矩阵系数时,同样需要判断单元边界是否相邻,因此引入 \(K \times K\) 大小的 \(\delta_E^{\mathrm{offdiag}}\) 矩阵,最终非对角项系数为
0 & \delta_{E_{1, n^{-}} = E_{2, n^{+}}} & \cdots & \cdots & \delta_{E_{1, n^{-}} = E_{K, n^{+}}} \\
\delta_{E_{2, n^{-}} = E_{1, n^{+}}} & 0 & \ddots & & \vdots \\
\vdots & \vdots & \ddots & & \vdots \\
\delta_{E_{K, n^{-}} = E_{K, n^{+}}} & \ldots & \ldots & \delta_{E_{K, n^{-}} = E_{{K-1}, n^{+}}} & 0
\end{bmatrix} \\
\circ \begin{bmatrix}
v_{1 n^{-}}^m u_{1 n^{-}}^m | E_{1 n^{-}} | & \ldots & v_{1 n^{-}}^m u_{1 n^{-}}^m | E_{1 n^{-}} | \\
\vdots & \ddots & \vdots \\
v_{K n^{-}}^m u_{K n^{-}}^m | E_{K n^{-}} | & \ldots & v_{K n^{-}}^m u_{K n^{-}}^m | E_{K n^{-}} |
\end{bmatrix}
\otimes\left[\hat{\mathbf{S}}^{\text { offdiag }}\right]_{:, :, n^{-}, n^{+} }
\]
由于非对角项考虑的是相邻单元对本单元影响,因此当 \(v_{kn^{-}}^m u_{kn^{-}}^m < 0\) 时(边界为入流),对应系数不为 0,其他情况对应边界系数为 0。
FESTUNG模型介绍—1.对流方程求解的更多相关文章
- FESTUNG 模型介绍 — 2. 对流问题隐式求解
FESTUNG 模型介绍 - 2. 对流问题隐式求解 1. 控制方程 对流问题的控制方程为 \[\partial_t C + \partial_x u^1 C + \partial_y u^2 C = ...
- SUNTANS 及 FVCOM 对流扩散方程求解简介[TBC]
最近接到一个任务,就是解决FVCOM中对流扩散计算不守衡问题.导师认为是其求解时候水平和垂向计算分开求解所导致的,目前我也没搞清到底有什么问题,反正就是让把SUNTANS的对流扩散计算挪到FVCOM中 ...
- 文本主题模型之LDA(二) LDA求解之Gibbs采样算法
文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 本文是LDA主题模型的第二篇, ...
- 文本主题模型之LDA(三) LDA求解之变分推断EM算法
文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法 本文是LDA主题模型的第三篇,读这一篇之前 ...
- Machine Learning系列--隐马尔可夫模型的三大问题及求解方法
本文主要介绍隐马尔可夫模型以及该模型中的三大问题的解决方法. 隐马尔可夫模型的是处理序列问题的统计学模型,描述的过程为:由隐马尔科夫链随机生成不可观测的状态随机序列,然后各个状态分别生成一个观测,从而 ...
- IO模型介绍
先理解几个问题: (1)为什么读取文件的时候,需要用户进程通过系统调用内核完成(系统不能自己调用内核)什么是用户态和内核态?为什么要区分内核态和用户态呢? 在 CPU 的所有指令中,有些指令是非常危险 ...
- MATLAB 符号变量表达式 + 方程求解
源代码见文末 部分源代码: % 符号变量 两种表达方式 a=sym('a'); class(a); syms b; b; % 符号常量 c=sym('); c; % 符号表达式 三种表达方式 f1=' ...
- 模型介绍之FastText
模型介绍一: 1. FastText原理及实践 前言----来源&特点 fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在学术上并没有太大创新.但是它的优点也 ...
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
随机推荐
- 【数据结构与算法Python版学习笔记】树——树的遍历 Tree Traversals
遍历方式 前序遍历 在前序遍历中,先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树. 中序遍历 在中序遍历中,先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树. 后序遍 ...
- 移动端 h5 uniapp 读,写,删本地文件或sd文件
移动端 h5 uniapp 读,写,删本地文件或sd文件 应用场景: 当我们需要做离线应用或者是加载本地文件时使用到此方法.(本篇文章给大家分享访问app私有文件目录,系统公共目录,sd外置存储的文件 ...
- [no_code][Beta]测试报告
项目 内容 2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 测试报告 我们在这个课程的目标是 设计出一个OCR表单处理软件 这个作业在哪个具体方面 ...
- filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理
filebeat收集日志到elsticsearch中 一.需求 二.实现 1.filebeat.yml 配置文件的编写 2.创建自定义的索引模板 3.加密连接到es用户的密码 1.创建keystore ...
- 转:BeanFactory和FactoryBean的区别
一.BeanFactory简介 BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持 ...
- hdu 1027 Ignatius and the Princess II(正、逆康托)
题意: 给N和M. 输出1,2,...,N的第M大全排列. 思路: 将M逆康托,求出a1,a2,...aN. 看代码. 代码: int const MAXM=10000; int fac[15]; i ...
- CentOS7自动备份oracle数据库
1.环境 操作系统:CentOS 7 数据库:11.2.0.1.0 2.登录服务器 切换oracle用户,备份需要在oracle用户下进行 #su - oracle 在oracle家目录下创建bin目 ...
- 剑指 Offer 20. 表示数值的字符串
方法:分为几个部分判断 DA[.B][E/eC] D 其中D表示前后的空格,需要处理,跳过即可 A可以带正负号 有符号数 B无符号数 C可以为有符号数(带+-号) 小数点.后面必须是无符号数或者没有 ...
- SQL告警,执行时间长?教你写一手好 SQL !
博主(编码砖家)负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟.导出日志后分析,主要原因竟然是没有命中索引和没有分页处理 . 其实这是非常低级的错误, ...
- Intellij Idea显示回退和前进按钮的方法
方法1:使用快捷键: 回到上一步 ctrl + alt + <-(左方向键) 回到下一步 ctrl + alt + ->(右方向键) 方法2:在界面显示: View -> 勾选To ...