system: [SYSTEM]

user: 2. 利用微分变换步骤构造ADER-DG方法 2.1. 相关符号 首先将空间计算区域 [ a ， b ] 离散为N个单元 I j = [ x j − 1 2 ， x j + 1 2 ] ， j = 1 ， 2 ， ⋯ ， N 。其中 a = x 1 2 < x 3 2 < ⋯ < x N + 1 2 = b ，并记单元中心、网格步长分别为 x j = 1 2 ( x j + 1 2 − x j − 1 2 ) 、 Δ x j = x j + 1 2 − x j − 1 2 。 假设现在的时间区间为 [ t n ， t n + 1 ] ，其中 Δ t = t n + 1 − t n 表示时间步长，然后记 Ω j = I j × [ t n ， t n + 1 ] 为时–空 控制单元。接下来，我们定义DG逼近空间如下： V τ k = { ϕ ( x ， t ) : ϕ ( x ， t ) | Ω j ∈ P k ( Ω j ) ， j = 1 ， ⋯ ， N } ， 其中 P k ( Ω j ) 表示定义在时–空控制单元 Ω j 上次数不超过k次的时–空多项式的集合。 2.2. ADER-DG方法的一般形式 首先在方程(1)两端同时乘一个任意空间测试函数 ϕ ( x ) ∈ V τ k ，并在时空控制单元 Ω j 上使用分部积分，进而得到以下弱形式： ∫ I j u ( x ， t n + 1 ) ϕ ( x ) d x − ∫ I j u ( x ， t n ) ϕ ( x ) d x + ∫ t n t n + 1 f ( x j + 1 2 ， t ) d t ⋅ ϕ ( x j + 1 2 − )   − ∫ t n t n + 1 f ( x j − 1 2 ， t ) d t ⋅ ϕ ( x j − 1 2 + ) − ∬ Ω j f ( x ， t ) ϕ x d x d t = 0 ， j = 1 ， ⋯ ， N . 这里，二元函数 f ( x ， t ) = f ( u ( x ， t ) ) 表示物理流通量。 假设未知解 u ( x ， t ) 在时–空控制单元 Ω j 上的DG逼近为 u τ ( x ， t ) = ∑ k t = 0 k ∑ k x = 0 k − k t u ˜ ( k x ， k t ) ( x − x j ) k x ( t − t n ) k t ， 这实际上是 u ( x ， t ) 的泰勒级数展开的截断形式。这里，我们的ADER-DG方法表述为：给定 t n 时刻的数值解 u τ ( x ， t n ) ∈ V τ K ，寻找下一时刻的数值解 u τ ( x ， t n + 1 ) ∈ V τ K 来满足以下等式： ∫ I j u τ ( x ， t n ) ϕ ( x ) d x = ∫ I j u τ ( x ， t n ) ϕ ( x ) d x − f ^ j + 1 2 ⋅ ϕ ( x j + 1 2 − ) + f ^ j − 1 2 ⋅ ϕ ( x j − 1 2 + ) + ∬ Ω j f τ ( x ， t ) ϕ x d x d t ， j = 1 ， ⋯ ， N ， (2) 这里 f ^ j + 1 2 表示数值流通量，用来逼近单元界面处针对物理流通量在时间区间 [ t n ， t n + 1 ] 上的时间积分。 在本文中，我们采用简单高效的Lax-Friedrichs流通量： f ^ j + 1 2 = 1 2 ∫ t n t n + 1 ( f τ ( x j + 1 2 − ， t ) + f τ ( x j + 1 2 + ， t ) − α ( u τ ( x j + 1 2 + ， t ) − u τ ( x j + 1 2 − ， t ) ) ) d t (3) 其中 α = max u | f ′ ( u ) | 用来估计最大波速度，且最大值在整个空间计算区域上来获得。从公式(2)可以看出，如果想更新到时刻 t n + 1 ，我们需要构造单元界面处的数值流通量，计算空间积分，以及时–空积分。 2.3. 使用微分变换步骤计算时–空展开系数 传统ADER方法 [ 9 ] [ 10 ] [ 11 ] 一般采用Cauchy-Kowalewski步骤将解的时间导数通过其空间导数来表示。特别的，针对方程(1)的Cauchy-Kowalewski步骤如下： u t = − f ′ ( u ) u x ， u x t = − f ′ ( u ) u x x − f ″ ( u ) ( u x ) 2 ， u t t = − f ″ ( u ) u t u x + f ′ ( u ) f ″ ( u ) ( u x ) 2 + ( f ′ ( u ) ) 2 u x x ，             ⋮ 显然，对于高阶导数和高维问题，Cauchy-Kowalewski步骤将变得异常繁琐。 另外，文献 [ 23 ] 中提出了一种称为微分变换的替代步骤，用来简化Cauchy-Kowalewski步骤。在本文中，我们应用微分变换步骤来获得泰勒级数形式的数值解的时–空展开系数。同Cauchy-Kowalewski步骤相比较，微分变换步骤的实现非常简单有效 [ 24 ]。通常，时刻 t n 在单元 I j 中给定函数 u ( x ， t ) ，微分变换步骤用来获得如下系数： u ˜ ( k x ， k t ) = 1 k x ! k t ! ∂ k x + k t u ( x ， t ) ∂ x k x ∂ t k t | x = x j ， t = t n ， 这里， u ( x ， t ) 是原始函数， u ˜ ( k x ， k t ) 是变换函数。实际上， u ˜ ( k x ， k t ) 表示函数 u ( x ， t ) 在点 ( x j ， t n ) 处的 ( k x ， k t ) 阶导数值。该步骤的逆运算为 u ( x ， t ) 的泰勒级数展开式： u ( x ， t ) = ∑ k x = 0 ∞ ∑ k t = 0 ∞ u ˜ ( k x ， k t ) ( x − x j ) k x ( t − t n ) k t . 下面列出了本文中用到的一些微分转换公式，具体见表1。 Table 1 Differential transformations of some functions encountered in this articl 原始函数 变换函数 q ( x ， t ) = ∂ u ( x ， t ) ∂ x q ˜ ( k x ， k t ) = ( k x + 1 ) u ˜ ( k x + 1 ， k t ) q ( x ， t ) = ∂ u ( x ， t ) ∂ t q ˜ ( k x ， k t ) = ( k t + 1 ) u ˜ ( k x ， k t + 1 ) q ( x ， t ) = u ( x ， t ) v ( x ， t ) q ˜ ( k x ， k t ) = ∑ r = 0 k x ∑ s = 0 k t u ˜ ( k x ， k t ) v ˜ ( k x − r ， k t − s ) 表1. 本文用到的有关微分变换公式 2.4. ADER-DG方法的详细步骤 基于微分变换步骤的ADER-DG方法的详细实现过程总结如下： 1) 从初始条件 u ( x ， 0 ) 出发，通过 L 2 投影，得到 u ˜ ( k x ， 0 ) ， k x = 0 ， 1 ， ⋯ ， k ，进而得到 u τ ( x ， 0 ) ； 2) 在时刻 t = t n ，在单元 I j 中，基于 u ˜ ( k x ， 0 ) 和控制方程本身，并利用微分变换步骤，分别递归地得到 u ˜ ( k x ， k t ) 和 f ˜ ( k x ， k t ) ， k t = 0 ， 1 ， ⋯ ， k ; k x = 0 ， 1 ， ⋯ ， k − k t ，然后得到： u τ ( x ， t ) = ∑ k t = 0 k ∑ k x = 0 k − k t u ˜ ( k x ， k t ) ( x − x j ) k x ( t − t n ) k t ∈ Ω j ， f τ ( x ， t ) = ∑ k t = 0 k ∑ k x = 0 k − k t u ˜ ( k x ， k t ) ( x − x j ) k x ( t − t n ) k t ∈ Ω j . 3) 通过公式(3)构造数值通量 f ^ j + 1 2 。 4) 根据单步公式将数值解更新至下一个时间步 t n + 1 ，得到 u τ ( x ， t n + 1 ) 。 5) 必要时针对解 u τ ( x ， t n + 1 ) 使用斜率限制器。 注1：在使用微分变换步骤后，我们可以将数值解和流通量表示为时–空二元多项式。那么针对数值流通量和积分，我们可以采取精确计算，进而避免使用计算量较大的数值求积公式。 注2：实际上，微分变换步骤将控制方程本身转换为关于时–空泰勒级数的展开系数的递推关系。微分变换步骤使我们能够轻松地构造时–空上具有任意高阶精度的ADER-DG方法。此外，与Cauchy-Kowalewski步骤相比，微分变换步骤可以大大降低计算成本，并且应用范围更加广泛。