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 ...
随机推荐
- 普通用户在命令终端使用Python脚本连入校园网
普通用户在命令终端使用Python脚本连入校园网 想要连入校园网的步骤: 浏览器输入对应的IP地址,输入账号密码连网: 下载对应软件,输入账号密码连网: 而面对没有界面的服务器,而你又没有root权限 ...
- Scrum Meeting 0602
零.说明 日期:2021-6-2 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 完成后端管理 ...
- 常用Java API:HashMap 和 TreeMap
摘要 本文主要介绍Map接口下的HashMap和TreeMap. HashMap HashMap是基于哈希表的 Map 接口的实现,是无序的 clear()//清空. containsKey(Obje ...
- 设计模式 - Bridge 桥模式
Bridge桥模式也属于"的单一职责"模式中的典型模式.问题描述:我们绘制图形时,图形可以有不同形状以及不同颜色,比如圆形可以是红的,绿的,方形可以是红的绿的,如果用代码来描绘这些 ...
- Android上安装第三方库
在Android sdk中安装预安装第三方的(动态,静态)库,到系统中,方便模块无差别的使用. Android.mk include $(CLEAR_VARS) LOCAL_MODULE_TAGS : ...
- 第一个只出现一次字符的位置 牛客网 剑指Offer
第一个只出现一次字符的位置 牛客网 剑指Offer 题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 ...
- Ubuntu virtualenv 创建 python2 虚拟环境 激活 退出
首先默认安装了virtualenv 创建python2虚拟环境 your-name@node-name:~/virtual_env$ virtualenv -p /usr/bin/python2 py ...
- openstack 虚机热迁移问题:虚机状态一直处于迁移中的情况处理
前提:在偶尔的虚机热迁移中,发现虚机一直属于迁移状态中. 但是查看后台流量监控,发现没有流量已经下来了.然后在目标机器上查看,发现kvm已经在目标机器上. 1.查看kvm 实际所处宿主机方法: a.拿 ...
- ansible模块及语法
常用模块详解 模块说明及示例: 1.ping模块ping模块 主要用于判断远程客户端是否在线,用于ping本身服务器,返回值是changed.ping示例 ansible clu -m ping 2. ...
- jenkins项目发布
目录 一.简介 二.docker打包 一.后端打包 二.前端打包 三.启动容器 四.完整代码 五.发布测试 六.优化方案 七.源码地址: 八.参考 一.简介 1.该章节基于jenkins.Harbor ...