|
|
|
|
移动端

2.2.2 Godunov方法

《高性能并行珠玑:多核和众核编程方法》第2章从正确到正确&高效:Godunov格式的Hydro2D案例学习,本章将探讨一段科学模拟代码,这段代码是一个以气体动力学为基础的模拟程序。这份程序的输出结果正确,但(初始版本)性能欠佳。本节为大家介绍Godunov方法。

作者:张云泉 等译来源:机械工业出版社|2017-11-14 17:32

技术沙龙 | 6月30日与多位专家探讨技术高速发展下如何应对运维新挑战!


2.2.2 Godunov方法

在冲击的研究中,欧拉方程通常用于对应的计算解决方案中。Hydro2D是一段冲击捕获代码,使用Godunov方法来计算由用户设定的初始边界值问题(IBVP)。

Godunov方法是在1959年由苏联数学家Godunov提出的。由于式(2-1)的形式难以在存在冲击时进行定义,因此它使用了PDE的积分形式,即各离散单元格对应一个特定量均值。在每个步长中,我们计算在该步长内发生的各相邻单元格间的平均流量;该流量是指单元格间流动的量。随着执行时间的推移,单元格总数进行更新的同时,解也随之更新。图2-1表示的是一维Godunov方法示意图。

斜率限制。对于冲击处理而言,采用均值表示法可以起到一定的作用,但是若不加以修改,它只能作为一个分段常数方案和并将空间精度限制在一阶上。

目前已经有许多数值计算方法能够在高阶精度的基础上解决该问题。这些方法必须详细规划以确保在求解时的不连续性同时避免引入非物理分散现象。

流量限制是精度改进方法的一种,在加快求解之前,它通过对小流量区域进行研究修改积分方案。Hydro2D使用另一种名为斜率限制的方法,该方法使用一个邻域的单元格值来计算流量平面中每个单元格的斜率值。

黎曼问题。如何计算流量是Godunov方法的核心内容。也就是说,要根据给定的一对共享一条边的单元格,计算出这个时间步长中的平均流量。换而言之,即给定两个分段恒定的状态,这两个状态在空间中相遇,那么它们在控制方程的约束下将如何演变?这就是我们熟知的黎曼问题。对于非线性方程组来说,演变过程将会非常复杂。新的中间态可能会冲击左状态、右状态,甚至同时冲击两个状态,更有可能使得两个状态互相冲击。这些新的状态可能包含尖锐、快速移动的脉冲以及缓慢光滑变化的波动块。

我们所需要解决的是一个离散的黎曼问题,这个黎曼问题是在两个共享一条边的单元格间产生的——一个n*n的网格中,每个在每个时间步长中要计算2n (n-1)对共享边的单元格对。为了对这些黎曼问题进行求解,研究特定且高效的黎曼求解器一直以来是一个热门的研究内容。

Hydro2D使用局部非线性求解器来解决黎曼问题:在2D欧拉方程中,大量的中间态可以通过在左右状态之间的一个非线性标量方程所决定。我们使用若干次Newton-Raphson迭代就会计算出来流量的合适值。

积分。2D欧拉方程构成了一个双曲系统方程组,这种方程组通常使用显式的技术计算积分。Hydro2D用显式欧拉方法执行时间的积分。在冲击存在的条件下这是一个简单有效的方法。

另外一个需要考虑的因素是稳定性;对于给定的单元格状态(意味着Q和网格间隔Δx),为了得到正确稳定的解,有最大可允许的时间步长Δt。因为相同的Δt必须处处都存在,所以在积分之前Δt的值必须已知,而且由于Δt依赖于解的离散状态,因此在每个时间步开始计算前都会出现一个计算和归约步的操作。

维度分裂。传统的Godunov方法是一维的,对于二维和三维需要使用维度分裂的方法。这是更一般的算子分裂方法的一个特例,在其中,原有方程被算子分裂成几个方程,这些方程就会串行地根据先前的结论(图2-2)求解。在式(2-1)中有两个空间项被分解成单独的时间步长;为了从tn推进到tn+1,解也从使用?/?x项从tn推进到中间态tn*,接着使用?/?y项推进到tn + 1(流量计算与积分)。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

大道至简:软件工程实践者的思想

本书是在“思想方法学”这一软件工程尚未涉足过的领域中的实习之作。作者亲历国内软件工程的英雄时代、泡沫时代,从失败中醒觉而创建独特的...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊