FESTUNG 模型介绍 - 2. 对流问题隐式求解

1. 控制方程

对流问题的控制方程为

\[\partial_t C + \partial_x u^1 C + \partial_y u^2 C = 0, \\
\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} \varphi_{ki} \sum_{j=1}^N \partial_t C_{kj} \varphi_{kj} }_{I}
- \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{M} \partial_t C + \left( \mathcal{G}^1 + \mathcal{G}^2 + \mathcal{R} \right) C = \mathcal{K}_D + \mathcal{K}_N
\]

其中 \(\mathcal{K}_D\) 和 \(\mathcal{K}_N\) 为边界条件产生的常数向量。最终得到关于时间的常微分方程组

\[\partial_t C = \mathcal{S}( C, t ), \quad \mathcal{S}( C, t ) = \mathcal{M}^{-1} \left[ \mathcal{K}_D + \mathcal{K}_N - \left( \mathcal{G}^1 + \mathcal{G}^2 + \mathcal{R} \right) C \right]
\]

2.2. 时间离散

在获得关于时间的半离散方程后,可采用 s 步对角隐式 Runge-Kutta 方法(DIRK)计算,其计算流程为

\[\begin{array}{ll}
\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)} =\mathbf{C}^{n}+\Delta t^{n} \sum_{j=1}^{i} a_{i j} \mathcal{M}^{-1} \left[ \mathcal{K}_D + \mathcal{K}_N - \left( \mathcal{G}^1 + \mathcal{G}^2 + \mathcal{R} \right) C^{(j)} \right]
\]

将与 \(\mathbf{C}^{(i)}\) 相关的项移到等号左侧可得

\[\left( 1 + \Delta t^n a_{ii} \mathcal{M}^{-1} \mathcal{A} \right) \mathbf{C}^{(i)} = \mathbf{C}^{n} + \Delta t^n a_{ii} \mathcal{M}^{-1} \mathcal{V} + \sum_{j=1}^{i-1} a_{i j} \mathcal{M}^{-1}( \mathcal{V} - \mathcal{A} \mathbf{C}^{(j)} )
\]

其中 \(\mathcal{A} = \mathcal{G}^1 + \mathcal{G}^2 + \mathcal{R}\), \(\mathcal{V} = \mathcal{K}_D + \mathcal{K}_N\)。将 \(\mathcal{M}\) 同时乘以等号两侧,可得

\[\left( \mathcal{M} + \Delta t^n a_{ii} \mathcal{A} \right) \mathbf{C}^{(i)} =
\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}\)。当求解恒定问题时,由于此时半离散方程不包含时间变化项,因此

\[C = \mathcal{A}^{-1} \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. 对流问题隐式求解的更多相关文章

  1. FESTUNG模型介绍—1.对流方程求解

    FESTUNG模型介绍-1.对流方程求解 1. 控制方程 对流问题中,控制方程表达式为 \[\partial_t C + \partial_x (u^1 C) + \partial_y (u^2 C) ...

  2. 大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值

    第八章 面向对象编程-高级8.1 静态属性和静态方法8.1.1 静态属性-提出问题8.1.2 基本介绍8.1.3 伴生对象的快速入门8.1.4 伴生对象的小结8.1.5 最佳实践-使用伴生对象解决小孩 ...

  3. 12、scala隐式转换与隐式参数

    一.隐式转换 1.介绍 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象. 通过这些功能,可以实 ...

  4. 基于GPS数据建立隐式马尔可夫模型预测目的地

    <Trip destination prediction based on multi-day GPS data>是一篇在2019年,由吉林交通大学团队发表在elsevier期刊上的一篇论 ...

  5. Swift隐式可选型简单介绍

    /* 隐式可选型 */ // 隐式可选型同样可以赋值为nil, 而且在后面对这个变量的使用也可以不用进行解包 var value: String! = nil // print(value) 这行代码 ...

  6. 深入理解 Java 内存模型(一)- 内存模型介绍

    深入理解 Java 内存模型(一)- 内存模型介绍 深入理解 Java 内存模型(二)- happens-before 规则 深入理解 Java 内存模型(三)- volatile 语义 深入理解 J ...

  7. SQL Server 隐式转换引发的躺枪死锁-程序员需知

    在SQL Server的应用开发过程(尤其是二次开发)中可能由于开发人员对表的结构不够了解,造成开发过程中使用了不合理的方式造成数据库引擎未按预定执行,以致影响业务.这是非常值得注意的.这次为大家介绍 ...

  8. Scala的函数,高阶函数,隐式转换

    1.介绍 2.函数值复制给变量 3.案例 在前面的博客中,可以看到这个案例,关于函数的讲解的位置,缺省. 4.简单的匿名函数 5.将函数做为参数传递给另一个函数 6.函数作为输出值 7.类型推断 8. ...

  9. dynamic_cast 和 static_cast 隐式类型转换的区别

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...

随机推荐

  1. 【c++ Prime 学习笔记】第18章 用于大型程序的工具

    大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误:异常处理 使用各种库(可能包含独立开发的库)进行协同开发:命名空间 对比较复杂的应用概念建模:多重继承 18.1 异常处理 异常处理 ...

  2. [Beta]the Agiles Scrum Meeting 4

    会议时间:2020.5.15 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 yjy 增加教学计划面板,修复bug tq 实现查看.删除测试点功能 wjx 实现批量创建结对项目功能 ...

  3. Noip模拟13 2021.7.13:再刚题,就剁手&&生日祭

    T1 工业题 这波行列看反就非常尴尬.....口糊出所有正解想到的唯独行列看反全盘炸列(因为和T1斗智斗勇两个半小时...) 这题就是肯定是个O(n+m)的,那就往哪里想,a,b和前面的系数分开求,前 ...

  4. c 不同类型的指针

    今天看到了一个问题:c里面,不同类型的指针是否可以互指呢?也就是不同类型的指针之间是否可以互相赋值,我想了想,对于32位机子而言,所有类型的指针都是4Byte(64位就是8Byte,这里只讨论32位) ...

  5. Ubuntu鼠标变十字 不能点击

    出现这种情况,应该是bash 直接运行了python文件 系统中出现了一个import 进程. python文件中除了注释应该是import在最前边 ps -ef|grep import 可以查看系统 ...

  6. 数组中的逆序对 牛客网 剑指Offer

    数组中的逆序对 牛客网 剑指Offer 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对10000000 ...

  7. C++常见STL介绍

    栈 :FILO 栈(stack)又名堆栈,它是一种线性表,是一个后进先出的数据结构. 使用时须加上头文件:#include<stack> 允许进行插入和删除操作的一端称为栈顶(top),另 ...

  8. 批量免密ssh

    参考连接:https://www.cnblogs.com/xiaoyuxixi/p/11413355.html 适用于所有密码都一样的情况下 应用场景: 在应用ansible的实际情况中,有一个很现实 ...

  9. redis开外网访问

    Redis: 注释掉bind 127.0.0.1可以使所有的ip访问redis 若是想指定多个ip访问,但并不是全部的ip访问,可以bind protected-mode no /etc/init.d ...

  10. kafka的安装

    kafka是基于java环境的,所以需要先安装java环境 centos:yum install java-11-openjdk ubuntu:apt install default-jdk 默安装默 ...