FESTUNG 模型介绍 — 2. 对流问题隐式求解
FESTUNG 模型介绍 - 2. 对流问题隐式求解
1. 控制方程
对流问题的控制方程为
\begin{array}{cl}
C = C_D & \mathrm{on} \; \partial \Omega_D, \\
- \nabla C \cdot \mathbf{v} = g_N & \mathrm{on} \; \partial \Omega_N.
\end{array}
\]
在边界处包含 Dirichlet 和 Neumann 两种边界条件。
2. 数值离散
2.1. 空间离散
采用间断有限元方法对控制方程进行离散,包括采用一次分部积分并利用 Green-Gauss 公式将方程转化为
- \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_{kn} \varphi_{ki} \sum_{j=1}^N C_{kj}^* \varphi_{kj}
+ \sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^2 u^2_{kn} \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_{kn} \varphi_{ki} \sum_{j=1}^N C_D^* \varphi_{kj}
+ \sum_{n=1}^3 \int_{\partial \mathcal{T}_k} v_{kn}^2 u^2_{kn} \varphi_{ki} \sum_{j=1}^N C_D^* \varphi_{kj} \quad \mathrm{on} \; \mathcal{E}_{D}
\end{array} \right \}
}_{III} = 0.
\]
代入质量矩阵 \(\mathcal{M}\) 等,可将半离散方程化为矩阵形式
\]
其中 \(\mathcal{K}_D\) 和 \(\mathcal{K}_N\) 为边界条件产生的常数向量。最终得到关于时间的常微分方程组
\]
2.2. 时间离散
在获得关于时间的半离散方程后,可采用 s 步对角隐式 Runge-Kutta 方法(DIRK)计算,其计算流程为
\mathbf{C}^{(i)} :=\mathbf{C}^{n}+\Delta t^{n} \sum_{j=1}^{i} a_{i j} \mathcal{S}\left(\mathbf{C}^{(j)}, t^{(j)}\right), & \text { for } \quad i=1, \ldots, s \\
\mathbf{C}^{n+1} :=\mathbf{C}^{n}+\Delta t^{n} \sum_{i=1}^{s} b_{i} \mathcal{S}\left(\mathbf{C}^{(i)}, t^{(i)}\right)
\end{array}
\]
在 DIRK 方法中,\(b_j = a_{sj}\),因此计算时不必进行最后一步 \(\mathbf{C}^{n+1}\) 的计算,而只需把 \(\mathbf{C}^{(s)}\) 值赋给 \(\mathbf{C}^{n+1}\) 即可。
将空间算子表达式代入,可得每一步 \(\mathbf{C}^{(i)}\) 的具体计算公式为
\]
将与 \(\mathbf{C}^{(i)}\) 相关的项移到等号左侧可得
\]
其中 \(\mathcal{A} = \mathcal{G}^1 + \mathcal{G}^2 + \mathcal{R}\), \(\mathcal{V} = \mathcal{K}_D + \mathcal{K}_N\)。将 \(\mathcal{M}\) 同时乘以等号两侧,可得
\mathcal{M} \mathbf{C}^{n} + \Delta t^n a_{ii} \mathcal{V} + \sum_{j=1}^{i-1} a_{i j} ( \mathcal{V} - \mathcal{A} \mathbf{C}^{(j)} )
\]
两侧同乘以 \(\left( \mathcal{M} + \Delta t^n a_{ii} \mathcal{A} \right)^{-1}\),即可获得 \(\mathbf{C}^{(i)}\) 的数值解。
3. 模型实现
在 FESTUNG 中,solveSubStep.m 实现了 DIRK 方法中每步 \(\mathbf{C}^{(i)}\) 的计算过程。
首先,组装系数矩阵 sysA 与 sysV,分别代表 \(\mathcal{A}\) 与 \(\mathcal{V}\)。当求解恒定问题时,由于此时半离散方程不包含时间变化项,因此
\]
当求解问题为非恒定时,首先计算方程组的右端项 sysR = \(\mathcal{M} \mathbf{C}^{n} + \Delta t^n a_{ii} \mathcal{V} + \sum_{j=1}^{i-1} a_{i j} ( \mathcal{V} - \mathcal{A} \mathbf{C}^{(j)} )\) ,其代码为
% Computing the rhs
sysR = (problemData.tau * problemData.A(nSubStep, nSubStep)) * sysV + problemData.globM * problemData.cDiscRK{1};
for j = 1 : nSubStep - 1
sysR = sysR + (problemData.tau * problemData.A(nSubStep, j)) * problemData.rhsRK{j};
end % for
随后,将系数矩阵的逆左乘至右端项 sysR 上,即可获得 \(\mathbf{C}^{(i)}\) 的数值解
% Compute the next step
problemData.cDiscRK{nSubStep + 1} = (problemData.globM + (problemData.tau * problemData.A(nSubStep, nSubStep)) * sysA) \ sysR;
FESTUNG 模型介绍 — 2. 对流问题隐式求解的更多相关文章
- FESTUNG模型介绍—1.对流方程求解
FESTUNG模型介绍-1.对流方程求解 1. 控制方程 对流问题中,控制方程表达式为 \[\partial_t C + \partial_x (u^1 C) + \partial_y (u^2 C) ...
- 大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值
第八章 面向对象编程-高级8.1 静态属性和静态方法8.1.1 静态属性-提出问题8.1.2 基本介绍8.1.3 伴生对象的快速入门8.1.4 伴生对象的小结8.1.5 最佳实践-使用伴生对象解决小孩 ...
- 12、scala隐式转换与隐式参数
一.隐式转换 1.介绍 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象. 通过这些功能,可以实 ...
- 基于GPS数据建立隐式马尔可夫模型预测目的地
<Trip destination prediction based on multi-day GPS data>是一篇在2019年,由吉林交通大学团队发表在elsevier期刊上的一篇论 ...
- Swift隐式可选型简单介绍
/* 隐式可选型 */ // 隐式可选型同样可以赋值为nil, 而且在后面对这个变量的使用也可以不用进行解包 var value: String! = nil // print(value) 这行代码 ...
- 深入理解 Java 内存模型(一)- 内存模型介绍
深入理解 Java 内存模型(一)- 内存模型介绍 深入理解 Java 内存模型(二)- happens-before 规则 深入理解 Java 内存模型(三)- volatile 语义 深入理解 J ...
- SQL Server 隐式转换引发的躺枪死锁-程序员需知
在SQL Server的应用开发过程(尤其是二次开发)中可能由于开发人员对表的结构不够了解,造成开发过程中使用了不合理的方式造成数据库引擎未按预定执行,以致影响业务.这是非常值得注意的.这次为大家介绍 ...
- Scala的函数,高阶函数,隐式转换
1.介绍 2.函数值复制给变量 3.案例 在前面的博客中,可以看到这个案例,关于函数的讲解的位置,缺省. 4.简单的匿名函数 5.将函数做为参数传递给另一个函数 6.函数作为输出值 7.类型推断 8. ...
- dynamic_cast 和 static_cast 隐式类型转换的区别
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...
随机推荐
- 整数划分为k份
题目 将整数n分成k份,且每份不能为空,任意两个方案不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输入 ...
- kiyv Button参数属性
from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout from kivy.app import ...
- [技术博客] 利用SharedPreferences来实现登录状态的记忆功能
[技术博客] 利用SharedPreferences来实现登录状态的记忆功能 一.SharedPreferences简介 SharedPreferences是Android平台上一个轻量级的存储辅助类 ...
- OO_JAVA_表达式求导_单元总结
OO_JAVA_表达式求导_单元总结 这里引用个链接,是我写的另一份博客,讲的是设计层面的问题,下面主要是对自己代码的单元总结. 程序分析 (1)基于度量来分析自己的程序结构 第一次作业 程序结构大致 ...
- spring cloud feign的基本使用
在上一节,我们学会了如何使用ribbon进行来进行服务之间的调用,但是那种需要通过RestTemplate来进行调用而且当参数比较多时,使用起来就比较麻烦.那么有没有一种调用远程方法(别的服务)就像调 ...
- Windows平台编译器相关的几个预定义宏
WIN32 是在windows.h 中定义的宏,包含winodws.h则定义该宏 _WIN32/_WIN64跟windows平台有关的宏,_WIN32在windows 32位和64位下都有该宏,_ ...
- 从0到1使用Kubernetes系列(四):搭建第一个应用程序
传统Kubernetes应用搭建 创建Namespace 在一个Kubernetes集群中可以创建多个Namespace进行"环境隔离",当项目和人员众多的时候,可以考虑根据项目的 ...
- 利用Nginx搭建Ambari本地安装源
1.下载本地源包https://docs.hortonworks.com/HDPDocuments/Ambari-2.7.3.0/bk_ambari-installation/content/ch_o ...
- linux cut
参考:Linux cut 命令详解_Linux_脚本之家 (jb51.net) 参考:cut命令_Linux cut 命令用法详解:连接文件并打印到标准输出设备上 (linuxde.net)
- 2021CCPC华为云挑战赛 部分题题解
CDN流量调度问题 题看了没多久就看出来是\(DP\)的题,然后就设了状态\(f[i][j]\)表示到前\(i\)个点时已经用了\(j\)个节点的最小总代价,结果发现转移时\(O(nm^2)\),但这 ...