第 16 章 圧縮性流れの解法|1 次元 Euler 方程式
圧縮性流は，物理では時空間における波動現象として，また数学では特性の理論 (theory of characteristics)の中で論じられてきた．その最も基本的な非定常１次元流れの偏微分方程式系は，特性の理論によって３つの常微分方程式の系に置き換えられるが ，これらの常微分方程式は物理的には２つの圧力波 (acoustic

waves) と１つのエントロピー波を表している．１つの圧力波とエントロピー波は流れの方向に伝播するが，残りの圧力波は超音速では流れ方向に亜音速では流れに逆らって伝播する．上流化 (upstreaming, 風上化
upwinding) は，各波に対しそれぞれを上流化すべきで，このような考えを流束分離という．流束そのもの
をその伝播方向によって分けるものを流束ベクトル分離法 (ux vector splitting)，流束の差分を分けるものを流束差分分離法 (ux dierence splitting) という．流束分離は解の安定化や衝撃波などの不連続の鮮明な捕獲に欠かせないもので，圧縮性流れの多次元問題や Navier-Stokes 方程式においてもそうである．流束分離法で常微分方程式に置き換える操作は対角化 (diagonalization) といわれるが，偏微分方程式系の対角化は線形方程式に対して行われる．また保存形方程式が広く用いられているが，保存形の式は特性の理論を適用すると複雑になるために，対角化の前に非保存形 (nonconservative form) に変換することも多い．結局 流束分離法では，線形化，非保存形化，対角化の一連の操作の後に上流化が行われることになる．流束
分離ひいては圧縮性流れの数値解法のプログラムがブラックボックスにならないよう，ここでは冗長をおそれずこれらの操作を丁寧に解説する．

16.1

2 独立変数の双曲型微分方程式

非定常１次元流れの微分方程式は 2 独立変数の双曲型偏微分方程式 (hyperbolic partial dierential equa-tions) で，初期値問題として解かれるものである．ここでは次の 2 独立変数の 1 階準線形双曲型方程式を考える1 ．

ut + Aux + c = 0
ただし ut = @u=@t ux = @u=@x，u(x t) は未知変数ベクトル，A は係数行列で，
0u 1
0a a
1
0c 1
a1k
1
11
12
1
B
C
B
C
B
C
u
a
a
a
c
B
C
B
C
B
2
21
22
2k
2C
B
C
B
C
B
u = B .. C  A = B .. ..
.. C  c = B .. C
C

@.A
uk

@.

.

ak1 ak2

. A

@.A

akk

(16.1a)(16.1b)ck

A と c は一般に x t u の関数である2 ．

1 準線形 (quasilinear) とはその方程式に含まれる最高階数に関して線形であることである．たとえば 1 階の方程式 au + bu = cxya b c が x y の関数のときに線形，x y u の関数のときに準線形である．2 階の方程式 auxx +2buxy + cuyy = d は a b c dx y u ux  uy の関数のときに準線形である．式 (16.1) は最高階数 ut ux の 1 次式で準線形である．
2 与えられた微分方程式が高階微分を含む場合には，新たな従属変数を導入することによって 1 階微分方程式系にできるので，この方程式系は一般性のあるものである．例えば 2 階の方程式 auxx +2buxy + cuyy = d は ux = p uy = q と置けば，1 階の方程式の系は apx + b(py + qx )+ cqy = d py ; qx = 0 となる．また But + Aux + c = 0 は，jB j 6= 0 とすればその逆行列 B ;1 を左から演
算することによって式 (16.1) の形にすることができる

は
が

1

2

圧縮性流れの解法|１次元 Euler 方程式
いま  曲線座標系を導入し独立変数を xt から  に変えれば，式 (16.1) は次のように書き換えられる．

 @@ u + A @ +  @ u + c = 0
t @ + t @
x @ x @

この式を x で割算すれば ，(A I )u + g = 0(16.2);

ただし  = ;t =x ，I は単位行列，また g = fc +(t I + x A)u g=x は一般に   u u の関数であるが u の関数ではない． の代数方程式

A I = 0j;(16.3)

jを特性条件 (characteristic condition) と言う．曲線の式 (x t) = const: は微分形で表せば x dx+t dt = 0となるから， = ;t =x = dx=dt である．式 (16.3) の根 i に対する曲線

dx=dt = i(16.4)

を特性曲線 (characteristic curve) と言う．

式 (16.3) は  の k 次代数方程式であるから，一般に k 個の根 i (i = 1 2 : : :  k ) を持つ．これらの根を行列 A の固有値 (eigenvalues) という．行列 A ; I は k 個の行ベクトルまたは列ベクトルから構成されると解釈することができ，これらのベクトルは一般に k 次元空間を張る．しかしながら固有値 i に対しては，
式 (16.3) は行列 A;i I を構成する k 個のベクトルが 1 次独立でないことを意味しており，これらのベクト

ルは k ; 1 次元の面内に入る3 ．したがって k 次元空間内にこの面に直交する１つのベクトル `i を取ることができる．行ベクトル `i は行列 A ; i I を構成するすべてのベクトルに直交するから次式が成立する．

`i (A i I ) = 0(i = 1 2 : : :  k);

(16.5)

ベクトル `i は定まった方向を持つが大きさは任意で，行列 A の左固有ベクトル (left eigenvectors) と呼ばれる．なお i が n 重根の場合には，A ; i I は k ; n 次元の多様体になり，この多様体に直交し互いに独立の n 個の左固有ベクトルを取ることができる．式 (16.3) の固有値 1  2  : : :  k のすべてが実数 (重根を含んでも良い) で，式 (16.5) で定義される固有ベクトル `1  `2  : : :  `k が 1 次独立ならば，式 (16.1) は (全)

双曲型 (totally hyperbolic) である．また固有値のすべてが共役複素数ならば，式 (16.1) は楕円型 (elliptic)である．

双曲型微分方程式 (16.1) は初期値問題 (initial value problem, Cauchy problem) として解かれる．初期曲線  = 0 が特性でない場合には，この初期曲線上に任意の初期値 u を与えることができる．またこのとき初期曲線上で式 (16.2) の A  g の値が決まるので，この式から法線微分値 u が求まり，解 u すなわち
積分曲面 (integral surface) を初期曲線のご く近傍に一意的に延長することができる (図 16.1(a)) 4 ．

次に，初期曲線  = 0 が特性の場合には，初期値 u を任意に与えることはできない．それは例えば k = 2の場合に，式 (16.2) はa11 u1  +a12 u2 + g1 = 0a21 u1  +a22 u2 + g2 = 0
n

n;1

1

2

n;2

(manifold)

3 一般に 次元空間で面は次元，線は 次元で， 次元から次元までの部分空間を多様体という．
4 初期曲線のごく近傍に解を延長できれば，初期曲線を延長部分に移し同様に解を延長し，初期値問題を解くことができる．

2 独立変数の双曲型微分方程式のように書くことができ，式 (16.3) から a
11 =a21 = a12 =a22 3となるので，g1 =g2 =になるように初期値 u を与えないと，初期曲線上で微分方程式が成立しなくなる．またこの場合には２つの式が同値になり，方程式の数が足りないので (underdetermined system)，u は一意的に定まらなくなる．つまり初期曲
線  = 0 が特性の場合には，初期値 u は 初期曲線上で微分方程式 (16.2) が破綻しないように与える必要があり，またこの初期値から無数の解曲面を延長することができる (図 16.1(b))．

(a) 初期曲線が特性でない場合(b) 初期曲線が特性の場合

図 16.1: 双曲型微分方程式 ut + aux + c = 0 の初期値問題の解式 (16.5) はまとめて次のように書くことができる．

LA
ただし

;

L=0

(16.6)

は固有値 i の対角行列，また L は左固有ベクトル `i の行列で

0
1
0
1
B
CC
2
B
B
CC 
=B
...
@
A
0

k

0` `
BB`1121 `2212
L=B
B@ ... ...

`k1 `k2

1

`1k
`2k C
CC
.. C
.A

`kk

L の逆行列を L;1 = R と書けば，LR = RL = I ，`i rj = ij ．式 (16.6) から
A=R L(16.7)

R は右固有ベクトル (right eigenvectors)ri の行列で(A i I )ri = 0(16.8);

なお固有値の集合は与えられた A に対して一意的に決まるが，固有ベクトルは任意性を持つから，式 (16.5)と式 (16.8) から独立に求めた `i  ri に対しては一般に RL = I にはならない．

双曲型微分方程式系 (16.1) の左から固有ベクトル `i を演算すれば，すなわち式 (16.1) を構成するすべての式の 1 次結合をベクトル `i の成分を乗じて取れば ，次の方程式が得られる．

`i (ut + i ux) + `i c = 0(i = 1 2 : : :  k)

(16.9)

4

圧縮性流れの解法|１次元 Euler 方程式

ここに微分演算子 @=@t + i @=@x  Di は式 (16.4) の特性曲線の内微分 (interior derivative) で5 ，この式は

1 つの微分演算子 Di だけを含むので常微分方程式である．結局，k 個の式からなる双曲型偏微分方程式系(16.1) は k 個の式からなる常微分方程式系 (16.9) に置き換えることができる．
双曲型微分方程式 (16.1) が線形または半線形6であるとする．式 (16.9) は行列を用いまとめて書けば

Lut + Lux + Lc = 0(16.10a)となる7 ．ここで未知変数ベクトル u の成分の 1 次結合を取った新しい未知変数ベクトル U = Lu を導入す
る．u = RU ut = RUt + Rt U であるから上式は次のようになる．

Ut + Ux + g = 0(16.10b)

ただし g = Lfc +(Rt +Di Ui = gi; ;Rx)U は U の 1 次式である．したがって式 (16.10b) の i 番目の式は
g(gi0 + gi1 U1 + gi2 U2 + + gik Uk )(16.10c)のように書くことができる．これより双曲型微分方程式によって支配される場の性質を次のように説明することができる．式 (16.10c) は i 番目の特性曲線 dx=dt = i に沿って伝播する波の式で，その位相速度は iである．もし gi がゼロならば変数 Ui はこの特性曲線に沿って一定になり，gi がゼロでないときにも，Uiはこの特性曲線に沿って連続に変化する．しかし Ui の初期値に不連続8のあるときには，不連続の両側から始まる特性曲線に沿って Ui のそれぞれの値が伝播するので，i 番目の特性曲線に沿って初期値の不連続も伝播することになる．なおこの特性曲線を横切って Ui の値は不連続になるが，ほかの特性曲線に沿って伝播する Uj の値は不連続にはならない．式 (16.1) が準線形の場合にも同様のことが言える．

16.2

１次元流れの特性の理論

この節では上述の特性の理論を１次元流れの Euler 方程式の初期値問題に適用する．ここでは連続方程式，Euler の運動方程式，エネルギー方程式からなる微分方程式系を Euler 方程式 (the Euler equations) と呼ぶことにする．ある流体の系 (同一流体からなる) に質量，運動量，エネルギーの保存則を適用すれば，最初に導かれる微分方程式は次の保存形 Navier-Stokes 方程式 (the conservative Navier-Stokes equations) である．

@ + u=0@t@ u + ( uu + p ) =  + f@t@e + Huu = ( u)
q +f u@t
ただし は密度，u は流速，p は静圧，e = ( + u2=2) は単位体積当たりの岐点内部エネルギー，H = h + u 2=2
は岐点エンタルピー， は粘性応力テンソル，q は熱流束，f は外力，また T  h = +p= はそれぞれ絶対温度，比内部エネルギー，比エンタルピーである．この方程式系の拡散に関わる項すなわち  と q を含む
r

r

r

D

@=@t  @=@x

r

r

;r

  @=@t @=@xDD  dt dx  @=@t @=@xdxx r dxx+ i= (1 i ) ()．特性曲線の式 (16.4) を用いれば i ()()=． は特性曲線i=に沿うベクトルであるから， i は特性曲線方向の微分であることが分かる．
6 線形はがの関数の場合，半線形 (semilinear) は がの関数で がの関数の場合である．
7 行列演算では交換律= が成立しないことに注意．
8 不連続ないし不連続性 (discontinuities) とは，変数またはその 1 階微分，2 階微分，…が不連続であることをいう．
5A c x t

ab ba

A

x t

c x t u

5

１次元流れの特性の理論項を無視した方程式系が保存形オイラー方程式 (the conservative Euler equations) である．非保存形 Euler
方程式 (the nonconservative Euler equations) は保存形方程式から導かれ，例えば次のように書かれる．

d =
u
dt
duu = p + f
dt
dp = c2 u + f u
dt
ただし d=dt = @=@t + uは実質微分 (substantial derivative) の演算子で流跡線に沿う内微分 (interior
derivative) を表し ，c は音速である．特性の理論はもともと簡潔な非保存形方程式に対して開発されたが，
; r

;r

;

r

r

衝撃波の捕獲には保存形方程式が優れている．読者は，以下に述べる１次元 Euler 方程式への特性の理論の適用において，保存形と非保存形方程式が如何に補完し合うかを知ることであろう．

16.2.1

保存形方程式とヤコビ行列

非定常１次元流れの Euler 方程式 (Euler equations) は保存形で書けば次のようになる．

qt + Fx = 0
ただし

0 1
q=B
@ uCA e(16.11a)

0 u 1
F =B
@ u2 + pCA(16.11b)Huである9 ．q は未知変数ベクトル，F は流束ベクトル (ux vector) である．式 (16.11) はまた次のように線形化 (linearization) することができる．

qt + Aqx = 0(16.12a)

ただし A  @F=@q はヤコビ行列 (Jacobian matrix) である．
ヤコビ 行列 A を求めるには，まず流束 F を q の成分mu e で表すことが必要である．F は q が既知のときに状態方程式 (equations of state) を用い求めることができる．熱力学に関してはここに詳しく述べないが，平衡状態にある気体の状態は，気体の種類が指定されるときに，基本的に粒子 (分子) の数密

度とランダム速度の２つによって決まる．数密度は単位体積当たりの粒子数，ランダム速度は平均流に乗って見た粒子の速度分布である．したがって状態方程式はp = p ( )
T = T ( )のように表すことができるる．熱力学でいう状態量 (properties)  p T  : : : は２つを指定すれば 残りは状態方程式から求められるが，これはすべての状態量が数密度とランダム速度の関数として与えられるこ
9 保存形 (conservative form) とは，対流項が発散形 (divergence form) で表示されているものをいう．保存形方程式と次項の非保存形方程式は数式としてはもちろん等価であるが，数値計算では等価にならないことに注意すべきである．

6

圧縮性流れの解法|１次元 Euler 方程式とをおもえば当然である．いま完全気体 (perfect gas) を仮定すれば上式の関数形は次のように定まる．

p = RTd = cv dT( dh = cp dT )また気体定数 R，定圧比熱 cp ，定積比熱 cv ，比熱比  の間には次の関係があり，２つのみ与えることがで
き残りはこれらの式から決定される．

R = cp cv 

 = cp =cv;

これらの熱力学の式から次の関係が得られる．

p = ~  = ~ e u2 = ~e 2222
H = h + u2 =  e 2 = e + p = c +~ 
ただし ~ =  1 2 = ~ u2=2 c2 = p=  c は音速．これよりヤコビ行列 A は次のように求められる10 ．
2

;

;

;



;



@ u u2 + p Hu@FA = @q =
@
u e


n
2
2o
@ m ~e +(3  ) m m e ~ m

 2

;

=

@

m e



;

2

0
1
0
1
0
B
u2 (3  )u ~ C
CC
=B
(3

)
B
@
2
A
;

;

;

(16.12b)

Hu + 2u H ~u2 u
流束 F は q の成分  m e の 1 次の同次関数である．したがって同次関数 (homogeneous functions) にお;;ける Euler の同次関係 (Euler's homogeneity relation) を適用すれば次式が導かれる11 ．

F = Aq(16.13a)

この関係を用いれば

Fx = Aqx = (Aq)x  Ax q = 0(16.13b)になることが分かる．式 (16.13) のような関係は，F のすべての成分が q の成分の 1 次の同次式のときにのみ成立する．また式 (16.13) が成立することは，ベクトル q に行列 A を掛けることによって確かめることができる．

A の第１列の要素は次のように計算される．
A11 = @ (u)=@ = @m=@; = 0
A21 = @ (u2 + p)=@ =;@ ~e +(3 ;  )m2=2 @ = ;(3 ;  )m2=22 = ;(3 ;  )u2=2
A31 = @ (Hu)=@ = @ (m=)fe ; ~ m2=2g @ = ;em=2 +~ m3 =3 = ; ( + u2=2)u +~ u3 = ;Hu + 2 u
11 関数 u(x  x  : : :  x ) が x  x  : : :  x に関し次の同次関数ならば u(tx1  tx2  : : :  txn ) = t u(x1  x2  : : :  xn ) で
n
n
1 2
1 2
ある．この式を t で微分し t = 1 と置けば，次の Euler の同次関係が導かれる．
x1 ux1 + x2 ux2 +  + xn uxn = u
u は F の 3 成分のどれか１つを取り，x1 =  x2 = m x3 = e = 1 と置いてこの式を適用する．
10

7

１次元流れの特性の理論

16.2.2非保存形への変換

一般に保存形方程式のヤコビ行列は非保存形方程式のものに較べ複雑である．１次元流れの場合にはそれほどでもないが，多次元の一般曲線座標系の場合には違いは顕著である．この項では非保存形オイラー
方程式，保存形オイラー方程式の非保存形への変換，ヤコビ行列 A と A の関係について述べる．かつて

は非保存形方程式が多く用いられ，特性の理論も非保存形方程式に対して論じられてきた．非保存形に関する変数を  を付けて示すことにすれば ，非保存形オイラー方程式は次のようになる．

qt + Aqx = 0(16.14a)ただし

01q = B@uCA 

0uA = B
@0 u

1

0
1= C
A

(16.14b)p
0 c u
また c2 = p=  c は音速である．この場合の行列 A は保存形の A に比べかなり簡単になっている．
保存形方程式を非保存形に変換する行列を N とすれば ，N (qt + Aqx) = qt + Aqx(16.15a)2

これよりdq = N dq A = NAN ;1(16.15b)となる．N = @q =@q の要素は前項のようにして求められ，N とその逆行列 N ;1 は次のようになる．

0 1
N = @q = B
@ u=

1

0 0
1= 0C
A
2

~u ~
ただし ~ =  1 2 = ~u2=2 である12 ．

@q

;

01
N ;1 = B
@u

0

u =2
2

;

1

0
0C
A
u 1=~(16.16);16.2.3固有値，固有ベクト ル，対角化

非保存形オイラー方程式の特性条件は，式 (16.3) より次のようになる．



u 
0 

A I =  0 u  1=  = (u )(u + c )(u c ) = 0
 0
c2 u  
;

j

;

j

;

;

;

; ;

;

固有値はこの  の代数方程式の根で次のように求められる．

1 = u 2 = u + c 3 = u c;

これらの固有値の対角行列0u 0=B@0 u + c
0

12

0

1
0
0 C
A

を次のように置く．

u c;q の成分は q の成分の 1 次の同次式ではないから前項と異なり q = Nq にはならない．

(16.17)

8

圧縮性流れの解法|１次元 Euler 方程式

また左固有ベクトルを求める式は，式 (16.5) より次のようになる．

0u 
i

`i1 `i2 `i3 B
0
u i
@



1

0


1= C
A= 0 0 0

;

;

c

0

u i

2

(i = 1 2 3);

各固有値 i に対する３つの式のうち独立のものは２つである．これらの式を満足する左固有ベクトルの行
列 L とその逆行列 L;1 = R は次のようになる13 ．

01 0
L = B
@0 1
0 1

1

1=c2
1= c CA
1= c;

01 =2cR = B@0 1=2

c=2

0

;

1

=2c
1=2 C
A
c=2

;

(16.18);

前節の式 (16.6) と (16.7) は A に対しても成立し次式が得られる．

LA = LA = R L

(16.19)このように行列 A は L を演算することによって対角行列
また式 (16.15) を用いれば次の関係が得られる．

A = N ;1R LN = R Lにもっていくこと，対角化することができる．

R = N ;1R  L = LN(16.20)式 (16.20) から行列 A と A の固有値は等しいことが分かるが，これは固有値が物理的に -波の位相速度を表すもので，保存形オイラー方程式 (16.11) と非保存形オイラー方程式の (16.14) は同じ波の式であるから当然のことと言える．行列を式 (16.19)，(16.20) のように書き換えることを対角化 (diagonalization) という．

16.2.4適合方程式

ここでは非保存形オイラー方程式 (16.14) に対し 常微分方程式系を導く．１次元流れの場合には，特性(曲線)

dx=dt = i = u u c(16.21)



は流跡線 (path lines) と２つの圧力波 (acoustic waves) を表している (図 16.2)．特性曲線 dx=dt = i 上の常微分方程式は，式 (16.14) の左から行ベクトル `i を掛け，式 (16.18) すなわち `i (A ; i I ) = 0 を用い次のように導かれる．

`i (qt + i qx ) = 0(i = 1 2 3)(16.22)13 固有値  = u に対しては第 1 式は意味のないものになり，第 2 式 ` + c2 ` = 0 から ` = 1 ` = ;1=c2 ，第 3 式
1
11
13
11
13
(1=)`12 = 0 から `12 = 0 となる．前節に述べたように固有ベクトルの大きさは任意であるが，通常 簡単なものが選ばれ，ここでは在来のものに倣った．

固有値 2 = u+c に対しては，第 1 式から `
21 = 0，第 2 式から `22 = 1 `23 = 1=c となる．固有値 3 = u;c に対しても同様

である．

また逆行列

R は，L と単位行列 I の要素を列にするように，1 つの行を 倍する．1 つの行をなった時点で のところが逆行列  になる．

I

R

1 0
0 1
0 1

;1=c2 1 0 0
1=c 0 1 0;1=c 0 0 1のように並べて書き，L のところを単位行

L のところが単位行列に倍したものを他の行に加える．操作を繰り返せば ，

9

１次元流れの特性の理論

この常微分方程式は固有値 i に対する適合方程式 (compatibility relations, | equations) と呼ばれている．
あるいは３つの波の式をまとめて書けば適合方程式は次のようになる．

@w Lqt + Lqx = 0(16.23)
この式で定義される変数 w は特性変数 (characteristic variables) と呼ばれる．式 (16.23) は次のように書く

こともできる．

@1 w1 = D1

1D p=0c2 1@2 w2 = D2 u + 1c D2 p = 0;(１つの流跡線 dx=dt = u に沿って)(16.24a)(１つの圧力波 dx=dt = u + c に沿って)(16.24b)@3 w3 = D3 u 1c D3 p = 0(16.24c)(１つの圧力波 dx=dt = u c に沿って)
ただし Di = @=@t + i @=@x，また @ は @1  @2  @3 の対角行列である．
式 (16.24a) は等エントロピー流れの条件 c2 = dp=d である．すなわち熱力学の法則 Tds = d + p d(1= )= dh (1= )dp，状態方程式の微分 dp=p = d = +dT=T ，音速の定義式 c2 = RT を用いれば，式 (16.24a) は;;;

ds = 0(１つの流跡線 dx=dt = u に沿って)(16.25a)となり14 ，１つの流跡線に沿ってエントロピー s 一定の条件であることが分かる．式 (16.24b) と (16.24c)
は１つの圧力波に沿って積分すればw2 w20 = u u0 +;;w3 w30 = u u0;;;

Z p dp=0(１つの圧力波 dx=dt = u + c に沿って)(16.25b)c =0(１つの圧力波 dx=dt = u c に沿って)(16.25c)

Zpp dpc0

p0;となる．これらの各圧力波に沿って一定になる特性変数 w2  w3 はリーマン変数 (Riemann variables) またはリーマン不変量 (Riemann invariants) と言われる．

ここで一様エントロピー流れ (homentropic ow) を考えれば，圧力波 dx=dt = u  c に沿っても流れは等エントロピーになり，p=  = const: が成立する15 ．この関係を用いればリーマン不変量の式 (16.25b)(16.25c)
流跡線 H
H

J
J

 ; -

J
J
;

圧力波

u

c

-

J

u



J
J

t6
x

-

J
J

J

-

u+c

J

>






@





 (dx dt)

(x t)





圧力波

6

1
?

図 16.2: 流跡線と圧力波
14dp
dp d cv2
ds = T1 dh ; T1 dp = cp dT
T ; R p = cv p ; cp  = p (dp ; c d)
T=;1 = const: T=p(;1)= = const: のような関係も得られる．

15 完全気体の状態方程式を用いれば，

10

圧縮性流れの解法|１次元 Euler 方程式は次のようになる16 ．

w2 = u +  2 1 c = const:(１つの圧力波 dx=dt = u + c に沿って);

w3 = u  2 1 c = const:;(１つの圧力波 dx=dt = u c に沿って);;以上をまとめれば，一様エントロピー流れの仮定のもとでは，オイラー方程式 (16.14) は特性の理論に基づき次のように書き換えることができる．

@s + u @s = 0@t @x @ u + 2c + (u + c) @ u + 2c  = 0@t  1@x  1@ u 2c + (u c) @ u 2c  = 0@t  1@x  1
;

;

;

;

;

;

;

(１つの流跡線 dx=dt = u に沿って)(16.26a)(１つの圧力波 dx=dt = u + c に沿って)(16.26b)(１つの圧力波 dx=dt = u c に沿って)(16.26c);

管内の１次元流れでは，管端の条件は，特性の理論により適正に与えることができる．この境界条件は基本的には外部からその境界に入る特性の特性変数を与えれば良いことになる．流速 u > 0 とすれば
入
出

口
口

超音速
亜音速

w1  w2  w3

超音速
亜音速

w1  w2  w3

w1  w2

w3の値を与えるの値を与え，w3 の値を領域内部の既知の値から計算するの値を領域内部の既知の値から計算するの値を与え，w1  w2 の値を領域内部の既知の値から計算する実用計算では，管端の条件は，外部からその境界に入る特性の数に合わせ，例えば亜音速の場合には，入口境界に流速と岐点密度，出口境界に静圧を与える．また超音速の場合には，入口境界に流速，岐点密度，岐点圧力を与え，出口境界には何も与えないようにする．境界における流れの条件が過不足なく適正に与えられることによってはじめて適正な結果が得られることになる．

16.2.5特性曲線法

特性曲線法 (method of characteristic curves) は，非定常１次元流れまたは２次元超音速流れの双曲型方程式の初期値問題を解くための数値解法である．この方法は，特性の理論に基づくもので，特性曲線と不連
続で格子を作りながら特性変数を求め解を延長していくもので，流れの不連続を忠実に捕らえることができる．しかしながら粘性や温度の拡散を考慮すること，楕円型方程式との共存，多次元への拡張が難しく，
またそのアルゴ リズムはかなり煩雑になるため現在はほとんど 使われていない．ここには，特性の理論の理解の助けに，特性同士の交叉する通常点 (ordinary points) の計算のみを示すことにする．汎用のプログ

ラムを作るには，ほかに界面点 (interface points)，固定，自由，負荷境界点 (edge, free surface and loaded

surface points)，単純，複雑衝撃波点 (simple and complex shock points) を計算に組み込む必要があり，更にはこれらの面と面の干渉，反射，屈折，衝撃波や膨張扇の発生，圧力波からの衝撃波の生成などにも対処できるように，多種多様のサブルーチンを用意しなければならない．なお次章で，各種解法によるリーマン問題の計算結果の比較を行うが，その際に必要な厳密解は解析的に求めることができないので，本稿では
16 等エントロピー流れの式を

p = k と置き，c2 = k;1 なる関係を用いれば

Z p dp Z c p Zp = d = k ( ;1)=2;1 d = 2 k ( ;1)=2 0 = 2 (c ; c0 )
c


;
1
 ;1
p
0

11

１次元流れの特性の理論

特性曲線法で求めている．そのプログラムは，リーマン問題の解，界面点，単純衝撃波点のサブルーチンを含むので，関心のある方はご 覧いただきたい．

通常点の計算は，図 16.3 に示す点 A と点 B の特性変数が既知のときにこれらの点を通る特性曲線の交点 C の位置とその特性変数を求めることである．この計算には式 (16.24) から得られる差分方程式

xC xD u(tC tD ) = 0
C D (1=c2 )(pC pD ) = 0
xC xA (u + c)(tC tA) = 0
uC uA + (1= c)(pC pA) = 0
xC xB (u c)(tC tB ) = 0
uC uB (1= c)(pC pB ) = 0と線分 AB と点 C を通る流跡線の交点 D の位置とその関数値の補間式(tA tB )xD (xA xB )tD = xB tA xA tB
fD = xxB xxD fA + xxD xxA fB
;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

;

B; A

B; A

(16.27a)(16.27b)(16.27c)(16.27d)(16.27e)(16.27f)(16.27g)(16.27h)が用いられる．

図 16.3: 特性曲線法 (通常点)その計算は 2 次精度を確保するために次の予測子修正子法によって行われる．

1.
2.

の付いている量に既知の点 A または点 B の値を用い式 (16.27c) と (16.27e) から点 C 0 の位置 xC  tCの予測値を求める．次に式 (16.27d) と (16.27f) から点 C 0 の流速 uC と静圧 pC の予測値を求める．

の付いている量に既知の点 C 0 の値を用い，式 (16.27a) と (16.27g) から点 D0 の位置 xD  tD の予測値を求める．次に式 (16.27h) により点 D0 の予測値を求める．なお c23.

= p= である．

D  pD の補間値，式 (16.27b) から点 C 0 の密度 C のの付いている量に点 A と C 0 または点 B と C 0 の平均値を用い，手順 1 と同様にして点 C の位置

xC  tC ，流速 uC ，静圧 pC の修正値を求める．
4. の付いている量に点 C 0 と D0 の平均値を用い，手順 2 と同様にして点 D の位置 xD  tD の修正値，その D  pD の値，点 C の密度 C の修正値を求める．
5. 必要に応じ手順 3, 4 の修正値の計算を繰り返す．

12

圧縮性流れの解法|１次元 Euler 方程式

16.3

１次元流れの流束ベクト ル分離法

圧縮性流れの解法において，２つの圧力波とエントロピー波の各伝播方向によって流束を分離し，正しく上流化する流束分離法はいくつか提案されている．本節には流束ベクトルそのものを分離する Steger-Warmingの流束ベクトル分離法について述べる．その初期の論文では，流れが亜音速から超音速に変わる音速点で解が振れるという不具合が見られたが ，これはこの方法の本質的欠陥によるものではなく適用上の問題である．亜音速から超音速にスムースに移行させこの不具合を除く方法は，数値的拡散を過度に生じさせることになる．ここではまず流束ベクトル分離法とそのオイラー方程式の初期値問題への適用について述べ，
それから音速点における振れの原因を探り，それを除く対策について述べる．

16.3.1 Steger-Warming の流束ベクト ル分離法
流束ベクトル分離法 (ux vector splitting) は流束ベクトルそのものを特性速度の符号によって分離する
ものである．

F = F+ + F;F  = A q = R  L q (= N ;1R LNq)(16.28a)(16.28b)

ただし N は 16.2.2 に述べた保存形を非保存形に変換する行列，L はそれを更に対角行列に変換する行列，
また R = L ;1 である．

0 0
1
=B
@ 0 200

 は正または負の固有値のみからなる行列で

1

0
0C
A

(16.29)
3

ただし

k = (kjk )=21 = u 2 = u + c 3 = u cj;である．左固有ベクトルの行列 L = LN は

0
1
~u
~
0 1 B 1 ~u22`1
BB u  2c~u  1  c2 ~u  ~c2 CCC
B
C
CC
L=B
1 c
@`2CA = BBB 1 2cc
@ u  ~u  1  ~u  ~ CA
`3
;

;

;

;

;

;

1+ 2c

1+ c

;

また右固有ベクトルの行列 R = N ;1R は

01
 1 2 3  BBB
R= r r r =Bu
@ u2
2

となる．

2c
2c (u + c)

2c (H + cu)(16.30)

c

1
2c C
CC
2c (u c) C
A
;

;

;

;

2c (H cu);

(16.31)13

１次元流れの流束ベクトル分離法
特性変数 w = Lq は次のように求められる17 ．

0w 1 0 ~= 1
1
w=B@w2CA = B@ c= CA
w3

c=
またこれより分離流束 F  = R  w は次のように求められる．
0 w 11 1
XF  = r1 r2 r3 B
@2 w2CA = k wk rkk3 w3(16.32);(16.33a)あるいは次のようにも表わされる．

011
0 1 1
0 1 1
F =  1 B@ u CA1 + 2B@ u + c CA2 + 2B@ u c CA3;u =2

H + cu2;

H cu(16.33b);

これは 1981 年頃に Steger と Warming 18によって提案された流束ベクトル分離法の式である．すなわち非定常 1 次元流れの保存形 Euler 方程式の場合の，特性速度の符号によって分離された流束ベクトルの式である．

16.3.2１次元オイラー方程式の初期値問題

ここでオイラー方程式 (16.11) の初期値問題を考える．１次元オイラー方程式は，梯形則 (trapezoidal law)を適用すれば次のように書き換えられる．

qn+1 qn + (1 )F n + F n+1 = 0(16.34)xx
t = 0 ならば 陽解法 (explicit methods)  > 0 ならば 陰解法 (implicit methods) で， = 1=2 は CrankNicholson 法， = 1 は完全陰解法である．また時間に関する精度は  = 1=2 のときにのみ 2 次で  = 1=2;;

6のときは 1 次である．周知のように，陽解法の式は容易に解くことができるが，不安定性のため時間間隔

t の大きさが厳しく制限される．他方 陰解法の式は安定性は良いが，直接解こうとすると大きな連立 1 次方程式を解くことになり，最近は  形陰解法で反復計算されるようになっている．

 形陰解法 (delta-form implicit methods) の式は次のように書かれる．

@ Aqn = tF n
I + t  @xx
qn+1 = qn + qn;

この式は，式 (16.34) の F n+1 = F (q n+1) に Taylor 展開 F (q n+1) = F (q n)+ Fq (q n)q n ++17(16.35)= F n + Anqnを代入することによって容易に導くことができる．左辺の微分演算子 @=@x は A だけでなく q n にも

p=c2 = = ，p=c = c= を用いる．なお計算の順序を変えれば中間段階で
01
w = L Nq = L @0A
pとなり心もとないが，結果は勿論同じで，計算はこの方が簡単である．

18 Steger, J. L. and Warming, R. F., Flux vector splitting of the inviscid gas-dynamic equations with application to nitedierence methods, J. Comput. Phys., 40 (1981), 263{293.

14

圧縮性流れの解法|１次元 Euler 方程式

作用していることに注意しなければならない．この式は通常 定常流れの解法に用いられる．そのとき右辺は元の方程式 (16.11) の残差，左辺の q n は修正値を表している．したがって，右辺の差分式は解の精度と解像度に直接関わるので十分吟味して選ばなければならないが ，左辺の演算子は精度には無関係で，通常 安定で簡単な 1 次上流差分が用いられる．定常解は時間の十分経過した時点における収束解として求められる．解が収束に近付けば ，左辺の残差値はゼロに近付き，当然修正値 q n もゼロに近付く．

次に非定常流れの初期値問題を考える．上の式 (16.35) は非定常流れに用いることもできる．しかしながら非定常流れの場合には，左辺の差分演算子も右辺と同精度のものを用いなければならないので，解くべき連立 1 次方程式の係数行列が大きくなり計算量も増大する．また時間に関する精度を確保するためには

時間ステップ t をあまり大きく取ることができないので計算量は一層増大することになる．これに対し ，別の  形陰解法の式を用い各時間ステップごとに反復計算する方法もある．式 (16.34) は Crank-Nicholson法では次のようになる．

qn+1 qn = 21 t(Fxn + Fxn+1);(16.36);

時間ステップ n までの未知変数ベクトル q の値が既知のときに，時間ステップ n +1 の q n+1 の値はこの式

から反復法で求めることができる．q (n+1) の第 (m) 近似値 q (m) を求める式はq(m) qn = 12 t(Fxn + Fx(m) );;となる．第 (m ; 1) 近似値 q (m;1) が既知のときに q (m) を求める式は，上式に q (m) = q (m;1) + q (m) とTaylor 展開 F (m) = F (m;1) + Fq(m;1)q(m) += F (m;1) + A(m;1)q(m) + Fq = @F=@q = A を代入した式

n@ (A(m;1)q(m) )oq(m;1) + q(m) qn = 21 t Fxn + Fx(m;1) + @x;;

を書換えることによって導かれる．すなわち 1 次元オイラー方程式の非定常流れの  形陰解法の式は次のようになる．

@ Aq(m) = (q(m;1) qn) 1 t;F n + F (m;1)
I + t  @xx x
2
q(m) = q(m;1) + q(m)



;

;

;

(16.37)

この式は時間ステップ n+1 の q n+1 の値を反復法で求める際に，その第 (m;1) 近似値が既に求められているときに第 (m) 近似値を計算する式である．その第 1 近似計算では q (0) = q n  F (0) = F n となるので，
上式は式 (16.35) と同じになる．この非定常流れの各時間ステップごとの計算は，通常少ない反復回数で十分に収束する．この  形陰解法の式でも，右辺は高精度高解像差分式を用いなければならないが，左辺は1 次上流差分で十分である．解が収束に近付けば，左辺は Crank ― Nicholson 法の式 (16.36) のものに近付
き，この式の残差値はゼロに近付き，修正値 q (m) もゼロに近付く．この解法で解くべき連立 1 次方程式の係数行列は定常流れの場合と同じ大きさになり，また時間に関し 2 次精度が確保され時間ステップ t をある程度大きく取れるので，各時間ステップごとに計算を反復しても全体の計算時間は式 (16.35) で非定常流れを計算する場合に比べ十分短かくなる．非定常流れの計算にはこのような  形陰解法の式を用いる反復法が推奨される．

ここで保存形スキーム (conservative scheme)

1 (h(fx)i = xi+1=2 hi;1=2 );(16.38)15

１次元流れの流束ベクトル分離法を考える．ただし hi+1=2 は数値流束 (numerical ux) と呼ばれるもので，1 次上流差分の場合には波の位相
速度 i+1=2 の符号にしたがって後退差分または前進差分が取られ(

hi+1=2 = fi
fi+1

(i+1=2 0)(i+1=2 < 0)(16.39)

また例えばレナード の 2 次の QUICK スキーム19 では点 xi+1=2 から見て上流側にややシフトし た３点(xi;1  xi  xi+1 または xi  xi+1  xi+2 ) の f の値から 2 次補間によって求められ(

hi+1=2 = (;fi;1 +6fi +3fi+1)=8( 3fi + 6fi+1 ; fi+2 )=8(i+1=2 0)(i+1=2 < 0)(16.40)となる．

ここではオイラーの時間差分方程式 (16.34) を陽解法 ( = 0) で解くことにする．流束分離法ではこの式の中の流束の微分 Fx は次のように差分近似される．

1 (r F + + F ; )(Fx )i = xx i
x i

(16.41)r は後退差分， は前進差分の演算子を取り

ただし 1 次上流差分では，

rx Fi = Fi ; Fi;1 x Fi = Fi+1 ; Fiとなる．また QUICK スキームでは，差分演算子の定義を拡大解釈すれば ，

rx Fi = Fi;2 ; 7Fi;1 + 3Fi + 3Fi+1 x Fi = ;3Fi;1 ; 3Fi +7Fi+1 ; Fi+2となる．流束ベクトルの式 (16.33b) を用いれば ，初期値問題として解くべき式は，1 次上流差分では



X
X
X
X
qin+1 = qin ; t (+k wk rk )i ; (+k wk rk )i;1 + (;k wk rk )i+1 ; (;k wk rk )i
k
k
k
k



また QUICK スキームでは



X
X
X
X
qin+1 = qin ; t (+k wk rk )i;2 ; 7 (+k wk rk )i;1 +3 (+k wk rk )i +3 (+k wk rk )i+1
k
k
k
k
X ; k
X ; k
X ; k
X ; k ;3 (k wk r )i;1 ; 3 (k wk r )i + 7 (k wk r )i+1 ; (k wk r )i+2kkkkとなる．周知のように，1 次上流差分は安定であるが数値粘性大きく精度不足で，他方 QUICK スキームは3 次に近い 2 次精度を持つが不連続のところで Gibbs 現象を起こし人工粘性の付加が必要である．ほかの 2
次以上のスキームについても同様のことがいえる．なお人工粘性の付加については多くの提案がなされてきたが，今日の TVD，ENO などのスキームと比べ，本質的に劣り推奨できるものはないのでここでは省略する．

19 Leonard, B. P., A stable and accurate convective modelling procedure based on quadratic upstream interpolation.
Computer Meth. Appl. Meth. Engng., 19 (1979), 59{98.

16

圧縮性流れの解法|１次元 Euler 方程式

16.3.3

音速点における振れとその対策

この項では，上記のスキームを用いて計算したときに生じる，音速点 (sonic point) 近傍における解の振れについてまずその原因を探る．今 流速 u > 0 とし，区間 x0  x1=2 ] に音速点 x があるものとする．1 = uと 2 = u+c の符号は音速点を越えて変わらないが 3 = u;c の符号は変わる．したがってここでは流束の第 3 成分 f 3  3 w3 r3 についてのみ検討する．以下しばらく添字 `3' を省略する．まず 1 次上流差分で計算+ = f + = f ; = f ; =    = 0 となるので，次の音速点の隣りの 2 点の差分式が通する場合には，   = f;1012
常のものと異なることになる．

(fx)0 = (f0+ ; f;+1)=x +(f1; ; f0;)=x = ;f0 =x(fx)1 =
= f1 =x
これらの式の打ち切り誤差は Taylor 展開を基に評価すれば O(x0 ) になる．

また 2 次の QUICK スキームで計算する場合には，次の音速点近傍の 4 点の差分式が通常のものと異なることになる．

(fx);1 = (;3f;2 ; 3f;1 +7f0)=8x(fx)0 = (;3f;1 ; 3f0 + 3f1)=8x(fx)1 = (;3f0 + 3f1 + 3f2)=8x(fx)2 = (;7f1 + 3f2 + 3f3)=8x
これらの式の打ち切り誤差も O(x0 ) で 20 ，完全に破綻していることが分かる．Steger-Warming の流束ベ
クトル分離法で計算した結果が音速点近傍で不自然に振れるのはこの差分式の破綻による．

次にこのような差分式の破綻を回避する対策について述べる．上記の保存形スキームの式 (16.38) における数値流束 hi+1=2 は，中間点の特性速度 i+1=2 =

fi+1=2  ji+1=2 jg=2，ただし i+1=2 = (i + i+1 )=2，を用い次のように置くことができる．

1 次上流差分：

hi+1=2 = +i+1=2 (wr)i + ;i+1=2 (wr)i+1
2 次 QUICK スキーム：
hi+1=2 = +i+1=2 81 ; (wr)i;1 +6(wr)i +3(wr)i+1
+ ;i+1=2 18 3(wr)i + 6(wr)i+1 ; (wr)i+2(16.42)QUICK スキームの精度を Taylor 展開を基に評価すれば，
1 nf ; 2 xf + 1 (2 x)2 f ; 1 (2 x)3 f +     ; 7f ; xf + 1 ( x)2 f ; 1 ( x)3 f +    
8 x
2!
3!
2!
3!
o

+ 3f + 3 f + xf + 2!1 ( x)2 f + 3!1 ( x)3 f +  
= fi + 4 13! ( x)2 fi +   となり，このスキームは打切り誤差 O( x2 ) で 2 次精度であることがわかる．次に上式の例えば第 3 式の誤差を評価する．この場合には音速点 x で f = 0 という特別の条件があるので，(x1 ; x )= x =  と置き，まず点 x 周りの Taylor 展開をこの式に代入す
20 まず

0

00

0

0

000

00

0

00

000

000

000







ることにすれば， ; ; 6+3
3 ; 21  ;8 x ; 3 ( ; 1) xf +   + 3  xf +   + 3 ( +1) xf +    = 8 f +   = f1 + 8 f1 +   となり，打ち切り誤差は O( x0 ) になる．
0

0

0

0

0

0

１次元流れの流束ベクトル分離法

17

これらの式は流束成分 hi+1=2 を特性速度の符号によって上下いずれかの式によって計算するものである．

   = +3=2 = +;1=2 = ;1=2 = ;3=2 =    = 0

音速点が上記のように区間 x0  x1=2 ] にあるものとすれば ，となり，(fx )i の差分式は唯一 点 x0 のものが通常のものと異なることになる．

1 次上流差分：

1  (wr) ;  (wr) (fx)0 = x
0
0
1=2
;1=2

2 次 QUICK スキーム：
1 h ; (wr) +6(wr) +3(wr) (fx)0 = 8x
;1
0
1
1=2

i
; ;1=2 3(wr);1 +6(wr)0 ; (wr)1
1 次上流差分の式は一見してだめであるが，QUICK スキームの方は使えるかど うか分からないので，Taylor
展開を基に評価することにする．wr = u と置き，これらの変数の点 x0 まわりの Taylor 展開を上式に代入すれば

1  (;u +6u +3u ) ;  (3u +6u ; u )1
8x hn1=2 ;1 0 1 ;1=2 ;1 0 o23
1  + x 0 + 1 x 00 + 1 x 000 +    8u +4xu0 +2 1 x2 u00 +4 1 x3 u000 +   = 8x
22!  23!  2
2!
3!
n x
o
i
2
3
1
x
1
x
1
;  ; 2 0 + 2! 2 00 ; 3! 2 000 +    8u ; 4xu0 +2 2! x2 u00 ; 4 3!1 x3 u000 +   ;= (u)0 + 18 ; 43 u000 + 0 u00 ; 00 u0 + 61 000 u x2 +    = (fx )0 + O(x2 )のようになる．これより流束の式 (16.42) を用いれば QUICK スキームは音速点のところでも 2 次精度を保つことが分かる．式 (16.42) はもちろん流束成分 f 1  f 2 に対しても成立する．したがって Steger-Warmingの流束ベクトル分離法は，例えば QUICK スキームを少し修正した次式を用いることによって，音速点のところでも適正な結果の得られるものに変えることができる．

1 ;H(Fx )i = xi+1=2 ; Hi;1=2

Hi+1=2 =

+

X + 

(k )i+1=2 ; (wk rk )i;1 +6(wk rk )i +3(wk rk )i+1 =8
k
X


;
k
k
k
k

(16.43)(k )i+1=2 3(wk r )i + 6(wk r )i+1 ; (wk r )i+2 =8

2 次上流差分や，2 次の上流差分と中心差分の 1 次結合を取った Chakravarthy-Osher 型スキームも，音速点のところで上記のように処理すれば ，2 次精度を保たせることができ，また解の振れも防止できる．

18

圧縮性流れの解法|１次元 Euler 方程式

16.4

１次元流れの流束差分分離法

本節では始めに，簡単なスカラー輸送方程式の初期値問題の 1 次上流差分スキームに関して，TVD，TVD

スキーム，エントロピー条件などを一通り説明する．次に Chakravarthy-Osher TVD スキームについて述
べる．流束差分分離法は，波の位相速度の符号によって異なる流束の差分の式を用いるものである．まずス
カラー輸送方程式に対しこのスキームの TVD 条件を明確にし，次にオイラー方程式に対し分離された流束差分を示しこのスキームの  形陰解法への適用について述べる．

16.4.1

TVD スキームとは

ここではまず簡単なスカラー輸送方程式の初期値問題に対して TVD の概念を説明する．スカラー量 u(x t)の輸送方程式は次のように表される．

@u + @f = 0@t @x
ただし f は u のみの関数である．式 (16.44) は線形化すれば次のようになる．

(16.44)

ut + aux = 0(16.45)

ただし a(u) = @f=@u．なお式 (16.45) は (@=@t + a@=@x)u = 0 のようにも書くことができ，微分演算子@=@t+a@=@x は xt 面上の特性曲線 dx=dt = a に沿う内微分で，したがって式 (16.45) は 1 つの微分演算子のみを含み，常微分方程式である．式 (16.45) はまた解 u(x t) の値が各特性に沿って一定になることを示している．したがってこの初期値問題では，一般に u の最大値最小値は時間によらず一定になり，またZTV  jux jdx(16.46)で定義される総変化量 (total variation)TV も時間によらず一定になる．

しかしながら図 16.4 に示すように不連続が存在し ，そこに特性曲線が吸込まれ，最大値が減少，最小値が増加するときには，TV は時間と共に減少する21 ．なお逆に不連続から特性曲線が吐出され，TV が時間

図 16.4: xtu 空間内の積分曲面上の特性と不連続uu

21 積分の範囲は１つの特性曲線から別の特性曲線まで取る．図の場合には，左側の特性の値
a ，右側特性 b ，極小特性= min a + 0 min + b 1 となる．
連続の左側の特性の値 0 ，その右側の特性 1 とすれば，

u

u

TV ju

; u j ju ; uj ju ; u jumin ，不１次元流れの流束差分分離法

19

と共に増加することは，後に述べるようにエントロピー条件により物理的に起こり得ない．すなわち TV は
時間と共に増加することはない，TVD(total variation diminishing) である．式 (16.46) で定義される TV

は離散近似後には

TV 

X
i

jui+1 ; uij(16.47)となる．また TVD 条件は 22

TV (un+1 )  TV (un )(16.48)nとなる．ただし un
i = u(xi  t ) である．この条件のもとでは解は，最大値が更に増加，最小値が更に減少することは許されず，また新たに極値の発生する余地もなく，解の単調性は保たれる．TVD スキームと呼ばれるものは，それを使って求めた解が条件式 (16.48) を満足することを保証するもので，その解は当然安定になる．

式 (16.44) の離散スキームは一般に保存形で次のように書くことができる．

uni +1 = uni ; (hi+1=2 ; hi;1=2)(16.49)ただし  = t=x，また h は数値流束関数 (numerical ux function) あるいはたんに数値流束と呼ばれるものである．不連続を捕獲する際には，ここで保存性が保たれるように保存性スキームを用いなければならな

い．式 (16.44) の解曲面 u = u(x t) 上には 1 パラメータ族の特性 (one parameter family of characteristics)

dx=dt = a が存在する23 ．1 次精度のスキームでは区間 xi  xi+1 ] を通過する特性を図 16.5(a) に示すように
点 xi+1=2 に集め不連続として扱うことができる．このとき数値流束は次のように表される．
hi+1=2 = fi +Z u +1iuZihi+1=2 = fi+1 +uia; (u)du = fi + a;i+1=2 ui+1=2(16.50a)a+ (u)du = fi+1 ; a+i+1=2ui+1=2(16.50b)ui+1

図 16.5: 特性と等価な不連続Harten, A., High resolution schemes for hyperbolic conservation laws, J. Comput. Phys., 49(1983), 357{393.
(16.44) は解 u(x t) の勾配 ru = (ux  ut ) とベクトル a  (a 1) が直交し スカラー積が 0 になることを示している．微分演算子 d=dt = a r は a 方向の微分で，u をこの方向に微分したときに 0 ということは，u が a 方向に一定ということである．曲線 u(x t) = const.  c を特性曲線という．曲線 u(x t) = c + c も曲線 u(x t) = c にほぼ平行な特性曲線である．c の値を22
23 微分方程式

次々に変えれば

c を１つのパラメータとする特性曲線族が得られる．

20

圧縮性流れの解法|１次元 Euler 方程式

ただし ui+1=2 = ui+1(

; ui a = (a  jaj)=2

ai+1=2 = (fi+1 ; fi )=ui+1=2 (ui+1=2 6= 0)a(ui )(ui+1=2 = 0)

(16.51)

1 次元オイラー方程式の場合には，3 組の 1 パラメータ族の特性 (流跡線と２つの圧力波，dx=dt = u u  c)が存在する．この場合にも 1 次精度のスキームでは区間 xi  xi+1 ] を通過する特性を図 16.5(b) に示すように点 xi+1=2 に集め不連続として扱うことができる．このような双曲型方程式では，数値流束 hi+1=2 は区間

xi  xi+1 ] を通るすべての特性の上流側に取られる．なお右側の不連続の図において f の値は不連続の間とその両側の各領域においてそれぞれ一定になり，f の１つの不連続を横切っての跳躍量はその不連続に沿ってそのまま伝播することになる．

式 (16.50) の 2 つの式は等価であるが Engquist-Osher スキーム24 では，対称性を持たせるために，これらの式の平均が取られる．

EO = 1 (fi + fi+1 ) ; 1
hi+1
=2 2
2

Z u +1iui

ja(u)jdu(16.52)

また Roe スキーム25 ではこれらの式を差分表示したものの平均が取られる．

Roe = 1 (fi + fi+1 ) ; 1 jai+1=2 jui+1=2
hi+1
=2 2
2

(16.53)

uni +1 = uni ; (a+i;1=2 ui;1=2 + a;i+1=2ui+1=2 )(16.54)式 (16.49) に式 (16.50) の数値流束を用いれば次の差分方程式が得られる．

この式は a が正ならば後退差分，負ならば前進差分になり，1 次上流差分スキームである．
式 (16.54) の安定性をノイマンの方法で調べれば，増幅率がpr = 1 ;jC j(1 ; coskx) ; ;1 C sinkxとなり，クーラン数 C = at=x の大きさが 1 よりも小ならば安定であることが分かる．次に式 (16.54) のTVD 安定性を式 (16.54) の TV を取って調べる．signu = S と置けば，Si+1=2 (ui+1 ;ui ) = jui+1 ;ui j であるからTV (un+1 ) ; TV (un )X= ; Si+1=2 ; a+i;1=2 ui;1=2 +(a+i+1==2 ; a;i+1=2 )ui+1=2 + a;i+3=2 ui+3=2
= ;

Xi 
i



(Si+1=2 ; Si+3=2 )a+i+1=2 +(Si;1=2 ; Si+1=2)a;i+1=2 ui+1=2

a+i+1=2 の係数は ui+1=2 と ui+3=2 が同符号ならば 0，異符号ならば 負，また a;i+1=2 の係数についても同様のことが言える．したがって上式の値は 0 または負になり，式 (16.54) は式 (16.48) の条件を満足する

TVD スキームであることが分かる．

24 Engquist, B. and Osher, S., Stable and entropy satisfying approximations for transonic ow calculations. Math. Comput., 34(1980), 45{75.
Engquist, B. and Osher, S., One-sided dierence approximations for nonlinear conservation laws. Math. Comput., 36(1981),
321{52.
25 Roe, P. L., The use of Riemann problem in nte dierence schemes. Lecture Notes in Physics, Vol.141, (1981), 354{9,Berlin, Springer-Verlag.
Roe, P. L., Approximate Riemann solvers, parameter vectors and dierence schemes. J. Comp. Phys., 43(1981), 357{72.

21

１次元流れの流束差分分離法
式 (16.44) は梯形則を用い保存形差分方程式に書換えれば次のようになる．

uni +1 + (hj+1=2 ; hi;1=2)n+1 = uni ; (1 ; )(hi+1=2 ; hi;1=2 )n(16.55)式 (16.55) に式 (16.50) の数値流束を用いれば次の差分方程式が得られる．

uni +1 + (a+i;1=2 ui;1=2 + a;i+1=2 ui+1=2 )n+1
= uni ; (1 ; )(a+i;1=2ui;1=2 + a;i+1=2 ui+1=2 )n(16.56)

ここで式 (16.56) の右辺の TV を取れば

X

TV (rhs) =i

f1 ; (1 ; )jai+1=2jgui+1=2 +(1 ; )(a+i;1=2ui;1=2 ; a;i+3=2 ui+3=2 )n

したがって，もしa;  0

a+ 0
ならばTV (rhs) =(1 ; )jaj  1(16.57)

X
Xi
i



f1 ; (1 ; )jai+1=2jgjui+1=2 j +(1 ; )(a+i;1=2jui;1=2 j; a;i+3=2 jui+3=2 j) njuni+1=2 j = TV (un )次に式 (16.56) の左辺の TV を取れば ，同様にして TV (lhs)

TV (un+1 ) なる関係が得られる．以上をまとめれば ，1 次上流差分の式 (16.56) は，クーランの条件に相当の条件式 (16.57) のもとでTV (un+1 )  TV (lhs) = TV (rhs)  TV (un )となり，式 (16.48) の TVD 条件を満足する TVD スキームであることが分かる．式 (16.57) の第 1 式と第 2jj

式は常に満足されるもので，第 3 式はクーラン数 a t=x または時間間隔 t の大きさを制限する条件である．なお  = 1 の完全陰解法では，式 (16.56) はクーラン数によらず TVD 安定である．

ここで一言付け加えれば，TVD 条件 (16.48) は同次方程式 (16.44) に対して成立するものである．非同次Rt

方程式 du=dt = g の場合には，この方程式を一つの特性 dx=dt = a に沿って積分すれば，u = u0 + t0 g dt になることからも明らかなように，u の値は特性に沿って一定にはならず，当然 TVD 条件も成立しない．１次元オイラー方程式の場合には，特性の理論によって同次の常微分方程式の系に置換えることができ，各式に対し TVD 条件が成立する．しかし多次元の場合には，たとえ もとの方程式が同次であっても，因子化で得られた１次元の方程式は同次でないので TVD 条件は成立しない．TVD 条件が成立しない場合でも，特性の理論によって常微分方程式の系に置換え，流束分離し，TVD スキームを用いれば安定に解を求めることができる．なお TVD スキームで TVD 条件が適用される量は，式 (16.44) の u に相当するエントロピー，
リーマン不変量，スカラー量などで，その他の量は間接的に制限されるに過ぎない．またこれらの量も非同次の場合には右辺の時間積分が加算され増減することになる．

22

圧縮性流れの解法|１次元 Euler 方程式

図 16.6: エンタルピー−エントロピー線図上の基本的プロセス曲線

16.4.2 エント ロピー条件とは衝撃波のところでは質量，運動量，エネルギーの保存則により，１次元流れでは次の Rankine-Hugoniotの関係が成立する．

 u ];C ] = 0
 u2 + p ] ; C  u ] = 0 (e + p)u ] ; C  e ] = 0
ただし C は衝撃波の伝播速度， f ] = f1

(16.58a)(16.58b)(16.58c);f0 は衝撃波を横切っての f の跳躍量である．衝撃波は式 (16.58)を満足する２つの異なる状態の間で，エントロピー s の増大する方向に起きる．

ここで定常１次元流れの３つの基本的な流れ，管断面積の変化する等エントロピー流れ，管断面積一定で摩擦の作用する流れ，管断面積一定で加熱冷却のある流れを考える．図 16.6 はこれらの流れのプロセスをエンタルピー−エントロピー線図上に表したものである．図の点 0 は超音速の状態にある．等エントロピー

流れの場合には，この点は収縮拡大ノズルの下流側の点に相当し ，この流れは h 軸に平行な線で表される．
スロート部で M = 1，この線の上限は岐点状態 M = 0 である．一般に亜音速では断面積の増減によってマッハ数は減少または増加し，一方超音速では断面積の増減によってマッハ数も増加または減少する．摩擦の作用する流れは Fanno 線で示され，流れと共にエントロピーは増大する．また亜音速ではマッハ数が増
加，圧力が降下，逆に超音速ではマッハ数が減少，圧力が上昇する．加熱冷却のある流れは Rayleigh 線で示され，加熱冷却によってエントロピーは増加または減少する．その高亜音速域には加熱時に温度が低下す
るけったいなところあるんやで．ほんまかいな！Fanno 線と Rayleigh 線のエントロピー極大点は，チョーキング (choking) を起こしている長大管または加熱管の出口で，ここで M = 1 である．

図 16.6 の点 0 が衝撃波の超音速側の状態とすれば ，点 0 を通る Fanno 線と Rayleigh 線の亜音速域における交点 1 はこの衝撃波の亜音速側の状態になる．なぜならば，Fanno 線上ではエネルギーが保存され，一方 Rayleigh 線上では運動量が保存され，またこれらの線上では質量も保存されるので，点 0 と点 1 の諸量

は Rankine-Hugoniot の関係を満足する．なお点 1 のエントロピーは点 0 のものよりも大きく，点 0 から点

1 に向かう圧縮衝撃波は起きるが，点 1 から点 0 に向かう膨張衝撃波は物理的に起こり得ないことになる．

23

１次元流れの流束差分分離法

図の縦軸は比エンタルピー h と同時に絶対温度 T ，比内部エネルギー ，音速 c2 を表わすもので，また静圧 p は，右下から左上に上昇し，その等高線の一部が破線で示されている．実在の気体では衝撃波を横切っ]  p ] は増加し ，また式 (16.58a) により  ju ; C j ] は減少する．１次元流れでは，
前述のように 3 組の特性曲線族 dx=dt = u u  c が存在するが，衝撃波はその内の１つの圧力波によって起て跳躍量  h ]  T ]  c ] 
きる．

簡単のためまず定在衝撃波 C = 0 を考える．衝撃波を横切って状態は 0 から 1 に変化するものとする．

j j j j

連続の条件から u0 と u1 は同符号で，またエントロピー増大の法則から上記のように c0 < c1 ， u0 > u1

である．圧力波が u+c か u;c か，また流れの方向が u > 0 か u < 0 かの 4 通りの場合が考えられるが，衝撃波を起こすのは次の２つである．

( a )  = u ; c u > 0( b )  = u + c u < 0( a ) の場合には u0 > u1 > 0 で，u0 ; c0 > u1 ; c1 となるが，状態 0 が超音速，状態 1 が亜音速であるから u0 ; c0 > 0 > u1 ; c1 なる関係が導かれる．同様に ( b ) の場合には u0 < u1 < 0，u0 + c0 < u1 + c1 で，
u1 + c1 > 0 > u0 + c0 なる関係が導かれる．残りの  = u + c u > 0 の場合は，u0 + c0  u1 + c1 > 0，また
 = u ; c u < 0 の場合は，u0 ; c0  u1 ; c1 < 0 となり，これらの圧力波は衝撃波を正または負の方向に通過する波であることが分かる．

6; C と u1 ; C が同符号，またエントロピー増大の法則から
c0 < c1 ，ju0 ;C j > ju1 ;C j となる．移動衝撃波の場合にも衝撃波から見れば同じ関係が成立つので，定在衝撃波の場合の u を u;C と読みかえれば良いことになる．u+c か u;c か，また u;C > 0 か u;C < 0 かの 4 通りの場合が考えられるが，衝撃波を起こすのは  = u ; c u ; C > 0 と  = u + c u ; C < 0 の２つ
移動衝撃波 C = 0 では，連続の条件から u0

で，それぞれに対し

u0 ; c0 > C > u1 ; c1 
u1 + c1 > C > u0 + c0
なる関係が導かれる．衝撃波の左右の圧力波の位相速度を aL  aR とすれば，上の２つの式はまとめて次のように書くことができる．

aL > C > aR

(16.59)この式はエントロピー条件と呼ばれ，衝撃波にその左右の圧力波が吸込まれることを表している．常にこのようになると言うことは不連続からその左右に圧力波が吐出される膨張衝撃波の存在を否定するものである．

逆に，保存の関係 (16.58) を満足する不連続で，エントロピー条件 (16.59) が満足されれば，この不連続を横切ってエントロピーの増大することが証明される．実在気体で保存の関係が成立すれば，跳躍量  c ] 

] : : :j ; C j ] とは異符号を取る．ここでも簡単のためまず定在衝撃波 C = 0 を考える．
エントロピー条件は２つあるが u0 ; c0 > 0 > u1 ; c1 に対しては u > 0 で，次の 3 通りの可能性がある．

は同符号を取り，また  u( a ) u0 > u1 and c0 < c1( b ) u0 > u1 and c0 > c1
( c ) u0 < u1 and c0 < c1
しかしながら ( b ) と ( c ) は  c ] と  u ] が同符号で保存の関係を満足しないので，( a ) だけが起こり得ることになり，この不連続を横切って音速が増加し ，図 16.6 からも明らかなように，保存の関係を満足する不24

圧縮性流れの解法|１次元 Euler 方程式

6;C と読みかえれば，; c0 > C > u1 ; c1 に対して u0 ; C > u1 ; C かつ c0 < c1 だけが起こり得ることにな

連続ではエントロピーも増加することになる．移動衝撃波 C = 0 では，上記の u を u

エントロピー条件 u0

り，音速が増加，保存の関係を満足する不連続ではエントロピーも増加することになる．もうひとつのエントロピー条件についても同様のことが言える．

この項ではこれから先，Osher の E スキームとは，E スキームでない 1 次上流差分は音速点でエントロ

ピー条件を満足しなくなること，またその対策について一通り述べる．これらの 2 次以上の TVD スキームとの関わりについては場合による．はじめに 1 次精度の TVD 単調スキームである 1 次上流差分の性質を考察する．流束関数 f (u) が凸関数 fuu > 0 で，fu = a > 0 の膨張波を考える．膨張波では，xt 面上の特性曲線が時間と共に開くことからも分かるように a0 < a1 である．a > 0 のところでは数値流束 h1=2 = f0

で，また図 16.7 に示す f; u 線図からも明らかなように，u1=2 = u1 ;u0 > 0 で，u0 と u1 の間の任意のu に対し h1=2 < f (u) である．他の場合もまとめて書けば次のようになる．

(

fuu > 0 : u1=2 > 0 h1=2 < f (u)f < 0 : u1=2 < 0 h1=2 > f (u)( uu
fuu > 0 : u1=2 < 0 h1=2 > f (u)圧縮波fuu < 0 : u1=2 > 0 h1=2 < f (u)膨張波

これより 1 次上流差分スキームに関し次の関係が得られる．

h1=2 ; f (u)]sign(u1=2 )  0(16.60)式 (16.60) の条件は Osher 26 によって提示されたもので，数値流束 h1=2 がこの条件を満足するスキームをE スキームと呼ぶ．

図 16.7: 1 次上流差分スキームの h1=2

TVD スキームの解はエントロピ ー条件を必ずしも満足しないが，E スキームの解は TVD でエントロ

ピ ー条件を満足する．図 16.7 は fuu > 0 の場合の f; u 線図で，数値流束 h1=2 の値が  印で示されている．Engquist-Osher スキームと Roe スキームの数値流束の値は一般には同じで，これらのスキーム

は E スキームの条件 (16.60) を満足する．しかしながら音速点 a = 0 のところでは拡大図 (c) に示すよ

26 Osher, S., Riemann solvers, the entropy condition and dierence approximations, SIAM J. Numer. Anal., 21(1984),
217{35.

25

１次元流れの流束差分分離法

うに違うものになり，Engquist-Osher スキームはここでも E スキームの条件を満足するが ，Roe スキー

ムは満足しなくなる．次に数値的膨張衝撃波の発生のメカニズムについて説明する．今 fuu > 0，音速点が x0 < x < x1 にあり，a1=2 = (f1; f0)=u1=2 > 0 とする．このとき Roe スキームの数値流束は
h;3=2 = f;1  h;1=2 = h1=2 = f0  h3=2 = f1 となる．したがって un0 +1 = un0 ;(h1=2 ;h;1=2) = un0 となり，u0 の値は時間によらず一定になる．一方 un1 +1 = un1 ;(h3=2 ;h1=2 ) であるが，h3=2 ;h1=2 = f1 ;f0 > 0 で，u1 の値は h3=2 ! h1=2 になるまで時間と共に減少し以後変化しなくなる．スカラー輸送方程式では，膨張波の音速点を挟んで u の初期不連続が維持されるだけであるが，他の方程式で不連続量が増加するようであれば ，膨張衝撃波に発達する可能性がある．

Roe スキームも，膨張波の音速点で
ja j f0 + f1 ; 2f
1=2 m

u1=2

で定義される修正特性速度を用いれば E スキームになる．このとき h1=2

 f  ，また u0  u1 ! u になり，u の初期不連続は消え，ここに膨張扇が形成され，エントロピー条件 (16.59) の破綻することはない．実際の計算には，例えば次の修正特性速度の式が用いられている27 ．

8>< ja1=2 jja1=2 jm = > 1 n (a1=2 )2 o:+

( ja1=2 j)(16.61)( ja1=2 j < )2
ただし ， = max 0 a1=2 ; a0  a1 ; a1=2 ]．なお圧縮衝撃波では = 0 になり，a は修正されない．

図 16.8: 修正特性速度

16.4.3

Chakravarthy-Osher TVD スキーム

Chakravarthy-Osher スキームは，2 次中心差分と 2 次上流差分の 1 次結合を取ったもので，その数値流束は次のように表される．

CO = h Roe + 1 ; f + + 1+ f +
hi+1
=2
i+1=2
i;1=2
i+1=2
4
4

; 1 ;4 fi;+3=2 ; 1+4 fi;+1=2| {z } |{z} |Roe スキーム 2 次上流差分補正{z}(a1=2  0)
(a1=2 < 0)(16.62)2 次中心差分補正= ;1 は 2 次上流差分，= 1 は 2 次中心差分になる．また = 1=3 は 3 次
上流差分，= 1=2 は Leonard の QUICK スキームになる．数学的には = 1=3 以外は 2 次精度ということ

この式のは結合のパラメータで27 Harten, A. and Hyman, J. M., Self adjusting grid methods for one-dimensional hyperbolic conservation laws, J. Comput.
Phys., 50 (1983), 235{69.

26

圧縮性流れの解法|１次元 Euler 方程式になるが，計算結果の精度はの値によって突然変わることはないから，QUICK スキームを 3 次精度とす

Roe は 1 次の Roe スキームの数値流束で，この式は，一般化された 2 次スキーム] ＝るのも一理ある．hi+1=2

Roe スキーム] ＋ 補正項]，という形に表されている．f  は，各波の位相速度の符号によって分離された流束の差分を表している．

Chakravarthy-Osher TVD スキームについて述べる．2 次以上の上流差分スキームは，まず上記のように 1 次上流差分とこれを 2 次にする補正項の和で表し ，次に補正項の大きさを制限することによって TVD化される．すなわち 1 次上流差分スキームはもともと TVD なので，補正項の大きさを，制限関数を導入し全体のスキームが TVD 条件 (16.48) を満足する範囲に制限すれば実現できる．Chakravarthy-Osher TVD
スキームの数値流束は次のように表される．

Roe + 1 ; f~+ + 1+ f~+ ; 1 ; f~; ; 1+ f~;hi+1=2 = hi+1
=2
i;1=2
i+1=2
i+3=2
i+1=2
4
4
4
4



f~j+1=2 = minmod(fj+1=2  bfj;1=2 )(j = i i +1)~
f j+1=2 = minmod(fj+1=2  bfj+3=2 )(j = i ; 1 i)(16.63)

ただし minmod(minimum-modulus) 制限関数 (limiter) は次式で定義され下図のようになる．



minmod(x y) = sign(x) max 0 minfjxj sign(x)yg
8>(jxj  jyj x y 同符号)<x=> y(jxj > jyj x y 同符号):0(x y 異符号)

;;
;
;

b

1

;

0

1

b

minmod(r b)minmod(r 1)
r = x=y

式 (16.63) は minmod 関数が働かなければ式 (16.62) と同じである．しかしながら，当該勾配を隣接勾配と比較するときに符号が違えば，minmod 関数が働きその勾配は 0 になり，数値流束は 1 次上流差分のものに切替わる．また勾配の符号は同じでもその大きさが極端に違い大きければ ，minmod 関数が働き当該勾配の大きさは TVD になる範囲に制限される．このように関数の勾配を制限するものを勾配制限関数 (slope
limiter) と言う．ここでは式 (16.63) の中の勾配をすべて fj+1=2 = ai+1=2 uj+1=2  j = i i  1 のように置く．これは，前節に述べたように，a の符合の変わる音速点や衝撃波のところで，式 (16.63) が破綻するのを避けるためである．このとき式 (16.63) の数値流束は次のようになる．
nohi+1=2 = a+i+1=2 ui + 1 ;4 minmod(ui;1=2  bui+1=2 )+ 1+4 minmod(ui+1=2  bui;1=2 )on+ a;i+1=2 uj+1 ; 1 ;4 minmod(ui+3=2  bui+1=2 ) ; 1+4 minmod(ui+1=2  bui+3=2 )= 1=3 で minmod 関数が働かないときにも数学的には 2 次に止まるが，線形化後のスカラー輸送方程式 (16.45) が準線形で a はその係数であるから，このような a の取り扱いによって精

このスキームの精度は，度は実質的には変わらない．

27

１次元流れの流束差分分離法

次に勾配を比較するときに隣接勾配に掛ける倍率 b の大きさを TVD 条件 (16.48) から決定する．差分方

程式 (16.55) に上記の数値流束を代入すれば ，その右辺は

hrhs = uni ; (1 ; ) a+i;1=2 ui;1=2 + a;i+1=2 ui+1=2+ 1 ;4 a+i+1=2 minmod(ri+;1=2  b)ui+1=2 ; a+i;1=2 minmod(ri+;3=2  b)ui;1=2+ 1+4 a+i+1=2 minmod(ri;+1=2  b)ui;1=2 ; a+i;1=2 minmod(r1;;1=2  b)ui;3=2; 1 ;4 a;i+1=2 minmod(ri;+3=2  b)ui+1=2 ; a;i;1=2 minmod(ri;+1=2  b)ui;1=2in; 1+4 a;i+1=2 minmod(ri++1=2  b)ui+3=2 ; a;i;1=2 minmod(r1+;1=2  b)ui+1=2h= uni ; (1 ; ) a+i;1=2 ui;1=2 + a;i+1=2ui+1=2+ 1 ;4 a+i+1=2 minmod(1 bri;+1=2 )ui;1=2 ; a+i;1=2minmod(ri+;3=2  b)ui;1=2+ 1+4 a+i+1=2 minmod(ri;+1=2  b)ui;1=2 ; a+i;1=2 minmod(1 bri+;3=2 )ui;1=2; 1 ;4 a;i+1=2 minmod(ri;+3=2  b)ui+1=2 ; a;i;1=2 minmod(1 bri+;1=2 )ui+1=2
in; 1+4 a;i+1=2 minmod(1 bri;+3=2 )ui+1=2 ; a;i;1=2minmod(ri+;1=2  b)ui+1=2となる．ただし rj+1=2 = uj +1=2 =uj +1=21 である．この Chakravarthy-Osher スキームの rhs の式を

Roe スキームの rhs の式と比較すれば ，この rhs の式は Roe スキームの rhs の式の ai1=2 を次の a~i1=2で置換えたものであることが分かる．

h





a~+i;1=2 = a+i;1=2 1+ 1 ;4 Ra+ minmod(1 bri;+1=2 ) ; minmod(ri+;3=2  b)i
+ 1+4 Ra+ minmod(ri;+1=2  b) ; minmod(1 bri+;3=2 )

h





a~;i+1=2 = a;i+1=2 1+ 1 ;4 Ra;minmod(1 bri+;1=2 ) ; minmod(ri;+3=2  b)i
+ 1+4 Ra; minmod(ri+;1=2  b) ; minmod(1 bri;+3=2 )(16.64a)(16.64b)+;;;
ただし Ra+ = a+i+1=2 =ai;1=2  Ra = ai;1=2 =ai+1=2 である．lhs についても全く同じことが言える．したがって Chakravarthy-Osher TVD スキームは，式 (16.57) と同形の 3 条件

a~+ 0

a~;  0

(1 ; )ja~j  1(16.65)のもとで TVD 安定になる．

式 (16.65) の第 1 式と第 2 式は，式 (16.64) の ] の中が正のときに満足される．これが常に正であるた
+
;
i+1=2
i;3=2 b のとき，また第 2 式は ri;1=2 = 0 ri+3=2 b のとき最も厳しい状態になり，このとき  ] の中は 1 ;f(1 ; )=4gb ;f(1+ )=4g となる．これが正であるための条件はめには第 1 式は r;= 0 r +1  b  (3 ; )=(1 ; )(16.66)となる．式 (16.66) の条件は minmod 関数の b の大きさを制限するものである．一般に制限関数が働けば解の精度は低下するが，b の値を大きく取れば制限関数の働く領域は狭くなる．

28

圧縮性流れの解法|１次元 Euler 方程式

他方 式 (16.65) の第 3 式は， a~ が大きいときに厳しくなる．その最大値は式 (16.64) の ri+;3=2 = 0 ri;+1=2

b ，最小値は r;i+3=2= 0 r+jji;1=2b のときで，

a~+i;1=2  a+i;1=2 + a+i+1=2 f1 ; +(1+ )bg=4
a~;i+1=2 a;i+1=2 + a;i;1=2 f1 ; +(1+ )bg=4となる．これより式 (16.65) の第 3 式が成立するための条件は(1 ; )b1jaj  1

b1 = 1+ R4a f1 ; +(1+ )bg(16.67)jjとなる．式 (16.67) の条件はクーラン数 C = a t=x または時間間隔 t の大きさを制限するものである．
ところで Ra の大きさは，特に a の符号の変わる音速点や衝撃波のところで，どのように見ればよいのであ+ろうか．音速点のところ (xi;1=2 < x < xi+1=2 ，x は音速点) では，ai;1=2 = a;i+1=2  ai+1=2 = ai+1=2 で，

 a+i+1=2 f1; +(1+ )bg=4 a~;i+1=2 a;i;1=2 f1; +(1+ )bg=4 となる．音速点とその近傍では Ra は大きくなるがそもそも jaj が小さく，t を決める際には対象外のところである．一方衝撃
上記の不等式は a~+i;1=2;++;;
波のところでは，ai;1=2 = a+i;1=2  ai+1=2 = ai+1=2 で，上記の不等式は a~i;1=2 = ai;1=2  a~i+1=2 = ai+1=2となり，問題の起きる余地はない．以上の考察より，b1 の値を決める際には Ra = 1 と置き，実際の計算では時間間隔を多少小さめに取り余裕を持たせるのが良いと思われる．推奨される 3 次上流差分スキーム( = 1=3) の場合には，b  4 b1 = 1+(1+2b)=6 となる．上限 b = 4 に取ることにすれば b1 = 2:5，したがって陽解法では C  0:4，Crank-Nicholson 法では C  0:8，完全陰解法では無条件ということになる．
この項の終わりに，数値流束の式 (16.63) の意味を，3 次上流差分スキームを例に明確にしよう．この式
は = 1=3 b = 2 に選べば次のようになる．
8 1
1 minmod(f><f+minmod(
f

2
f
)+
i
i
;
1
=
2
i
+1
=
2
i+1=2  2fi;1=2 ) (a  0)
6
3
h(3)
=
(16.68)i+1=2 >
:fi+1 ; 1 minmod(fi+3=2  2fi+1=2)+ 1 minmod(fi+1=2  2fi+3=2) (a < 0)
63
ここでは a > 0 の場合を説明するが，a < 0 の場合も対称性により同じことが言える．いま簡単のため i = 0
f1=2 =f;1=2 = r と置けば上式は次のようになる．

n

o

1
1
h(3)
1=2 = f0 + 6 minmod(1 2r)+ 3 minmod(r 2) f;1=28> (5=6)f;1=2(r > 2)(第 2 の minmod 関数が働く)>< (f;1=2 +2f1=2)=6 (1=2  r  2) (3 次上流差分)= f0 + >(2=3)f1=2(0  r < 1=2) (第 1 の minmod 関数が働く)>:0(r < 0)(1 次上流差分：第 1,2 の minmod 関数が働く)
更にこの式の理解のために図を描けば，f > 0 の場合には図 16.9 のようになる．この図は，勾配 f;1=2を固定し，勾配 f1=2 すなわち r を変化させたときに，数値流束 h1=2 がどのように変化するのかを示したものである．h1=2 は，2 つの勾配が等しいときにはもちろんその線上に乗り，1=2

 r  2 の範囲では f;2を含めた 4 点を通る 3 次上流差分式の数値流束になる．また h1=2 は，r > 2 では第 2 の minimod が働き

r = 2 のものと同じになり，他方 0  r < 1=2 では第 1 の minimod が働き上式のように制限される．なお
後者の制限をしないときには，r < 1=4 の範囲で h1=2 が極値になり TVD 条件が満足されなくなる．h1=2
は r < 0 では 1 次上流差分のものになる．

29

１次元流れの流束差分分離法

図 16.9: 3 次上流差分 TVD スキームの数値流束

16.4.4

１次元 Euler 方程式の流束差分分離法

１次元オイラー方程式 (16.11) に対しては，Chakravarthy-Osher 型 TVD スキームの数値流束 (16.63) は次のようになる．

Roe + 1 ; F~ + + 1+ F~ + ; 1 ; F~ ; ; 1+ F~ ;Hi+1=2 = Hi+1
=2
i;1=2
i+1=2
i+3=2
i+1=2
4
4
4
4



~
Fj+1=2 = minmod(Fj+1=2  bFj;1=2 )
(j = i i +1)
F~ j+1=2 = minmod(Fj+1=2  bFj+3=2 )
(j = i ; 1 i)
Roe = 1 (Fi + Fi+1 ) ; 1 jFi+1=2 j
Hi+1
=2 2
2

(16.69)

ここでは音速点や衝撃波のところで差分式が破綻しないように，Fj+1=2 = Ai+1=2 qj +1=2 (j = i i

 1)と置くことにする．オイラー方程式を線形化したものは準線形で A はその係数に当たるので，このようなA の取り扱いは精度にほとんど 影響しないが，Fj+1=2 = Rj+1=2 jsigni+1=2 j(Lq)j+1=2 のように置け

ば精度に全く影響しないことになる．

以下では，流束の差分 F  = A q の流束差分分離法 (ux dierence splitting) における計算式を導出する．簡単のため添字を Fj = (N ;1R  L N )l qj  l = i +1=2 j = l l

する．まず Nl qj を計算すれば ，

0 1
Nl qj = B
@;u=

10

1 0

 1 のように付けることに

1

j
0 0 
C
B
1
C
B
C
Mj C
1= 0A@ uA = BA@l2 ;~u ~ l e j
Pj2Mj  ;ul  j +  uj  Pj  l j ; ~ul  uj +~ ej

ただし 2 ~u2=2 である．次に Ll qj を計算すれば ，0
1
01 0 ;1=c210  j 1 B  j ; c12 Pj Cl
BB 1B
1 P C
1 M C
B
C
C

C
B
M
+
Ll qj = (L N )l qj = @0 1 1= c A@
j
jC
jA = B
c
B
CA
l l
l
@ 1l
0 1 ;1= c l Pj1lMj ; c Pj
l l

30

圧縮性流れの解法|１次元 Euler 方程式

更に (R  L)l qj を計算すれば ，0
1 P 1;
1j
cl2 j C
0 B
B
C
0C
ABBB 1l Mj + l1cl Pj CCC
A3 l @ 1
1

01 =2c ; =2c10 0
1
CB(R L)l qj = B@0 1=2 1=2 A@ 0 2c=2 ; c=2 l 000Mj ; c Pj

l

0 
1
 1 Mj +  1 Pj


+

j
1
l
al
bl
BB
CC
cl
cl2
1
1
1
B
= B1l Mj + al Pj + bl Mj C
CA
@ l
l cl
l

l l

1l Pj + al cl Mj + bl Pj

ただし 1 = u 2 = u + c 3 = u; c i = (i  ji j)=2 a = (2 ; 3 )=2 b = (2 + 3 )=2 ; 1 である．最後に Fj = (R L)l qj を計算すれば 28 ，

0 1
Fj = (N ;1 R L)l qj = B
@ u

u2 =2

0 
1
 1 Mj +  1 Pj
1


+

j
1l
al cl
bl c 2CC
0 0 BlBB  1C
1
0 AB1l Mj + al Pj + bl 1 Mj C
CA
l cl
l
u 1=~ @ l1l Pj + al cl Mj + bl Pj

l

1
0 
 1 Mj +  1 Pj


+

j
1
l
al
bl
CC
BB
cl
cl2
B
ul
ul C
1
=B
BB1l ( u)j + al cl Pj + bl Mj + al cl Mj + bl cl2 Pj CCC
A@(16.70a)l
1l ej + al uc l Pj + bl ul Mj + al Hc l Mj + bl H
c 2 Pjlll

上式を整理すれば ，次の分離された流束差分 Fj の式が得られる．

n

o

n

o

Fj = 1l qj + al c1 Pj + bl Mj qal + al c1 Mj + bl c12 Pj qbl
l

0 1
00 1
011
q=B
@ uCA  qa = B@1CA  qb = B@ u CA ll(16.70b)euHa = (2 ; 3 )=2 b = (2 + 3 )=2 ; 1 Mj = ;u 1 0 l qj  Pj = 2 ;~u ~ l qj 
2 = ~ 21 u2

なお M と P はそれぞれ運動量の差分 m = ( u) または静圧の差分 p に近いものである．

次に分離された流束差分を Fj = Rj sign
l (Lq )j と置いた場合の流束差分の式を導出する．以下

j

j





では混乱は生じないと思われるので， sign
l j の成分 signkl kj = ~ klj を単に k または kj と書くj28

H = c2=~ + u2=2 = (e + p)=

j

j

j

31

１次元流れの流束差分分離法
ことにする．始めに Nj qj を計算すれば 29 ，

0 1
Nj qj = B
@;u=

10

1 0 1

0 0


B
C
B
=
1= 0C

u
u
A@ A @ CA = qj
2 ;~u ~ j e j
p j



また A
j = Rj jsignl jj Lj は式 (16.17)(16.18) から次のように求められる．

1
0
1



BB1 c a c2 b CC
A =B
B@ 0 1 + b 1c a CCA
 
c a

0

(16.71)1 + b
;1  ただし 
a  b は上記と同様に定義されたものである．これより分離流束差分 Fj = Nj Aj qj は
式 (16.16) を用い次のように求められる30 ．

0 
BB 1 B u
Fj = B
BB 1
@ u2


1
CC
+ (1 + Ma + b )u+ 1c (a + Mb )p C
C H  
1   H  CA
+ c12 b p C

+ c a u(16.72a)2 1  + c 1 + c2 a + Mb u + ~ 1 + Ma + c2 b p j

この式は次のように表すこともできる．

Fj = 1j q1 + (a c1 pj + b j uj )qaj + (a c j uj + b c12 pj )qbj
j

j

j

0
1
001
011

BB u + u CC
B 1 CA  qb = B@cM CA 
q1 = B@ u2  + cu + 1 pCA  qa = @cM
H(16.72b)~2k = jsignkl jkj (k = 1 2 3)





a = (2 ; 3 )=2 b = (2 + 3 )=2 ; 1
右辺の高次スキームでは，数値流束 Hi+1=2 の値は一種の補間式から求められるので，上流化は点 xi+1=2 における特性速度 i+1=2 の符号によって行うのが妥当といえる．つまり式 (16.70) と (16.72) は l = i+1=2 j =i ; 1=2 i +1=2 i +3=2 と置いて使われるものである．
29 j = i +1=2 のときに fi+1=2 = (fi + fi+1 )=2 fi+1=2 = fi+1 ; fi と置いて計算すれば
1 
第 2 要素 =i + i+1 ; (ui + ui+1 )(i+1 ; i ) + 2((u)i+1 ; (u)i )=  +1(u)i+1 ; (u)i + i ui+1 ; i+1 ui = ui+1 ; ui = ui+1=2~~~ (u2 )i+1 ; (u2 )i
第 3 要素 = (ui2 + ui2+1 )(i+1 ; i ) ; (ui + ui+1 ) (u)i+1 ; (u)i + pi+1 ; pi +422
 ui+1=22
~2
i+1=2= pi+1 ; pi + 4 (ui 1 ; ui ) (i+1 ; i ) = pi+1=2 + ~
2
i

i+1

;

第 3 要素の式の第 2 項は第 1 項に比べ 2 次の微少量であるから無視する．
30

M2 + 1 = H
2 ~ c2

32

圧縮性流れの解法|１次元 Euler 方程式

次に  形陰解法の式 (16.35) または (16.37) の左辺の計算について述べる．１次上流差分を用いることにすれば左辺は次のようになる．

lhs = ;A+i qi;1 + (I + jAi j)qi + A;i qi+1

j j

ただし  = t=x，I は単位行列， A = A+

(16.73); A; である．この左辺の計算では，点 xi における特性速度ki  k = 1 2 3 の符号によって上流化を行うのが妥当と考えられる．保存形 Euler 方程式の分離されたヤコビ行列 A = N ;1A N を式 (16.71) の A を基に式 (16.16) を用いて計算すれば次のようになる．

0
1  ; ~u 1 ; uc a + qbBc a c2 b
BB2 ; 3 u  +(q ; 1)u ; ( ; 2) u  ; (2q ; 1)
A = B
B
a
1
b
b
B
2 c
c a
B

n
o
3
2
2
@  ; 2 u cu 
u 
3
u c 

2 c ; ~ a +(q ; 1) 2 b

2 ;  c + ~ a ; qub0
1 ( ; ~M )1 ; Ma + qb
b
B
c a
B
h
i
B
=B
c (q ; M 2)a +(q ; 1)Mb 1 ; ( ; 2)Ma ; (2q ; 1)b
B
B
@ h
i h
i
M 


+(
q
;
1)
c2M q ; H
a
2
c
2 b



c H
c2 ; 2q a ; qMb

1
~ 
CC
c2 b
~  + ~u  CCCC
c a c2 b CA~u1 + c a +(q +1)b
1 ~bc2
~ ( + M)
b
c a

1
CC
CC
CC
A

(16.74)

1 +~ Ma +(q +1)b

ただし M = u=c はマッハ数，q = 2=c2 = ~M 2=2，また H=c2 = (1+q)=~ である．式 (16.74) の下式は無次元量を多く用いた式で，式 (16.29){(16.31) から導くこともできる．

流束差分分離法に関して以上述べてきたところを要約すれば次のようになる．

１次元 Euler 方程式の初期値問題の差分方程式は，前節に示した  形陰解法の式，すなわち定常流れの場
合には式 (16.35)，非定常流れの場合には式 (16.37) で，これらの式は予測子修正子法によって解かれる．

これらの式の右辺の流束の微分 Fx はまず保存形

1 (H(Fx )i = xi+1=2 ; Hi;1=2 )で表され，数値流束 Hi+1=2 は Chakravarthy-Osher 型 TVD スキームを適用し式 (16.69) のように置かれる．この式の流束差分の値は，音速点で振れが生じないように対策の施された流束差分分離法の式 (16.70)

または (16.72) から求められる．

他方  形陰解法の式の左辺は，1 次上流差分を適用し式 (16.73) のように置かれ，この式の流束分離されたヤコビ行列 Ai の値は式 (16.74) から求められる．

なお式 (16.69) の b は式 (16.66) を満足するように，またクーラン数 C または時間間隔 t は式 (16.67) を満足するように与えなければならない．
１次元オイラー方程式の初期値問題がどのように解かれるのかについては 16.6 節の数値計算例を参照されたい．そこでは  形陰解法の他に Runge-Kutta 法などの陽解法も用いている．

１次元流れの Godunov 型スキーム

16.5

33

１次元流れのゴド ゥノフ型スキーム

ここでは始めにゴドゥノフ法 (Godunov scheme) そのものを説明する．この解法は一種の有限体積法 (nitevolume method) で，初期値は各要素内で一定の区分的定数値関数で近似的に与えられる．このとき変数は要素境界で不連続になり，その初期値問題は多くのリーマン問題 (Riemann's problem) 31を解くことに帰着される．ゴドゥノフ法は今日まで多くの改良がなされれきた．リーマン問題は数値的に解くことができる

が容易でない．ここでは，これを近似的に解く近似リーマン解の中から Roe の近似リーマン解を紹介する．

ゴド ゥノフ法の精度は 1 次相当で，区分的定数値関数を区分的多項式にすれば精度を改善できる．有限体
積法では，要素の中心にその点の変数値ではなく，変数のその要素にわたる平均値が与えられ，この平均値をもとに各要素ごとに変数が区分的多項式で近似される．このとき要素境界の変数の不連続は小さくなるが依然として存在し ，ここに近似リーマン解が補われる．

16.5.1１次元流れのゴド ゥノフ法

ゴドゥノフ法32 はオイラー方程式 (16.11) の初期値問題の数値解法である．初期値 q n (x) は各要素内で一定の区分的定数値関数で近似的に与えられる．次にこの初期値に対しオイラー方程式の初期値問題が厳密に解かれる．初期値はセル境界で一般に跳躍 (jump) するから，各境界でリーマン問題を解くことになる．
リーマン問題は断面積一定の衝撃波管の流れで，その物理現象は，高圧気体と低圧気体を仕切る隔膜が瞬時に破壊されたときに，低圧気体内に衝撃波が走り高圧気体内に膨張波が拡がるものである．リーマン問
題は xt 空間内の初期曲線 t = 0 上の初期値 q (x 0) = q0 (x < 0) = q1 (x0) の点 x = 0 から起きる膨張扇 (expansion fan)，境界面 (interface)，衝撃波 (shock) を決定する問題である．図 16.10 は，xt 面における有限体積法のセルおよびその境界におけるリーマン問題の解を示したものである．セル ABCD において，その大部分を占める点 A から出る衝撃波と点 B から出る膨張波 (図では膨張扇を 1 つの膨張波で近似的に表示) で囲まれた領域では q = qin で，また膨張波と境界面の間，境界面と衝撃波の間でも q の値は一定になりセル境界上の流束 F も一定値 Fi;1=2 または Fi+1=2 になる．式 (16.11) を 1 つのセルにわたって積分す
れば ，次式が得られる．

Z x +1=2

1
qin+1  xixi;1=2

t ;F ; F 
qn+1(x) dx = qin ; xi+1=2 i;1=2(16.75)時間 tn+1 における q n+1(x) の平均値 qin+1 は，平均を取らなくてもこの式から容易に求めることができる．

この操作をすべてのセルにわたって行えば ，解 q (x t) を t だけ先へ延長することができる．

6

t6

B
B


D

t expansion
-

x

fan

?

qin+1


H

H
H


B
B

B
B

A



shock
interfaceH
H
H
H

Fi;1=2

qin
x

B
B

C

P

 P
P

H
H


B
B

B
B

B

-

Fi+1=2

initial line

Q
Q

tn+1

cell
interfacetn

図 16.10: Godunov 法

31 リーマン衝撃波管流れ問題 (Riemann shock tube ow problem)．偉大な数学者 Riemann, G.F.B. 自身は 2 階双曲型方程式の Cauchy 問題の積分表示を与えている．

32 Godunov, S. K., Finite dierence method for numerical computation of discontinuous solutions of the equations of uid
dynamics, Matematicheskii Sbornik, 47(1959), 271{306. この文献に代わるものとして，Holt, M., Numerial Methods in Fluid
Dynamics, 2nd ed., 28{66, 1984, Springer-Verlag Berlin.

34

圧縮性流れの解法|１次元 Euler 方程式

ゴドゥノフ法は，安定に解を求めるものであるが，リーマン問題を解くことは必ずしも容易でなく，また1 次精度で不連続を鮮明に捕獲することができない．Godunov 自身はその後第 2 ゴド ゥノフ法を提案している．この解法についても前出の Holt 監修のソ連で開発された数値スキームを紹介した本の中に詳しい説
明がある．しかしながら後の CFD に大きな影響を及ぼしたものはもとのゴド ゥノフ法である．その後米国の研究者によってリーマン問題の近似解法が開発され，また精度を改善するために区分的定数値関数から
区分的多項式への拡張が行われている．

16.5.2 Roe の近似 Riemann 解
今不連続の左側の量を添字 L，右側の量を添字 R を付けて表すことにする．ヤコビ行列 A が次の条件を満足するように決定できれば ，スキームは保存形になる．

F = A q

FR ; FL = A(qR ; qL)(16.76)

 は qL と qR の関数で，qL = qR = q ならば A(q q) = A(q) = @F=@q ，また A は実固有値と 1 次独
ただし A

 を巧妙な手段で見出している33 ．
立の固有ベクトルを持つものとする．Roe はこれらの 3 条件を満足する A
未知変数ベクトル q と流束ベクトル F は

0z 1
011
1
z=B
@z2CA = pB@ u CA
z3

(16.77)Hで定義されるベクトル z の成分の 2 次式で表すことができる．すなわち

0  1 0 z12 1CB
q=B@uCA = BB@ z zz1z2~z 2 CCA 
e

1 3

+

(16.78a)2

2
1
0 u 1 0
z
1 z2
B
z22 C
CC
F =B
@u2 + pCA = BB@ ~z1z3 + ( +1)A2
Hu(16.78b)z2 z3

q と F の中の 2 次式 z12  z1 z2 : : : の差分は，(ab) = (ab)R ;(ab)L = a b+b a のように書き換えることができる．ただし u = uR ; uL u
 = (uL +uR)=2 である．q F に対しこの書換えを実行し整理すれば次式が得られる．

q = BzF = Cz

0
2z1
B

B
B = @ z2
z3 =

0 z
2
B
~
z

C = B
B@ 3
0

1

0
0
C
z1
0 C
A
~z2 = z1 =1
z10( +1)z2 ~z1 C
C

z3

z2

CA

(16.79a)(16.79b)33 Roe, P. L., Approximate Riemann solvers, parameter vectors and dierence schemes, J. Comput. Phys., 43(1981),
357{72.

１次元流れの Godunov 型スキーム

35

 = C B ;1 q ，式 (16.76) を満足する A は次のように求められる34
これより F = Cz

1
0
0
1
0
BB 3 ; z22z2 ~ C
CC
B
;
(3
;
)
;
1



2
A=CB =B
B@ z z2 z~1z 3 z zz12 z CCA; z2 23 + 2 z23 z3 ; ~ z22 z2
1
1
1
1
1
0
1
0
1
0
B 3;  2C(3 ; )u; 1C=B
B@ ; 2 uCA;1 3 
2
;H u + 2 uH ; ( ; 1)uu

(16.80) H は次のように定義された u または H の平均値である．
ただし u

p
p
u = z2 = pL uL + pR uR 
z
 + 
1

L

pLHL + pR HRz
3
H = z = p + p
1
L
R

R

 は Roe の第 1 条件，式 (16.76) を満足するように導いたものであり，u H の定義式は第式 (16.80) の A

2 条件，qL = qR = q のとき A(q q) = A(q)，を明らかに満足するものである．また第 3 の条件も式 (16.80)が保存形方程式のヤコビ 行列の式 (16.12b) と同形であるから，3 個の異なる実固有値と固有ベクトルを持 の固有値 i は，jA; I j = 0 すなわちつことになる．A

 
1
0 
 3;;
 ; u2 (3 ; )u;  ~  = ;( ; u)( ; u; c)( ; u+ c) = 0
  2 ~ 3  2u ;  
;H u + 2 u H ; ~uから計算できる35 ．ただし c は次式で定義される平均音速である．
c 2 = ( ; 1) H ; 12 u2
これより固有値  i は次のように求められる．
1 = u2 = u + c3 = u ; c

34 B の逆行列は Gauss-Jordan 法によって容易に求めることができる．

0 1
B
2z1
B
z2
B
;
1

;
B
B =B
2
z2
B
@ ~ z 2 1 z3

1

0
0C
CC
1
0
CC
z1
C
z2
A
2;
;
~ 2
3
2
2 z1 2z1z1z1
35 第 1 列に第 2 列を u 倍したものを加え，それから積の和を作れば次のようになる．
 ; + u1
0  3 ;  u2 ; u (3 ;  )u ;  ~  = ;( ; u);2 ; 2u ; ~H +  +1 u2  2 ~ 32
 ; ~u2  u ;  H
 ; 2 u(16.81)

36

圧縮性流れの解法|１次元 Euler 方程式

 の右固有ベクトル ri は，(A
また A

0 
;i
1
B
3
;
B
; 2 u2 (3 ; )u ; iB
@  ~ 3  2; i I ) ri = 0 すなわち
0
~

10 1
CCBri1i C
CA@r2 A = 0 ri;H u + 2 uH ; ~u011
B u CC r1 = B@ 2A

0 1 1
r2 = B@ u+ c CA u ; i3

から計算できる．いま ri1 = 1 とすれば右固有ベクトルはuH + cu

2

0 1 1
r3 = B@ u ; c CA
H ; cu は確かに 3 個の実固有値と 3 個の 1 次独立の実固有ベクトルを持つことが分かる．
となる．これより A とその逆行列 N ;1 は式 (16.16) から一応次のように表すこ
保存形 Euler 方程式を非保存形にする行列 Nとができる．

0 1
1
0 0
N = B@;u= 1= 0CA ~u2=2 ;~u ~01N ;1 = B
@ u

1

0 0
 0 CAu2=2 u 1=~(16.82)

 を実際の計算に利用するにはしかしこの N

0 1
10  1 0  1
0 0
 =B
Nq
@;u= 1= 0CAB@(u)CA = B@uCA = q~u =2 ;~u ~2すなわち２つの式

;

e

p

(16.83)u = 1 ; u + (u) p = ~e ; 12 ~(u2 ) = 12 ~u2  ; ~u(u)+~eが満足されなければならない．ところでこれらの式の中の  (u) と  (u2 ) は次のように書き換えることができる．

(u) = (u)R ; (u)L = (pu)R +(pu)L (pR ; pL)+ pLR (uR ; uL)= u + pL R u(u2 )= (u2 )R ; (u2)L = (pu)R +(pu)L (pu)R ; (pu)L= u(pR + pL) (pu)R ; (pu)L= u(u)+ pR L uu + u すなわち密度の平均値  を
上の２つの式のうち上式は  (u) = u

 = pL Rのように定義すれば成立する．また下式もこの  の定義のもとで成立する．

１次元流れの Godunov 型スキーム

37

 = NAN ;1 を計算する．
次に非保存形 Euler 方程式の係数行列 A

0u 
A = NAN ;1 = B
@0 u

1

0
1=C
A
2
0 c u

(16.84)

 は形式的に式 (16.14b) の A と同形で，したがって固有ベクトルの行列 L  R は式 (16.18) を参考
この Aに次のように置くことができる．

01 0 ;1=c21
L  = B@0 1 1=c CA 

01 =2c ;=2c1R  = B@0 1=2 1=2 CA

0 1 ;1=c
0 c=2 ;c=2  W R はまとめて書けば次のようになる．
実際の計算に必要な 0 01 = B@ 0 2
0

1 0

1

0
u 0
0
C
B


0 A = @0 u + c 0 CA0 30 0 u ; c

(16.86)0@ w 10 ; p=c21
1@ W = B@@ w2CA = L q = B@u + p=cCA (16.87)u ; p=c

@ w3

0
BB 1

B
R = r1 r2 r3 = N ;1R  = B
BB u
@ 2

 1

;
2c
2c C
C
 (u + c) ;  (u ; c) C
CC 
2c
2c
C
u  (H + cu) ;  (H ; cu)A
2 2c
2c
u = uL + RuR  H = HL + RHR  = pL R = RL 1 2

1+R

1+R

p

R  R=Lc 2 = ( ; 1) H ; 2 u 

(16.85)(16.88)(16.89)

なお固有ベクトルの大きさは任意に選ぶことができるので，式 (16.88) は前記の右固有ベクトルに係数

=2c

を掛けたものになっている．

Roe の近似 Riemann 解は次のいずれかの式によって計算される．
X
Fi+1=2 = F (qi+1=2L ) + ;k @ wk rk= F (qi+1=2R ) ;k

X+  kk

k @ wk r

X= 12 F (qi+1=2L )+ F (qi+1=2R ) ; 12 jk j@ wk rkk(16.90a)(16.90b)(16.90c)

これらの式は，Euler 方程式から特性の理論に基づいて導かれたものであるが，物理的に解釈すれば ，本節始めの図 16.10 のように膨張波，流跡線 (境界面)，圧縮波 (衝撃波) が出ている場合には，第 1 式は流束

Fi+1=2 が不連続の左側の流束 F (qi+1=2L ) に膨張波を横切っての流束の変化 3 @ w3 r3 を加えたものになる2 r2 と流跡線を横こと，第 2 式は不連続の右側の流束 F (qi+1=2R ) から圧縮波を横切っての流束の変化  2 @ w

38

圧縮性流れの解法|１次元 Euler 方程式

1 r1 を差し引いたものになることを示している．また第 3 式は第 1 式と第 2 式の切っての流束の変化  1 @ w
平均を取り，対称性を持たせたものである．

セル境界の不連続からは，物理変数  u H   に対してはもちろん膨張扇，境界面，衝撃波が出るが，    に対しては擬似的膨張波，エントロピー波，圧縮波が出ることになる．Roe 平均値
Roe 平均値  u H

を用いれば，特性の理論により近似的リーマン解を陽的に求めることができる．この近似解の妥当性，精度等については前記注の文献を参照されたい．

16.5.3 ゴド ゥノフ法の 2 次精度への拡張
1 次精度のゴドゥノフ法を 2 次精度に拡張したものはかなりあるが，ここには妥当と思われるいくつかの方法について述べる．ゴドゥノフ法は前述のように区分的定数値関数近似，リーマン解，セル平均から構成されるが，以下ではこれらに相当のものを計画段階，物理段階，セル平均と呼ぶことにする．

まず計画段階 (projection stage) では，初期値が区分的 1 次式で与えられ，セル境界 (interfaces of cells)の値が変数外挿 (variable extrapolation) によって求められる．MUSCL 法 (MUSCL approach, Monotone

Upstream-centred Schemes for Conservation Laws) 36 はその代表的なもので，この方法では初期値が各セルごとに次の区分的 1 次式で与えられる．

qin (x) = qin + minmod(qin;1=2  qin+1=2 )(;1=2   1=2)

(16.91)

ただし qi は点 xi における変数 q (x) の値というよりは q (x) の i 番目のセルにわたる平均値と見るべきもの= (x;xi )=x qi+1=2 = qi+1 ;qi である．下図にゴドゥノフ法と MUSCL 法の違いを象徴的に示す．
MUSCL 法では，minmod 制限関数を用い２つの勾配 qin;1=2  qin+1=2 のうち緩勾配の方を選び，セル境
界における跳躍量が q (x) の増加する境界で正，減少する境界で負になるようにし ，単調性 (monotonicity)を強調している．これに反し ，式 (16.91) の minmod 関数を Roe の superbee といわれる制限関数
で，superbee(r 1) = max 0 min(r 2) min(2r 1)に置換え急勾配の方を選ぶことにすれば，衝撃波などの不連続の捕獲能力を格段に改善することができる．
なおこのとき単調性は壊れる．

次に物理段階 (physical stage) について説明する．初期値 qin (x) が 1 次式で与えられるときには，qi (x t)は初期曲線 t = tn の近傍つまりセル内外でほぼ 1 次的に変化し，セル境界の数値流束も時間の関数になる．

36 Van Leer, B., Towards the ultimate conservative dierence scheme. V. A second order sequel to Godunov's method.,
J. Comput. Phys., 32 (1979), 101{36.

１次元流れの Godunov 型スキーム

39

したがってセル境界上の時間平均流束 (time-averaged ux)

Z tn+11
Fi+1=2 (t) dt
F^i+1=2 = tn(16.92)tを求めることが必要になる．その方法は下記のようにいろいろある．最後のセル平均では，オイラー方程式
を 1 つのセルにわたって積分した保存関係式 (integral conservation relation)

t ;F^ ; F^ 
qin+1 = qin ; xi+1=2 i;1=2(16.93)からセル平均値 qin+1 が求められる．

n+1=2

陽的 2 段階法では，第 1 段階で時間平均流束 F^i+1=2 = Fi+1=2 を計算する．その手順は式 (16.91) から qのセル境界値

qin+1=2L = qin + 12 minmod(qin;1=2  qin+1=2 )

qin+1=2R = qin+1 ; 12 minmod(qin+1=2  qin+3=2 )を求め，前項の式 (16.86){(16.90c) から Roe の近似リーマン解 Fin+1=2 を求め，中間段階における q のセル
平均値nn
qin+1=2 = qin ; 2tx (Fi+1=2 ; Fi;1=2 )
n+1=2

n+1=2

n+1=2

を求め，同様の手順でセル境界値 qi+1=2L  qi+1=2R ，Roe の近似リーマン解 Fi+1=2 を順に計算する．その

n+1=2

第 2 段階では F^i+1=2 = Fi+1=2 とし式 (16.93) からセル平均値 qin+1 が求められる．

Crank-Nicholson 型の時間積分法では，時間平均流束は予測子の計算では F^i+1=2 = Fin+1=2 と置かれ，修正子の計算では;

F^i+1=2 = 12 Fin+1=2 + Fin+1+1=2



+1
n+1
と置かれる．ただし Fin+1=2 は次の時間ステップの区分的 1 次式 qi (x) に対する近似リーマン解である．

n+1=2

次に Roe の波動分離法による時間平均流束 F^i+1=2 = Fi+1=2 の計算について説明する．そのために必要

n+1=2

n+1=2

な中間点の左右の境界値 qi+1=2L と qi+1=2R はそれぞれ区分的 1 次式 qin (x) または qin+1 (x) を基に次式によって陽的に求められる．

t
t
+1=2
+1=2
n
n
n
n
qin+1
qin+1
=2L = qi+1=2L ; 2x (Aq )i 
=2R = qi+1=2R ; 2x (Aq )i+1
X(Aq)ni = (Rw)ni = ( k wk rk )nik

この式の解釈については，本章末尾の付録 1 Roe の波動分離法と下図を参照されたい．

(16.94a)(16.94b)

2 次 Roe スキームは，計画段階で区分的 1 次式 (16.91) の制限関数 minmod を superbee に替え，また物
理段階で時間平均流束を Roe の波動分離法と Roe の近似リーマン解によって求め，MUSCL 法を大幅に改良したものである．superbee の導入は不連続の捕獲能力を大幅に改善するものである．なおこれによって
区分的 1 次式の単調性は損なわれるが，セル平均値 qi は TVD である．波動分離法と近似リーマン解は 2
次精度の範囲で良好な時間平均流束を与えるもので，上流化と TVD の性質を持つ．次章に示す数値計算例
からも 2 次 Roe スキームが不連続や衝撃波の捕獲に優れていることが分かるであろう．

40

圧縮性流れの解法|１次元 Euler 方程式

t6dx = 1dt
dx = 2dt@@-

qin;1=2R


L



6

L

L

@
@

x

qin+1+1==22L
dx = 3
t=2
dt


L;

L
 L
L
 L L L

qin+1=2L?

1 t=2
x
図 16.11: 2 次 Roe スキーム-

-

本稿には述べないが MUSCL 法を更に高次に拡張したものに ENO スキーム (essentially non-oscillatory

scheme) 37 がある．このスキームでは上述の３つの段階は再構成 (reconstruction)，発展 (evolution)，セル
平均 (cell averaging) と呼ばれる．ENO の性質は再構成段階で多項式を最も滑らかになるように選ぶことによって実現され，発展段階では変数の跳躍量が近似リーマン解により考慮される．ENO スキームのキャッチフレーズは，不連続のところで TVD スキームは 1 次に落ちるが ENO スキームは高次を保つということである．

16.5.4

有限体積法

TVD スキーム

ここで述べる有限体積法 (nite volume methods) は，再構成段階で初期値を区分的多項式で近似し精度改善を図るものである38 ．有限体積法では未知変数ベクトル qi は，q (x) の i 番目のセルの区間 xi;1=2

x

xi+1=2 ] にわたる平均値として定義される．したがって qi は，初期値が 1 次式の場合には q(xi ) になるが，2次式以上の場合には一般に q (xi ) とは多少異なるものになる．始めに簡単なスカラー輸送方程式 (16.44) に関して述べる．関数 u の真の値を u(x) で定義し ，セル中心点 xi のまわりにテイラー展開すれば ，u(x) = u(xi )+(x ; xi)u0 (xi )+ 2!1 (x ; xi )2 u00 (xi )+ 3!1 (x ; xi )3 u000 (xi )+ 4!1 (x ; xi )4 u(4)(xi )+   (16.95)

この式を x で次々に微分すれば ，u0 (x) = u0 (xi )+(x ; xi )u00 (xi )+ 2!1 (x ; xi )2 u000 (xi )+ 3!1 (x ; xi )3 u(4) (xi )+    

u00 (x) = u00 (xi )+(x ; xi )u000 (xi )+ 2!1 (x ; xi )2 u(4) (xi )+    u000 (x) = u000 (xi )+(x ; xi )u(4) (xi )+    u(4)(x) = u(4) (xi )+   

37 ここで ENO スキームに関するいくつかの基本的文献を挙げれば，Harten, A. and Osher, S., Uniformly high-order accurate nonoscillatory schemes., I., SIAM J. Numer. Anal., 24 (1987),
279{309.
Shu, C. H. and Osher, S., Ecient implementation of essentially non-oscillatory shock-capturing schemes, II., J. Comp.
Phys., 83 (1989), 32{78.
Harten, A., Engquist, B., Osher, S. and Chakravarthy, S. R., Uniformly high order accurate essentially non-oscillatory
schemes, III., J. Comp. Phys., 71 (1987), 231{303.
Harten, A., ENO schemes with subcell resolution., J. Comp. Phys., 83 (1989), 148{184.
Yang, H., An articial compression method for ENO schemes: The slope modication method., J. Comp. Phys., 89 (1990),
125{160.
38 ここでは reconstruction を再構成と訳したが，1986 年に始まるペレストロイカに因むものであれば建直しとでも訳すべきか．

１次元流れの Godunov 型スキーム41

関数 u(x) とその導関数 u0 (x) u00 (x) : : : のセルにわたる平均値を求めれば ，
200 (xi )+ 1 x4 u(4) (xi )
uui = u(xi )+ 2!1 x
12
4! 80
2
1
x
u0 = u0 (x )+u000 (x )

i

i
2! 12
2
(4)
u00i = u00 (xi )+ 2!1 x
12 u (xi )
i

u000i = u000 (xi )
(4)u(4)
i = u (xi )これらの式からu(4)(xi ) = u(4)
i 
000
000
u (xi ) = ui 
u00 (xi ) = u00i ; 4!1 x2 u(4)i 2u0 (x ) = u0 ; 1 x u000 ii 3! 4i

00 1 1 7 4 (4)u(xi ) = ui ; 2!1 x
12 ui + 4! 4! 10 x ui
2

これらを式 (16.95) に代入すれば ，次の関数 u(x) の セル平均値によるテイラー展開が得られる．

n
n
o
2o
00 + 1 (x ; xi )2 ; x2 (x ; xi )u000
u(x) = ui +(x ; xi)u0i + 2!1 (x ; xi )2 ; xui
12 i 3!
4n
7 x4ou(4)+ 4!1 (x ; xi )4 ; 12 (x ; xi )2 x2 + 4!1 10
i(16.96)

ここでは式 (16.96) の右辺第 3 項までを取ることにする．それは 2 次式で再構成した 3 次精度の式になるので，その精度を保つように，この式中のセル平均値 u0i  u00i を次の中心差分で近似する39 ．

1 (;u + u )+O(x2) = 1 (u2u0i = 2xi;1 i+1
2x i;1=2 + ui+1=2)+O(x )

u00i = x1 2 (ui;1 ; 2ui + ui+1)+O(x2 ) = x1 2 (;ui;1=2 + ui+1=2 )+O(x2 )これらの差分式を右辺 3 項まで取った式 (16.96) に組み込めば次の区分的 2 次式が得られる．





1 u
1
1
2
3
u(x) = ui + 12 ; 2 + 12i;1=2 + 2 + ; 12 ui+1=2 +O(x ) (;1=2   1=2)
39 セル平均値 u0i の差分式は，平均を取る前の各点の u0 (x) の差分式の平均を取ったものであるから，
u0i =1 Z xi+1=2u0 (x)dx = 1 Z xi+1=2h 1 ; u(x ; x)+ u(x + x) +O(x2 )idx
x xi;1=2
x xi;1=2 2x

1 Z xi+1=2u(x ; x)dx

また例えば

x xi;1=2

は u(x) の xi;3=2 から xi;1=2 までの値の平均値で定義により ui;1 になる．結局この平均では，平均値を意識せずに差分を取ればよいことになる

42

圧縮性流れの解法|１次元 Euler 方程式= (x ; xi )=x である．セル境界 = 1=2 の u(x) の値は次のようになる．
u(xi+1=2 ) = ui+1=2L = ui + 61 ui;1=2 + 13 ui+1=2 + O(x3 )u(xi;1=2 ) = ui;1=2R = ui ; 61 ui+1=2 ; 13 ui;1=2 + O(x3 )ただし(16.97a)(16.97b)

添え字 L R はセル境界の左右の値を意味する．これらの式は 3 次の Chakravarthy-Osher スキームの数値流束の式と形式的に同じものである40 ．したがって次のように制限関数を導入することによって TVD 化す

ることができる．

ui+1=2L = ui + 61 u~i;1=2 + 13 u~i+1=2 (16.98a)ui+1=2R = ui+1 ; 16 u~i+3=2 ; 31 u~i+1=2
u~j+1=2 = minmod(uj+1=2  buj;1=2 )
u~j+1=2 = minmod(uj+1=2  buj+3=2 )(16.98b)

また TVD 化のための２つの条件，すなわち倍率 b とクーラン 数 C =jajt=x の範囲を決める条件式(16.66) と (16.67) もそのまま使うことができる．
そのセル中心の値は minmod 関数が働かないときには
1 2 u(16.99)u(xi ) = ui ; 24i
またセル境界 xi+1=2 における変数 u の跳躍量 (jump) は
u]i+1=2 = ui+1=2R ; ui+1=2L = ; 61 3 ui+1=2(16.100)となる．もとの関数 u(x) が滑らかに変化するところではこの跳躍量 u]i+1=2 は通常無視できる．
発展段階では，セル境界の流束は上流化された次式から求められる．

fi+1=2 = (a+ uL + a;uR )i+1=2
すなわち波の位相速度 a(16.101)

0 のときにはセル境界の左側の値，a < 0 のときには右側の値がとられる．時間

積分は前項に述べた解法 等によって行われる．

+1
セル平均段階では，セル平均値 un
i が，スカラー輸送方程式 (16.44) を 1 つのセルにわたって積分した次式から求められる．

uni +1 = uni ; (f^i+1=2 ; f^i;1=2 )(16.102)

40 ところで上記の 3 次精度の 2 次式は，2 ui の大きさの項， ( 1=3)=4 (ui+1=2
が，一般的 2 次 Chakravarthy-Osher スキームの流束の式と同形になる．すなわちf ;g

1 ;  u1+  u2i;1=2 +
i+1=2 + O(x )44
1 ;  u1+  u2ui;1=2R = ui ;i+1=2 ;
i;1=2 + O(x )44
またこのとき区分的 2 次式は次のようになる．
1
1 
1
1 
u(x) = ui +  ;  2 + ; ui;1=2 +  +  2 ; + ui+1=2 +O(x2 )
2
4 2
2
4 2
(;1=2    1=2)
ui+1=2L = ui +; ui;1=2 ) を加えれば 2 次精度に落ちる

１次元流れの Godunov 型スキーム

43

次に以上述べたスカラー輸送方程式の 2 次有限体積法を１次元オイラー方程式のものに拡張する．再構

成段階では，区分的 2 次式のセル境界値が次式によって計算される．

qi+1=2L = qi + 16 q~i;1=2 + 13 q~i+1=2 qi+1=2R = qi+1 ; 61 q~i+3=2 ; 13 q~i+1=2
q~j+1=2 = minmod(qj+1=2  bqj;1=2 )
q~j+1=2 = minmod(qj+1=2  bqj+3=2 )セル境界の跳躍量 q ]i+1=2 = qi+1=2R(16.103a)(16.103b); qi+1=2L は，一般に十分小さく無視できるが ，不連続のところや

minmod 関数の働く場合には小さくなく，計算に考慮しなければならない．なおこの方法による再構成では変数の単調性は保証されない．
発展段階では，流束は跳躍量が無視される場合には次式で計算される．

Fi+1=2 = (A+ qL + A; qR )i+1=2 =

X; +
k

;
k
k
k wkL r + k wkR r i+1=2(16.104)

ただし (wkL )i+1=2 = Li+1=2 qi+1=2L  (wkR )i+1=2 = Li+1=2 qi+1=2R である．また跳躍量を考慮する場合には流束は式 (16.103) のセル境界値を用い Roe の近似リーマン解 (16.90) から求められる．なおF (qi+1=2L ) = (AqL )i+1=2 =F (qi+1=2R ) = (AqR )i+1=2 =時間積分は陽的にまたは

X;

k
X
;
k



k wkL rk i+1=2



k wkR rk i+1=2形陰解法の定常または非定常流れの式; A+ qin;1 +(1+ jAj)qin + A; qin+1 = rhsn
= t=x rhs = ; (F^i+1=2 ; F^i;1=2 )
qn+1 = qn + qnm) = ;(q (m) ; q n ) + 1 (rhsn + rhs(m) ); A+ qi(;m1) +(1+ jAj)qi(m) + A; qi(+1
i
i
2
(m+1)
(m)
(m)
q
= q + qを予測子修正子法で計算することによって行われる．詳細は次節のプログラムとその説明を参照されたい．
セル平均値 qin+1 は前記の式 (16.93) から求められる．

この項の終わりに以上のべた流束差分分離法と有限体積法の関連について述べる．

(i) 流束差分分離法では関数 q(x) は点 xi における値 qi の多項式によって近似されるのに対し，有限体積法
では関数 q (x) は i 番目の格子セルの平均値 qi の区分的多項式によって近似される．
(ii) 流束差分分離法では中間点 xi+1=2 における数値流束 Hi+1=2 の値が Chakravarthy-Osher 型 TVD スキー
ムによって直接的に求められる．一方 有限体積法ではセル境界における qi+1=2L  qi+1=2R の値がまず 3 次の TVD スキームによって求められ，これらの値から流束 F (qi+1=2L ) F (qi+1=2R ) が求められる．
(iii) 流束差分分離法では流束分離は (ii) の段階で実行され，流束 Hi+1=2 の値は上流側にシフトした 3 点の流束 Fi から求められる．一方有限体積法ではこの段階では上流化された流束と下流化された流束の平均が

44

圧縮性流れの解法|１次元 Euler 方程式

取られ，上流化はセル境界から発生する 3 つの波の上流側に流束のセル境界値を取ることによって達成される．有限体積法の上流化の効果は流れの変化が緩やかなところでは流束差分分離法に比べて弱いといえる．
これら２つの解法の流束の計算式は次のようになる．
流束差分分離法：

Fi+1=2 = Fi+ + 61 F~ +i;1=2 + 31 F~i++1=2 + Fi;+1 ; 61 F~i;+3=2 ; 13 F~ ;i+1=2
Fj+1=2 = Ai+1=2 qj+1=2 or = Rj+1=2 jsigni+1=2 j(Lq)j+1=2

有限体積法：

nFi+1=2 = 21 F (qi+1=2L ) + F (qi+1=2R ) ;= F (qi+1=2L ) += F (qi+1=2R ) ;X ;   kkk @ wk r

X
kj k j@ wk r ko

(16.105a)(16.105b)

X +   kkk @ w k r

qi+1=2L = qi + 16 q~i;1=2 + 13 q~i+1=2 qi+1=2R = qi+1 ; 61 q~i+3=2 ; 13 q~i+1=2

なお有限体積法の３つの式は等価である．

まず流れが十分に滑らかに変化している場合，minmod 制限関数が働かず境界の跳躍量が無視できる場合を考える．これら２つの解法の式は異なる考えに基づいて導かれたものであるがかなりの類似性がある．これら２つの解法で中間点またはセル境界の流束 Fi+1=2 = Ai+1=2 qi+1=2 は，qi+1=2 の部分のみが精度良く求められ，Ai+1=2 の部分は点 i +1=2 の値が用いられる．またその計算式は，Fi;1  Fi  Fi+1 からの 2 次補間式ではなく，流束差分分離法では (Fx )i = (Fi+1=2;Fi;1=2 )=x が 3 次相当精度で計算されるようにしたもの，他方 有限体積法では関数 q (x) を区分的 2 次式で近似したときのセル境界値を求める式である．このように異なる考えから導かれたものではあるが，これら２つの解法の式は形式的に同じものになり，精度も同等で 3 次である．跳躍量を考慮し Roe の近似リーマン解を補ったものも形式的には 3 次であるが，minmod

制限関数が働けば 2 次に落ちる．

数値計算例

16.6

I

45

数値計算例 I

本節にはまずプログラムに用いられる計算法について補足説明する．次にスカラー輸送方程式の初期値問題とリーマン問題の，プログラムと計算結果を示す．

16.6.1

計算法の補足下記のプログラムでは時間積分は Runge-Kutta 法で陽的にまたは Crank-Nicholson 予測子修正子法で陰的に行われる．まず常微分方程式 ut + fx(u) = 0 の初期値問題を解く Runge-Kutta 公式を結果のみ示す．

2 次公式： un+1 = un + 12 (k1 + k2 )(16.106)

3 次公式：(16.107)

4 次公式：

k1 = ;t fx(un ) k2 = ;t fx(un + k1 )un+1 = un + 16 (k1 +4k2 + k3)
k1 = ;t fx(un ) k = ;t fx(un + k1 =4)k2 = ;t fx(un + k=2) k3 = ;t fx(un + k2)
un+1 = un + 16 (k1 +2k2 +2k3 + k4 )k1 = ;t fx(un ) k2 = ;t fx(un + k1 =2)k = ;t fx(un +(k1 + k2)=4) k3 = ;t fx(un + k=2)
k4 = ;t fx(un + k )(16.108)

また Crank-Nicholson 予測子修正子法の式は@ a u(m) = ;(u(m;1) ; un ) + 1 (rhsn + rhs(m;1) ) rhs = ;tf
1+ t @xx2

(16.109)である．その予測子の計算では右辺の u(0) = un ，rhs(0) = rhsn と置いて u(1) を求め，予測子 u(1) =u(0)+u(1) を求める．次にこのようにして求めた u(1) を上式に用い修正子 u(2) を求める．なお通常， = 1=2に取られ，u(m) の値は 3 重対角行列の連立 1 次方程式をガウス消去法で解くことによって求められる．実際の計算では修正子 u(2) は予測子 u(1) と明らかに違うが，更に反復して求めた修正子 u(3) は u(2) と最大
1000 分の幾つか違う程度で，通常は u(3) までで十分である．
次に制限関数に関して述べる．最も良く知られているものは minmod 制限関数で， (r) = minmod(r 1) =max0 min(r 1)] のように定義される．2 次上流差分と 2 次中心差分の数値流束はこの minmod 関数を用
いて TVD 化すれば次のようになる．

8> f(R > 1) (2 次中心差分)
1 minmod(R 1)f = f + 1 < 1=2
h1UD
=
f
+
f
(0  R  1) (2 次上流差分)
0
0
1=2
=2
2
2>
: 0 ;1=2 (R < 0) (1 次上流差分)
8>(2 次上流差分)<f;1=2 (r > 1)11CD
h1=2 = f0 + 2 minmod(r 1)f;1=2 = f0 + 2 >f1=2 (0  r  1) (2 次中心差分):0(r < 0) (1 次上流差分)

ただし r = 1=R = f1=2 =f;1=2 である．この制限関数は勾配 f1=2 または f;1=2 の大きさを隣の勾配

f;1=2 または f1=2 と比較し制限するもので，勾配制限関数と呼ばれる．つまり当該勾配と隣の勾配の大きさを比較し小さい方を取ることによってスキームを安定化しようとするものでその考え方は分かり易い．

46

圧縮性流れの解法|１次元 Euler 方程式

minmod 関数を用いた 3 次 Chakravarthy-Osher TVD スキームの数値流束は次のようになる．
1
1
h1(3)
=2 = f0 + 6 minmod(br 1)f;1=2 + 3 minmod(r b)f;1=28>1+2b(r > b )><1+2r (1=b  r  b) (3 次上流差分)
1
1= f0 + 2 f;1=2  3 >(16.110)(b +2)r (0  r < 1=b)>:0
(r < 0)(1 次上流差分)
上式の 2 次中心差分の部分の minmod(r b)f;1=2 = minmod(f1=2  bf;1=2 ) は，当該勾配 f1=2 の大きさを隣の勾配 f;1=2 を b 倍したものと比較し 制限するものである．3 次上流差分で精度良く計算する

範囲を確保するために，f1=2 の大きさが f;1=2 より大になってもただちに制限関数が働かないように，
通常 b > 1 に取られる．逆に b < 1 に取ることは，f1=2 の大きさが f;1=2 より小であるにもかかわらず更に小にすることで通常あり得ないことである．上式の 2 次上流差分の部分 minmod(br 1)f;1=2 =minmod(f;1=2  bf1=2) は，当該勾配 f;1=2 の大きさを隣の勾配 f1=2 を b 倍したものと比較し制限するもので，中心差分の場合と同様のことが言える．下図参照．

minmod(r b)
2minmod(br 1)
2

1

b>1
b=1
b<1

;
;

;;

;

;1

;
0

1

;; b > 1; bb<=11
;
0
1
2
H
H

H
H

H
H

1

2

;1

3 r

3 r

次に他の制限関数について述べる．図 16.12 は基本的制限関数のいくつかを示したものである．TVD ス
キームの数値流束を一般に

h1=2 = f0 + 21  (r)f;1=2(16.111)のように表すことにする．制限関数  (r) は必ず  (1) = 1 の点を通る．これは f (x) が直線で２つの勾配

f;1=2 と f1=2 が等しいときには制限関数は不要で，数値流束 f1=2 はこの線上に取られるということである．またすべての制限関数は上記の minmod(r 1) と P.L. Roe によって提示された `superbee' と呼ばれsuperbee

 (r)

2

;

minmod(r 2)
minmod(2r (2r +1)=3 2)

;
;
; 
;

;
;
@

;

1


;
;
;




@

;
;
;
;

 

@

;


;

;
0


;

1

2

3

図 16.12: 各種制限関数rminmod(r 1)
4

数値計算例

I

47

る制限関数 superbee = max0 min(2r 1) min(r 2)] の間の領域に入る．minmod 関数では２つの勾配の大きさを比べ小さい方が取られたのに対し superbee では大きい方が取られる．また superbee では２つの勾配比は 2 以下に制限される．つまり，スキームを TVD 化するためには数値流束の勾配そのものの大きさは小さくしても大きくしても良いが，勾配比すなわち曲率の大きさは制限しなければならないということである．

次に制限関数 superbee について述べる．2 次上流差分と 2 次中心差分の数値流束は関数 superbee を用いて TVD 化すれば同じものになる．

1
CD
h1UD
=2 = h1=2 = f0 + 2 superbee(r)f;1=28>
2(r > 2)>>r(1
 r  2) (2 次中心差分)<1= f0 + 2 f;1=2 1 (1=2  r < 1) (2 次上流差分)>>
2r (0  r < 1=2)>
: 0 (r < 0) (1 次上流差分)
したがって superbee を用いた 3 次 Chakravarthy-Osher TVD スキームの数値流束も同じものになり，その精度は 2 次になる．関数 superbee が制限関数の上方の限界になる理由は，minmod(r 1) が下方の限界になるのと同様である．superbee は当該勾配の大きさを隣の勾配と比較し大の方を取るもので，superbee の線の上にある制限関数は比較対象の勾配を超えて更に大にするもので，これは解の精度を損ね不安定性をまね

くおそれのあるものである．図 16.12 において， (r) = r の線は 2 次中心差分， (r) = 1 は 2 次上流差分，

 (r) = 0 は 1 次上流差分， (r) = (1+2r)=3 は 3 次上流差分を表し ，また  (r) = 2r の線は 2 次中心差分の h1=2 が極値にならない限界， (r) = 2 の線は 2 次上流差分の h1=2 が極値にならない限界を示している．
なお Chakravarthy-Osher スキームは 2 次上流差分と 2 次中心差分の線形結合を取ることによって精度を3 次に改善したものであるが，同じことは 2 次上流差分または 2 次中心差分の制限関数を次のように選ぶことによっても実現できる．

1
1
h1(3)
=2 = f0 + 2 minmod(2R (2+ R)=3 2)f1=2 = f0 + 2 minmod(2r (2r +1)=3 2)f;1=28>
2(r > 2:5)><(1+2r)=3 (0:25  r  2:5) (3 次上流差分)1= f0 + 2 f;1=2(16.112)2r(0  r < 0:25)>>:0(r < 0)(1 次上流差分)

4816.6.2

圧縮性流れの解法|１次元 Euler 方程式

スカラー輸送方程式の初期値問題

まずここで解く１次元スカラー輸送方程式の初期値問題について説明する．ここでは波の位相速度 a = 1，

波の伝播時間 tt = T = 2 に与えているが，これらの値は任意に与えることもできる．例えば a =;1 に取れば ，PARAMETER is=-200,if=100 に変更することになる．クーラン数 CFL は 0.25, 0.50, 0.75, 1.0 から選ばれるが，任意に与えることもできる．初期の波形は PROBLEM 1 の矩形波または PROBLEM 2 の帆船波から選ばれる．これらの波は一様速度で分散せずに伝播する．

ここでは mode=11 から mode=84 までの都合 15 通りの解法を用意した．サブルーチン CALFVS, CALFDS,CALFVM は，この１次元問題を圧縮性流れへ拡張したときに，それぞれ流束ベクトル分離法，流束差分分離

n法，有限体積法になるものである．計算で求めた時間 T における波形，スカラー量 u(xi  T ) = ui f の値は，
配列 ur に記憶され，ファイル OUTPUT.dat とグラフィックサブルーチン SCALARG によりパソコン画面上に出力される．次に FORTRAN 95/90 Free source form で書かれたプログラムを示す．

PROGRAM MAIN!******************************************************************************************! Problem: Initial value problem of 1D scalar transport equation! Numerical Method: Flux vector splitting, Flux difference splitting, finite volume method!******************************************************************************************PARAMETER(is=0,if=300)
DIMENSION x(is:if),u(is:if),u0(is:if),ur(0:100,0:18),ii(0:100),cfld(8)CHARACTER*30 zm(100),z(24)COMMON na,dt,dx,aDATA dx,pi/.01, 3.14159/!dx:pitch of calculating points
FORALL(i=is:if)x(i)=dx*i
DATA a,tt/1., 2./!Set a:phase velocity and tt:total phys time, should be taken |a|*tt<=2.
DATA cfld/.1, .25, .5, .75, 1., 1.25, 1.6, 2./
CFL=cfld(4) dt=CFL*dx/ABS(a)!Choose CFL number from cfld, CFL=|a|*dt/dx.
naf=INT(tt/dt+.5)!tt=dt*naf, naf:max iteration number! Initial data
IProblem=1!Choose IProblem=1(rectangle wave) or =2(sail-boat wave)
IF(IProblem==1)FORALL(i=35:65)u0(i)=1.
IF(IProblem==2)THENFORALL(i=20:50)u0(i)=SIN(.4*pi*FLOAT(i-20)/30)/SIN(.4*pi)
FORALL(i=51:80)u0(i)=.4*(SIN(.5*pi+pi/3.*FLOAT(i-50)/30)-.5)
ENDIF
FORALL(i=0:100)ur(i,0)=u0(i)!exact solution
i00=INT(a*tt/dx+1000.1)-1000
FORALL(i=0:100)ii(i)=i00+izm( 1)='blank'zm(11)='Roe scheme, explicit Euler' !mode=11zm(21)='QUICK, 3rd-order RK' !mode=21zm(22)='QUICK, CNpcm' !mode=22zm(41)='3rd CO and RK, minmod' !mode=41zm(42)='3rd CO and RK, superbee' !mode=42zm(43)='3rd CO, CNpcm, minmod' !mode=43zm(44)='3rd CO, CNpcm, superbee' !mode=44zm(61)='MUSCL, 2-step, minmod' !mode=61zm(62)='MUSCL, 2-step, superbee' !mode=62zm(63)='2nd Roe scheme, minmod' !mode=63zm(64)='2nd Roe scheme, superbee' !mode=64zm(81)='3rd FVM and RK, minmod' !mode=81zm(82)='3rd FVM and RK, superbee' !mode=82
zm(83)='3rd FVM, CNpcm, minmod' !mode=83
zm(84)='3rd FVM, CNpcm, superbee' !mode=84

数値計算例I!2nd: 2nd-order
Roe: 1st-order Roe scheme
CO: Chakravarthy-Osher type scheme!FVM: finite volume method
Euler: 1st-order forward Euler!RK: Runge-Kutta method
CNpcm: Crank-Nicholson predictor-corrector method! Solution of 1D scalar transport equation
DO k=1,18
SELECT CASE(k)CASE(1)  mode=11
CASE(2)  mode=21
CASE(3)  mode=22
CASE(4)  mode=41
CASE(5)  mode=42
CASE(6)  mode= 0
CASE(7)  mode=43
CASE(8)  mode=44
CASE(9)  mode= 0
CASE(10) mode=61
CASE(11) mode=64
CASE(12) mode= 0
CASE(13) mode=81
CASE(14) mode=82
CASE(15) mode= 0
CASE(16) mode=83
CASE(17) mode=84
CASE(18) mode= 0
ENDSELECTz(k)=zm(mode)
FORALL(i=is:if)u(i)=u0(i)na=0 100 na=na+1
IF(mode<=29)
CALL CALFVS(x,u,is,if,mode) !flux vector splittingIF(mode>29.AND.mode<60)CALL CALFDS(x,u,is,if,mode) !flux-difference splittingIF(mode>=60)
CALL CALFVM(x,u,is,if,mode) !finite volume methods
IF(na<naf)
GOTO 100
FORALL(i=0:100)ur(i,k)=u(i00+i)
ENDDO! Output of computational results
OPEN(20,FILE='OUTPUT.dat')
DO k=1,18
WRITE(20,'(//1H 2X A6,A6,I3,3X A30,A6/)')'***** ','mode =',mode,z(k),' *****'
DO l=0,3 il=l*25
WRITE(20,'(2X 26F9.3)')( ur(i,k),i=il,il+25)
WRITE(20,'(
26I9/ )')(ii(i),i=il,il+25)
ENDDO ENDDO
CLOSE(20)
CALL SCALARG(x,ur,is,if,z)!Graphics
STOP
END PROGRAM MAIN
! ********** Solve 1D scalar transport equation by flux vector splitting
SUBROUTINE CALFVS(x,u,is,if,mode)
DIMENSION x(is:if),u(is:if),f(is:if), &v(is:if),uks(is:if),uk1(is:if),uk2(is:if),uk3(is:if), & !use only for Runge-Kutta
u1(is:if),f1(is:if),rhs(is:if),c(is:if,3)!use only for CNpcm
COMMON na,dt,dx,aFORALL(i=is:if)v(i)=u(i)IF(mode==11)THEN !Roe scheme
CALL FLUXR(u,f,is,if)
FORALL(i=is+2:if-2)u(i)=u(i)-dt/dx*(f(i)-f(i-1))
ENDIF
IF(mode==21)THEN !QUICK scheme, 3rd-order Runge-Kutta
CALL FLUXQ(u,f,is,if)
FORALL(i=is+3:if-3)
uk1(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uk1(i)/4.
ENDFORALLCALL FLUXQ(v,f,is,if)
FORALL(i=is+3:if-3)
uks(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uks(i)/2.
ENDFORALL

49

50

圧縮性流れの解法|１次元 Euler 方程式

CALL FLUXQ(v,f,is,if)
FORALL(i=is+3:if-3)
uk2(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uk2(i)ENDFORALLCALL FLUXQ(v,f,is,if)
FORALL(i=is+3:if-3)
uk3(i)=-dt/dx*(f(i)-f(i-1))u(i)=u(i)+(uk1(i)+4.*uk2(i)+uk3(i))/6.
ENDFORALL
ENDIF
IF(mode==22)THEN !QUICK scheme, Crank-Nicholson predictor-corrector method
ib=is+3 ie=if-3 dxt=dt*.5/dx am=(a-ABS(a))/2. ap=(a+ABS(a))/2.
FORALL(i=is:if)u1(i)=u(i)CALL FLUXQ(u,f,is,if)
m=-1 100 m=m+1
CALL FLUXQ(u1,f1,is,if)
DO i=ib,iec(i,1)=-dxt*ap
c(i,2)=1.+dxt*(ap-am)c(i,3)=dxt*amrhs(i)=-(u1(i)-u(i))-dxt*(f(i)-f(i-1)+f1(i)-f1(i-1))!right hand side
ENDDO
CALL GAUSS3(c,rhs,is,if,ib,ie)
FORALL(i=ib:ie)u1(i)=u1(i)+rhs(i)IF(m<2)
GOTO 100
FORALL(i=ib:ie)u(i)=u1(i)ENDIF
END SUBROUTINE CALFVS! ********** FLUXRSUBROUTINE FLUXR(u,f,is,if)
DIMENSION u(is:if),f(is:if)
COMMON na,dt,dx,a ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
FORALL(i=is+1:if-2)f(i)=ap*u(i)+am*u(i+1)
ENDSUBROUTINE FLUXR! ********** FLUXQSUBROUTINE FLUXQ(u,f,is,if)
DIMENSION u(is:if),f(is:if)
COMMON na,dt,dx,a ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
FORALL(i=is+2:if-3)f(i)=ap*(-u(i-1)+6.*u(i)+3.*u(i+1))/8.+am*(3.*u(i)+6.*u(i+1)-u(i+2))/8.
ENDSUBROUTINE FLUXQ! ********** Solve 1D scalar transport eq by flux difference splitting
SUBROUTINE CALFDS(x,u,is,if,mode)
DIMENSION x(is:if),u(is:if),f(is:if),fdc(10),fdc1(10), &v(is:if),uks(is:if),uk1(is:if),uk2(is:if),uk3(is:if), & !only use for Runge-Kutta
u1(is:if),f1(is:if),rhs(is:if),c(is:if,3)!only use for CNpcm
COMMON na,dt,dx,aFORALL(i=is:if)v(i)=u(i)IF(mode==41.OR.mode==42)THEN !CO scheme, 3rd-order Runge-Kutta
CALL FLUXCO(u,f,is,if,mode)
FORALL(i=is+3:if-3)
uk1(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uk1(i)/2.
ENDFORALL

数値計算例I

CALL FLUXCO(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uks(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uks(i)/2.
ENDFORALLCALL FLUXCO(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uk2(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uk2(i)ENDFORALLCALL FLUXCO(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uk3(i)=-dt/dx*(f(i)-f(i-1))u(i)=u(i)+(uk1(i)+4.*uk2(i)+uk3(i))/6.
ENDFORALL
ENDIF
IF(mode==43.OR.mode==44)THEN !CO scheme, Crank-Nicholson predictor-corrector method
ib=is+3 ie=if-3 dxt=.5*dt/dx ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
FORALL(i=is:if)u1(i)=u(i)CALL FLUXCO(u,f,is,if,mode)
m=-1 100 m=m+1
CALL FLUXCO(u1,f1,is,if,mode)
DO i=ib,iec(i,1)=-dxt*ap
c(i,2)=1.+dxt*(ap-am)c(i,3)=dxt*amrhs(i)=-(u1(i)-u(i))-dxt*(f(i)-f(i-1)+f1(i)-f1(i-1))!right hand side
ENDDO
CALL GAUSS3(c,rhs,is,if,ib,ie)
FORALL(i=ib:ie)u1(i)=u1(i)+rhs(i)IF(m<2)
GOTO 100
FORALL(i=ib:ie)u(i)=u1(i)ENDIF
ENDSUBROUTINE CALFDS! ********** FLUXCO
SUBROUTINE FLUXCO(u,f,is,if,mode)
DIMENSION u(is:if),f(is:if)
COMMON na,dt,dx,a ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
b=2.
DO i=is+2,if-3
dua=u(i)-u(i-1) du0=u(i+1)-u(i) du1=u(i+2)-u(i+1)
IF(mode==41.OR.mode==43)THEN
f(i)=ap*(u(i) +AMINMOD(dua,b*du0)/6.+AMINMOD(du0,b*dua)/3.) &+am*(u(i+1)-AMINMOD(du1,b*du0)/6.-AMINMOD(du0,b*du1)/3.)ELSE
f(i)=ap*(u(i)+SUPERBEE(dua,du0)/2.)+am*(u(i+1)-SUPERBEE(du1,du0)/2.)
ENDIF
ENDDO
ENDSUBROUTINE FLUXCO! ********** Solve 1D scalar transport eq by finite volume method
SUBROUTINE CALFVM(x,u,is,if,mode)
DIMENSION u(is:if),f(is:if), &v(is:if),uks(is:if),uk1(is:if),uk2(is:if),uk3(is:if), & !only use for Runge-Kutta
u1(is:if),f1(is:if),rhs(is:if),c(is:if,3)!only use for CNpcm
COMMON na,dt,dx,aFORALL(i=is:if)v(i)=u(i)

51

52

圧縮性流れの解法|１次元 Euler 方程式

IF(mode==61)THEN !MUSCL, 2-step time integration
CALL FLUXM(u,f,is,if)
FORALL(i=is+2:if-2)v(i)=u(i)-dt/(2.*dx)*(f(i)-f(i-1))
CALL FLUXM(v,f,is,if)
FORALL(i=is+2:if-2)u(i)=u(i)-dt/dx*(f(i)-f(i-1))
ENDIF
IF(mode==63.OR.mode==64)THEN !2nd-order Roe scheme
CALL FLUXR2(u,f,is,if,mode)
FORALL(i=is+2:if-2)u(i)=u(i)-dt/dx*(f(i)-f(i-1))
ENDIF
IF(mode==81.OR.mode==82)THEN !3rd-order FVM and 3rd-order Runge-Kutta
CALL FLUX3(u,f,is,if,mode)
FORALL(i=is+2:if-2)
uk1(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uk1(i)/4.
ENDFORALLCALL FLUX3(v,f,is,if,mode)
FORALL(i=is+2:if-2)
uks(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uks(i)/2.
ENDFORALLCALL FLUX3(v,f,is,if,mode)
FORALL(i=is+2:if-2)
uk2(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uk2(i)ENDFORALLCALL FLUX3(v,f,is,if,mode)
FORALL(i=is+2:if-2)
uk3(i)=-dt/dx*(f(i)-f(i-1))u(i)=u(i)+(uk1(i)+4.*uk2(i)+uk3(i))/6.
ENDFORALL
ENDIF
IF(mode==83.OR.mode==84)THEN !3rd-order FVM, Crank-Nicholson predictor-corrector method
ib=is+3 ie=if-3 dxt=.5*dt/dx ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
FORALL(i=is:if)u1(i)=u(i)CALL FLUX3(u,f,is,if,mode)
m=-1 100 m=m+1
CALL FLUX3(u1,f1,is,if,mode)
DO i=ib,iec(i,1)=-dxt*ap
c(i,2)=1.+dxt*(ap-am)c(i,3)=dxt*amrhs(i)=-(u1(i)-u(i))-dxt*(f(i)-f(i-1)+f1(i)-f1(i-1))!right hand side
ENDDO
CALL GAUSS3(c,rhs,is,if,ib,ie)
FORALL(i=ib:ie)u1(i)=u1(i)+rhs(i)IF(m<2)
GOTO 100
FORALL(i=ib:ie)u(i)=u1(i)ENDIF
ENDSUBROUTINE CALFVM! ********** FLUXM
SUBROUTINE FLUXM(u,f,is,if)
DIMENSION u(is:if),f(is:if)
COMMON na,dt,dx,a ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
DO i=is+1,if-2

数値計算例I

dua=u(i)-u(i-1) du0=u(i+1)-u(i) du1=u(i+2)-u(i+1)
ul=u(i )+.5*AMINMOD(dua,du0)
ur=u(i+1)-.5*AMINMOD(du0,du1)
f(i)=ap*ul+am*ur
ENDDO
ENDSUBROUTINE FLUXM! ********** FLUXR2SUBROUTINE FLUXR2(u,f,is,if,mode)
DIMENSION u(is:if),f(is:if)
COMMON na,dt,dx,a ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
DO i=is+1,if-2
dua=u(i)-u(i-1) du0=u(i+1)-u(i) du1=u(i+2)-u(i+1)
IF(mode==63)THEN
ul=u(i )+.5*AMINMOD(dua,du0)
ur=u(i+1)-.5*AMINMOD(du0,du1)
ELSE
ul=u(i )+.5*SUPERBEE(dua,du0)
ur=u(i+1)-.5*SUPERBEE(du0,du1)
ENDIF
ul=ul-dt/dx*a*(ul-u(i))
ur=ur-dt/dx*a*(u(i+1)-ur)
f(i)=ap*ul+am*ur
ENDDO
ENDSUBROUTINE FLUXR2! ********** FLUX3SUBROUTINE FLUX3(u,f,is,if,mode)
DIMENSION u(is:if),f(is:if)
COMMON na,dt,dx,a ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
b=2.
DO i=is+1,if-2
dua=u(i)-u(i-1) du0=u(i+1)-u(i) du1=u(i+2)-u(i+1)
IF(mode==81.OR.mode==83)THEN
f(i)=ap*(u(i )+AMINMOD(dua,b*du0)/6.+AMINMOD(du0,b*dua)/3.) &+am*(u(i+1)-AMINMOD(du1,b*du0)/6.-AMINMOD(du0,b*du1)/3.)ELSE
f(i)=ap*(u(i)+SUPERBEE(dua,du0)/2.)+am*(u(i+1)-SUPERBEE(du1,du0)/2.)
ENDIF
ENDDO
ENDSUBROUTINE FLUX3! ********** Limiter minmod
FUNCTION AMINMOD(x,y)
s=SIGN(1.,x) AMINMOD=s*MAX(0.,MIN(ABS(x),s*y))
END FUNCTION! ********** Limiter superbee
FUNCTION SUPERBEE(x,y)
s=SIGN(1.,x) SUPERBEE=s*MAX(0.,MIN(2.*ABS(x),s*y),MIN(ABS(x),2.*s*y))
END FUNCTION! ********** Gaussian elimination for linear eqns with tri-diagonal matrix
SUBROUTINE GAUSS3(c,b,is,if,ib,ie)
DIMENSION c(is:if,3),b(is:if)
DO i=ib,ie-1b(i)=b(i)/c(i,2) c(i,3)=c(i,3)/c(i,2)

53

54

圧縮性流れの解法|１次元 Euler 方程式

図 16.13: 矩形波 a = 1 T = 2 CFL = 0:50b(i+1)=b(i+1)-c(i+1,1)*b(i)c(i+1,2)=c(i+1,2)-c(i+1,1)*c(i,3)ENDDOb(ie)=b(ie)/c(ie,2)
DO i=ie-1,ib,-1b(i)=b(i)-c(i,3)*b(i+1)
ENDDO
ENDSUBROUTINE GAUSS3

グラフィックサブルーチン SCALARG は省略した．サブルーチンの中身は，本文中の式や記号をほとんどそのままコード 化しているので，だいたい分かると思うが，以下にはサブルーチン CALFDS の mode=41 から mode=44 の部分を例に簡単に説明する．

はじめに FORALL(i=is:if)v(i)=u(i) と置くのは計算領域の両端にデータを入れるためで，Runge-Kutta

法の計算は全領域ではなく uis +3

 ui ;3 の範囲で行われる．FLUXCO は制限関数 minmod または superbeefを用いた Chakravarthy-Osher 型 TVD スキームの数値流束を求めるサブルーチンで，既知の ui から位相速度 ap,am = a に対し流束 f(i) = fi+1=2 を計算するものである．なお dua = ui;1=2 ，du0 = ui+1=2 ，

du1 =ui+3=2 である．Crank-Nicholson 予測子修正子法の計算では，３重対角行列の連立 1 次方程式が解かれる．rhs,c はそれぞれ３重対角行列の連立 1 次方程式の右辺! 解ベクトルまたは係数行列の配列，

数値計算例I55

図 16.14: 矩形波 a = 1 T = 2 CFL = 0:75
GAUSS3 はこの連立 1 次方程式をガウス消去法で解くサブルーチンである．is if のうち ib  ie の部分

だけにデータが入り，この部分だけが計算されるようになっている．

計算の結果を図??〜??に示す．図 16.13 〜 16.15 は矩形波，図 16.16 〜 16.18 は帆船波の場合のものである．それぞれレ イノルズ数 0.5, 0.75 または 1.0 の結果を示したが，一般的実用問題では，レ イノルズ数は空間で変化するので，広いレ イノルズ数の範囲で良い結果の得られるスキームが選ばれるべきである．このような不連続を含む問題では

mode=42 の 3 次 Chakravarthy-Osher TVD スキーム+3 次 Runge-Kutta 法
mode=64 の 2 次 Roe スキーム

mode=82 の 3 次有限体積法+3 次 Runge-Kutta 法に制限関数 superbee を用いたものが優れている．しかしながらどの方法も，見解の相違もあろうが不連続を十分に捕らえているとはいえない．

56

圧縮性流れの解法|１次元 Euler 方程式

図 16.15: 矩形波 a = 1 T = 2 CFL = 1:00

16.6.3 リーマン問題
リーマン問題のプログラムを以下に示す．計算領域 0 x  10 に密度，流速，静圧の初期値，u = 0 と = p = 10 (x  4) = 0:1 (x > 4) を与え，オイラー方程式の初期値問題を上述の解法の中の９つで解く．
計算は時間 T = t  nf = 2 まで行い，その時点の  u p の値を OUTPUT.dat ファイルに，それらのグラフをパソコン画面上に出力する．サブルーチンの説明はプログラムの後でする．
PROGRAM MAIN!******************************************************************************************! Problem: Riemann Shock Tube Flow Problem! Numerical Method: Flux vector splitting, Flux difference splitting, finite volume method!******************************************************************************************PARAMETER(if=100)
DIMENSION x(0:if),q(0:if,3),q0(0:if,3),qs(0:if,3,0:9),rho(0:100),u(0:100),p(0:100),ii(0:if)
CHARACTER*30 zm(100),z(9)COMMON na,dt,dx,akDATA dx,dt,naf,ak/.1, .01, 200, 1.4/
!naf:iteration number
FORALL(i=0:if)ii(i)=i
FORALL(i=0:if)x(i)=dx*i! Initial data
DATA rho/41*1., 60*.1/ u/101*0./ p/41*1., 60*.1/

数値計算例I

図 16.16: 帆船波 a = 1 T = 2 CFL = 0:50
FORALL(i=0:if)q0(i,1)=rho(i) q0(i,2)=0. q0(i,3)=p(i)/(ak-1.)
ENDFORALL
zm(11)='Roe scheme, explicit Euler' !mode=11:zm(84)='3rd-order FVM, CNpcm, superbee' !mode=84! Solution of Riemann problem
DO k=1,9
SELECT CASE(k)CASE(1) mode=11
CASE(2) mode=21
CASE(3) mode=41
CASE(4) mode=42
CASE(5) mode=61
CASE(6) mode=64
CASE(7) mode=81
CASE(8) mode=82
CASE(9) mode=84
ENDSELECTz(k)=zm(mode)
FORALL(i=0:if,j=1:3)q(i,j)=q0(i,j)
na=0 100 na=na+1
IF(mode<=29)
CALL CALFVS(q,if,mode) !fluc vector splitting schemes
IF(mode>=30 .AND. mode<=59)CALL CALFDS(q,if,mode) !fluc difference splitting schemes
IF(mode>=60)
CALL CALFVM(q,if,mode) !finite volume methods
IF(na<naf)
GOTO 100
FORALL(i=0:if)

57

58

圧縮性流れの解法|１次元 Euler 方程式

図 16.17: 帆船波 a = 1 T = 2 CFL = 0:75
qs(i,1,k)=q(i,1) qs(i,2,k)=q(i,2)/q(i,1)
qs(i,3,k)=(ak-1.)*(q(i,3)-q(i,2)*qs(i,2,k)/2.)
ENDFORALL
ENDDO! Output of computational results
OPEN(20,FILE='OUTPUT.dat')
DO k=1,9
WRITE(20,'(//1H 2X A6,A6,I3,3X A30,A6/)')'***** ','mode =',mode,z(k),' *****'
DO l=0,3 il=l*25
WRITE(20,'(A10,26F9.3)')'density =',(qs(i,1,k),i=il,il+25)
WRITE(20,'(A10,26F9.3)')'velocity =',(qs(i,2,k),i=il,il+25)
WRITE(20,'(A10,26F9.3)')'pressure =',(qs(i,3,k),i=il,il+25)
WRITE(20,'(8X 26I9/ )')(ii(i),i=il,il+25)
ENDDO ENDDO
CLOSE(20)
CALL RIEMANNG(x,qs,if,z)!Graphics
STOP
END PROGRAM MAIN
! ********** Compute Riemann problem by flux vector splitting
SUBROUTINE CALFVS(q,if,mode)数値計算例I

図 16.18: 帆船波 a = 1 T = 2 CFL = 1:00
DIMENSION q(0:if,3),f(0:if,3), &u(0:if,3),uks(0:if,3),uk1(0:if,3),uk2(0:if,3),uk3(0:if,3), &!only use for RK
q1(0:if,3),f1(0:if,3),ap(3),am(3),amat(3,3),rhs(300),c(300,-5:5) !only use for CNpcm
COMMON na,dt,dx,ak
FORALL(i=0:if,j=1:3)u(i,j)=q(i,j)
IF(mode==11)THEN !Roe scheme, explicit Euler
CALL FLUXR(q,f,if)
FORALL(i=2:if-2,j=1:3)q(i,j)=q(i,j)-dt/dx*(f(i,j)-f(i-1,j))
ENDIF
IF(mode==21)THEN !QUICK scheme, 3rd-order Runge-Kutta
CALL FLUXQ(q,f,if)
FORALL(i=3:if-3,j=1:3)
uk1(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uk1(i,j)/4.
ENDFORALLCALL FLUXQ(u,f,if)
FORALL(i=3:if-3,j=1:3)
uks(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uks(i,j)/2.
ENDFORALLCALL FLUXQ(u,f,if)

59

60

圧縮性流れの解法|１次元 Euler 方程式

FORALL(i=3:if-3,j=1:3)
uk2(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uk2(i,j)
ENDFORALLCALL FLUXQ(u,f,if)
FORALL(i=3:if-3,j=1:3)
uk3(i,j)=-dt/dx*(f(i,j)-f(i-1,j))q(i,j)=q(i,j)+(uk1(i,j)+4.*uk2(i,j)+uk3(i,j))/6.
ENDFORALL
ENDIF
IF(mode==22)THEN !QUICK scheme, Crank-Nicholson predictor-corrector method
ib=3 ie=if-3 dxt=dt*.5/dx
FORALL(i=0:if,j=1:3)q1(i,j)=q(i,j)
CALL FLUXQ(q,f,if)
m=-1 100 m=m+1
CALL FLUXQ(q1,f1,if)
DO i=ib,ie
CALL SUBSD(i,q,if,r,u,H,c)
CALL AAA(u,c,ap,am)
CALL MATRIX(i,q,if,ap,amat)
DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii-3)=-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii )= dxt*amat(ii,jj)
ENDDO ENDDOCALL MATRIX(i,q,if,am,amat)
DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii )=c(3*i-3+ii,jj-ii)-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii+3)= dxt*amat(ii,jj)
ENDDO ENDDO
DO j=1,3c(3*i-3+j,0)=c(3*i-3+j,0)+1.
rhs(3*i-3+j)=-(q1(i,j)-q(i,j))-dxt*(f(i,j)-f(i-1,j)+f1(i,j)-f1(i-1,j))
ENDDO ENDDOCALL GAUSSB(c,rhs,300,3*ib-2,3*ie,-5,5)
FORALL(i=ib:ie,j=1:3)q1(i,j)=q1(i,j)+rhs(3*i-3+j)IF(m<2)
GOTO 100
FORALL(i=ib:ie,j=1:3)q(i,j)=q1(i,j)
ENDIF
END SUBROUTINE CALFVS! ********** FLUXRSUBROUTINE FLUXR(q,f,if)
DIMENSION q(0:if,3),f(0:if,3),ap(3),am(3),fp(3),fm(3)COMMON na,dt,dx,ak
DO i=1,if-2
CALL SUBSD(i ,q,if,r0,u0,H0,c0)
CALL SUBSD(i+1,q,if,r1,u1,H1,c1)
CALL AAA((u0+u1)/2.,(c0+c1)/2.,ap,am)
CALL SUBFVS(r0,u0,H0,c0,ap,fp)
CALL SUBFVS(r1,u1,H1,c1,am,fm)
FORALL(j=1:3)f(i,j)=fp(j)+fm(j)ENDDO
ENDSUBROUTINE FLUXR! ********** FLUXQSUBROUTINE FLUXQ(q,f,if)
DIMENSION q(0:if,3),f(0:if,3),ap(3),am(3),fap(3),f0p(3),f1p(3),f0m(3),f1m(3),f2m(3)数値計算例I

COMMON na,dt,dx,ak
DO i=1,if-2
CALL SUBSD(i ,q,if,r0,u0,H0,c0)
CALL SUBSD(i+1,q,if,r1,u1,H1,c1)
CALL AAA((u0+u1)/2.,(c0+c1)/2.,ap,am)
CALL SUBFVS(r0,u0,H0,c0,ap,f0p)
CALL SUBFVS(r0,u0,H0,c0,am,f0m)
CALL SUBFVS(r1,u1,H1,c1,ap,f1p)
CALL SUBFVS(r1,u1,H1,c1,am,f1m)
CALL SUBSD(i-1,q,if,r,u,H,c) CALL SUBFVS(r,u,H,c,ap,fap)
CALL SUBSD(i+2,q,if,r,u,H,c) CALL SUBFVS(r,u,H,c,am,f2m)
FORALL(j=1:3)f(i,j)=(-fap(j)+6.*f0p(j)+3.*f1p(j))/8.+(3.*f0m(j)+6.*f1m(j)-f2m(j))/8.
ENDDO
ENDSUBROUTINE FLUXQ! **********SUBROUTINE SUBFVS(r,u,H,c,a,f)
DIMENSION a(3),f(3)COMMON na,dt,dx,ak
c1=(ak-1.)*r/ak c2=r/(2.*ak)
f(1)=c1*a(1)+c2*a(2)+c2*a(3)f(2)=c1*a(1)*u+c2*a(2)*(u+c) +c2*a(3)*(u-c)f(3)=c1*a(1)*u*u/2.+c2*a(2)*(H+c*u)+c2*a(3)*(H-c*u)
ENDSUBROUTINE! ********** Compute Riemann problem by flux difference splitting
SUBROUTINE CALFDS(q,if,mode)
DIMENSION q(0:if,3),f(0:if,3), &u(0:if,3),uks(0:if,3),uk1(0:if,3),uk2(0:if,3),uk3(0:if,3), &!only use for RK
q1(0:if,3),f1(0:if,3),ap(3),am(3),amat(3,3),rhs(300),c(300,-5:5) !only use for CNpcm
COMMON na,dt,dx,ak ak1=ak-1.
FORALL(i=0:if,j=1:3)u(i,j)=q(i,j)
IF(mode==41.OR.mode==42)THEN !CO scheme, 3rd-order Runge-Kutta
CALL FLUXCO(q,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk1(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uk1(i,j)/2.
ENDFORALLCALL FLUXCO(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uks(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uks(i,j)/2.
ENDFORALLCALL FLUXCO(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk2(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uk2(i,j)
ENDFORALLCALL FLUXCO(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk3(i,j)=-dt/dx*(f(i,j)-f(i-1,j))q(i,j)=q(i,j)+(uk1(i,j)+4.*uk2(i,j)+uk3(i,j))/6.
ENDFORALL
ENDIF
IF(mode==43.OR.mode==44)THEN !CO scheme, Crank-Nicholson predictor-corrector method
ib=3 ie=if-3 dxt=.5*dt/dx
FORALL(i=0:if,j=1:3)q1(i,j)=q(i,j)
CALL FLUXCO(q,f,if,mode)

61

62

圧縮性流れの解法|１次元 Euler 方程式

m=-1 100 m=m+1
CALL FLUXCO(q1,f1,if,mode)
DO i=ib,ie
CALL SUBSD(i,q,if,r,u,H,c)
CALL AAA(u,c,ap,am)
CALL MATRIX(i,q,if,ap,amat)
DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii-3)=-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii )= dxt*amat(ii,jj)
ENDDO ENDDOCALL MATRIX(i,q,if,am,amat)
DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii )=c(3*i-3+ii,jj-ii)-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii+3)= dxt*amat(ii,jj)
ENDDO ENDDO
DO j=1,3c(3*i-3+j,0)=c(3*i-3+j,0)+1.
rhs(3*i-3+j)=-(q1(i,j)-q(i,j))-dxt*(f(i,j)-f(i-1,j)+f1(i,j)-f1(i-1,j))
ENDDO ENDDOCALL GAUSSB(c,rhs,300,3*ib-2,3*ie,-5,5)
FORALL(i=ib:ie,j=1:3)q1(i,j)=q1(i,j)+rhs(3*i-3+j)IF(m<2)
GOTO 100
FORALL(i=ib:ie,j=1:3)q(i,j)=q1(i,j)
ENDIF
END SUBROUTINE CALFDS! ********** FLUXCO
SUBROUTINE FLUXCO(q,f,if,mode)
DIMENSION q(0:if,3),f(0:if,3),ap(3),am(3),f0p(3),f1m(3),dfap(3),df0p(3),df0m(3),df1m(3)b=2.
DO i=2,if-3
CALL SUBSD(i ,q,if,r0,u0,H0,c0)
CALL SUBSD(i+1,q,if,r1,u1,H1,c1)
CALL AAA((u0+u1)/2.,(c0+c1)/2.,ap,am)
CALL SUBFVS(r0,u0,H0,c0,ap,f0p)
CALL SUBFVS(r1,u1,H1,c1,am,f1m)
u=(u0+u1)/2. H=(H0+H1)/2. c=(c0+c1)/2.
CALL SUBFDS(i-1,q,if,u,H,c,ap,dfap)
CALL SUBFDS(i ,q,if,u,H,c,ap,df0p)
CALL SUBFDS(i ,q,if,u,H,c,am,df0m)
CALL SUBFDS(i+1,q,if,u,H,c,am,df1m)
DO j=1,3
IF(mode==41.OR.mode==43)THEN
f(i,j)=f0p(j)+f1m(j)+AMINMOD(dfap(j),b*df0p(j))/6.+AMINMOD(df0p(j),b*dfap(j))/3. &-AMINMOD(df1m(j),b*df0m(j))/6.-AMINMOD(df0m(j),b*df1m(j))/3.
ELSE
f(i,j)=f0p(j)+f1m(j)+SUPERBEE(dfap(j),df0p(j))/2.-SUPERBEE(df1m(j),df0m(j))/2.
ENDIF
ENDDO ENDDO
ENDSUBROUTINE FLUXCO! ********** SUBFDSSUBROUTINE SUBFDS(i,q,if,u,H,c,a,df)
DIMENSION q(0:if,3),dq(3),a(3),df(3)COMMON na,dt,dx,ak ak1=ak-1.
FORALL(j=1:3)dq(j)=q(i+1,j)-q(i,j)
aa=(a(2)-a(3))/2.  ab=(a(2)+a(3))/2.-a(1)数値計算例I

dm=-u*dq(1)+dq(2)  dp=ak1*(u*u/2.*dq(1)-u*dq(2)+dq(3))
c1=(aa/c*dp+ab*dm) c2=(aa/c*dm+ab/(c*c)*dp)
df(1)=a(1)*dq(1)+c2df(2)=a(1)*dq(2)+c1 +c2*udf(3)=a(1)*dq(3)+c1*u+c2*H
ENDSUBROUTINE! ********** Compute Riemann problem by finite volume method
SUBROUTINE CALFVM(q,if,mode)
DIMENSION q(0:if,3),f(0:if,3), &u(0:if,3),uks(0:if,3),uk1(0:if,3),uk2(0:if,3),uk3(0:if,3), &!only use for RK
q1(0:if,3),f1(0:if,3),ap(3),am(3),amat(3,3),rhs(300),c(300,-5:5) !only use for CNpcm
COMMON na,dt,dx,ak
FORALL(i=0:if,j=1:3)u(i,j)=q(i,j)
IF(mode==61)THEN !MUSCL, 2-step time integration
CALL FLUXM(q,f,if,mode)
FORALL(i=2:if-2,j=1:3)u(i,j)=q(i,j)-dt/(2.*dx)*(f(i,j)-f(i-1,j))
CALL FLUXM(u,f,if,mode)
FORALL(i=2:if-2,j=1:3)q(i,j)=q(i,j)-dt/dx*(f(i,j)-f(i-1,j))
ENDIF
IF(mode==63.OR.mode==64)THEN !2nd-order Roe scheme
CALL FLUXR2(q,f,if,mode)
FORALL(i=2:if-2,j=1:3)q(i,j)=q(i,j)-dt/dx*(f(i,j)-f(i-1,j))
ENDIF
IF(mode==81.OR.mode==82)THEN !3rd-order FVM and 3rd-order Runge-Kutta
CALL FLUX3(q,f,if,mode)
FORALL(i=1:if-2,j=1:3)
uk1(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uk1(i,j)/4.
ENDFORALLCALL FLUX3(u,f,if,mode)
FORALL(i=1:if-2,j=1:3)
uks(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uks(i,j)/2.
ENDFORALLCALL FLUX3(u,f,if,mode)
FORALL(i=2:if-2,j=1:3)
uk2(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uk2(i,j)
ENDFORALLCALL FLUX3(u,f,if,mode)
FORALL(i=2:if-2,j=1:3)
uk3(i,j)=-dt/dx*(f(i,j)-f(i-1,j))q(i,j)=q(i,j)+(uk1(i,j)+4.*uk2(i,j)+uk3(i,j))/6.
ENDFORALL
ENDIF
IF(mode==83.OR.mode==84)THEN !3rd-order FVM, Crank-Nicholson predictor-corrector method
ib=3 ie=if-3 dxt=.5*dt/dx
FORALL(i=0:if,j=1:3)q1(i,j)=q(i,j)
CALL FLUX3(q,f,if,mode)
m=-1 100 m=m+1
CALL FLUX3(q1,f1,if,mode)
DO i=ib,ie
CALL SUBSD(i,q,if,r,u,H,c)
CALL AAA(u,c,ap,am)
CALL MATRIX(i,q,if,ap,amat)

63

64

圧縮性流れの解法|１次元 Euler 方程式

DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii-3)=-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii )= dxt*amat(ii,jj)
ENDDO ENDDOCALL MATRIX(i,q,if,am,amat)
DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii )=c(3*i-3+ii,jj-ii)-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii+3)= dxt*amat(ii,jj)
ENDDO ENDDO
DO j=1,3c(3*i-3+j,0)=c(3*i-3+j,0)+1.
rhs(3*i-3+j)=-(q1(i,j)-q(i,j))-dxt*(f(i,j)-f(i-1,j)+f1(i,j)-f1(i-1,j))
ENDDO ENDDOCALL GAUSSB(c,rhs,300,3*ib-2,3*ie,-5,5)
FORALL(i=ib:ie,j=1:3)q1(i,j)=q1(i,j)+rhs(3*i-3+j)IF(m<2)
GOTO 100
FORALL(i=ib:ie,j=1:3)q(i,j)=q1(i,j)
ENDIF
ENDSUBROUTINE CALFVM! ********** FLUXM
SUBROUTINE FLUXM(q,f,if,mode)
DIMENSION q(0:if,3),f(0:if,3),ql(3),qr(3),fl(3),fr(3),fi(3)COMMON na,dt,dx,ak ak1=ak-1.
DO i=1,if-2
DO j=1,3
dqa=q(i,j)-q(i-1,j) dq0=q(i+1,j)-q(i,j) dq1=q(i+2,j)-q(i+1,j)
ql(j)=q(i ,j)+.5*AMINMOD(dqa,dq0)
qr(j)=q(i+1,j)-.5*AMINMOD(dq0,dq1)
ENDDO
rl=ql(1) ul=ql(2)/rl pl=ak1*(ql(3)-ql(2)*ul/2.)
rr=qr(1) ur=qr(2)/rr pr=ak1*(qr(3)-qr(2)*ur/2.)
fl(1)=ql(2) fl(2)=ql(2)*ul+pl fl(3)=(ql(3)+pl)*ul
fr(1)=qr(2) fr(2)=qr(2)*ur+pr fr(3)=(qr(3)+pr)*ur
CALL ROEARS(rl,rr,ul,ur,pl,pr,fl,fr,fi)
FORALL(j=1:3)f(i,j)=fi(j)ENDDO
ENDSUBROUTINE FLUXM! ********** FLUXR2SUBROUTINE FLUXR2(q,f,if,mode)
DIMENSION q(0:if,3),f(0:if,3),ql(3),qr(3),fl(3),fr(3),fi(3)COMMON na,dt,dx,ak ak1=ak-1.
DO i=1,if-2
DO j=1,3
dqa=q(i,j)-q(i-1,j) dq0=q(i+1,j)-q(i,j) dq1=q(i+2,j)-q(i+1,j)IF(mode==63)THEN
ql(j)=q(i ,j)+.5*AMINMOD(dqa,dq0)
qr(j)=q(i+1,j)-.5*AMINMOD(dq0,dq1)
ELSE
ql(j)=q(i ,j)+.5*SUPERBEE(dqa,dq0)
qr(j)=q(i+1,j)-.5*SUPERBEE(dq0,dq1)
ENDIF
ENDDO
r=q(i,1) u=q(i,2)/r uu=ak1*u*u/2. p=ak1*q(i,3)-r*uu
cc=ak*p/r c=SQRT(cc) H=(cc+uu)/ak1
rl=ql(1) ul=ql(2)/rl pl=ak1*(ql(3)-ql(2)*ul/2.)

数値計算例

I

dr=2.*(rl-r) du=2.*(ul-u) dp=2.*(pl-p)a1=u  dw1=dr-dp/cc
aw1=a1*dw1
a2=u+c dw2=du+dp/(r*c) aw2=a2*dw2*r/(2.*c)
a3=u-c dw3=du-dp/(r*c) aw3=a3*dw3*r/(2.*c)ql(1)=ql(1)-dt/(2.*dx)*(aw1
+aw2
-aw3
)
ql(2)=ql(2)-dt/(2.*dx)*(aw1*u+aw2*(u+c) -aw3*(u-c) )ql(3)=ql(3)-dt/(2.*dx)*(aw1*u*u/2.+aw2*(H+c*u)-aw3*(H-c*u))rl=ql(1) ul=ql(2)/rl pl=ak1*(ql(3)-ql(2)*ul/2.)
fl(1)=ql(2) fl(2)=ql(2)*ul+pl fl(3)=(ql(3)+pl)*ul
r=q(i+1,1) u=q(i+1,2)/r uu=ak1*u*u/2. p=ak1*q(i+1,3)-r*uu
cc=ak*p/r c=SQRT(cc) H=(cc+uu)/ak1
rr=qr(1) ur=qr(2)/rr pr=ak1*(qr(3)-qr(2)*ur/2.)
dr=2.*(r-rr) du=2.*(u-ur) dp=2.*(p-pr)
a1=u  dw1=dr-dp/cc
aw1=a1*dw1
a2=u+c dw2=du+dp/(r*c) aw2=a2*dw2*r/(2.*c)
a3=u-c dw3=du-dp/(r*c) aw3=a3*dw3*r/(2.*c)
qr(1)=qr(1)-dt/(2.*dx)*(aw1
+aw2
-aw3
)
qr(2)=qr(2)-dt/(2.*dx)*(aw1*u+aw2*(u+c) -aw3*(u-c) )qr(3)=qr(3)-dt/(2.*dx)*(aw1*u*u/2.+aw2*(H+c*u)-aw3*(H-c*u))rr=qr(1) ur=qr(2)/rr pr=ak1*(qr(3)-qr(2)*ur/2.)
fr(1)=qr(2) fr(2)=qr(2)*ur+pr fr(3)=(qr(3)+pr)*ur
CALL ROEARS(rl,rr,ul,ur,pl,pr,fl,fr,fi)
FORALL(j=1:3)f(i,j)=fi(j)ENDDO
ENDSUBROUTINE FLUXR2! ********** FLUX3SUBROUTINE FLUX3(q,f,if,mode)
DIMENSION q(0:if,3),f(0:if,3),ql(3),qr(3),fl(3),fr(3),fi(3)COMMON na,dt,dx,ak ak1=ak-1.
b=2.
DO i=1,if-2
DO j=1,3
dqa=q(i,j)-q(i-1,j) dq0=q(i+1,j)-q(i,j) dq1=q(i+2,j)-q(i+1,j)IF(mode==81.OR.mode==83)THEN
ql(j)=q(i ,j)+AMINMOD(dqa,b*dq0)/6.+AMINMOD(dq0,b*dqa)/3.
qr(j)=q(i+1,j)-AMINMOD(dq1,b*dq0)/6.-AMINMOD(dq0,b*dq1)/3.
ELSE
ql(j)=q(i ,j)+SUPERBEE(dqa,dq0)/2.
qr(j)=q(i+1,j)-SUPERBEE(dq1,dq0)/2.
ENDIF
ENDDO
rl=ql(1) ul=ql(2)/rl pl=ak1*(ql(3)-ql(2)*ul/2.)
rr=qr(1) ur=qr(2)/rr pr=ak1*(qr(3)-qr(2)*ur/2.)
fl(1)=ql(2) fl(2)=ql(2)*ul+pl fl(3)=(ql(3)+pl)*ul
fr(1)=qr(2) fr(2)=qr(2)*ur+pr fr(3)=(qr(3)+pr)*ur
CALL ROEARS(rl,rr,ul,ur,pl,pr,fl,fr,fi)
FORALL(j=1:3)f(i,j)=fi(j)ENDDO
ENDSUBROUTINE FLUX3! ********** Roe's approximate Riemann solver
SUBROUTINE ROEARS(rl,rr,ul,ur,pl,pr,fl,fr,f)
DIMENSION fl(3),fr(3),f(3)COMMON na,dt,dx,ak ak1=ak-1.
br=SQRT(rl*rr) R=SQRT(rr/rl)
bu=(ul+R*ur)/(1.+R)

65

66

圧縮性流れの解法|１次元 Euler 方程式

Hl=ak/ak1*pl/rl+ul*ul/2.
Hr=ak/ak1*pr/rr+ur*ur/2.
bH=(Hl+R*Hr)/(1.+R)
bcc=ak1*(bH-bu*bu/2.) bc=SQRT(bcc)
a1=ABS(bu) dw1=rr-rl-(pr-pl)/bcc
aw1=a1*dw1
a2=ABS(bu+bc) dw2=ur-ul+(pr-pl)/(br*bc) aw2=a2*dw2*br/(2.*bc)
a3=ABS(bu-bc) dw3=ur-ul-(pr-pl)/(br*bc) aw3=a3*dw3*br/(2.*bc)
f(1)=(fl(1)+fr(1))/2.-(aw1
+aw2
-aw3
)/2.
f(2)=(fl(2)+fr(2))/2.-(aw1*bu+aw2*(bu+bc)-aw3*(bu-bc))/2.
f(3)=(fl(3)+fr(3))/2.-(aw1*bu*bu/2.+aw2*(bH+bc*bu)-aw3*(bH-bc*bu))/2.
ENDSUBROUTINE ROEARS! ********** Determine rho,u,H,c from q
SUBROUTINE SUBSD(i,q,if,r,u,H,c)
DIMENSION q(0:if,3)
COMMON na,dt,dx,ak ak1=ak-1.
r=q(i,1) u=q(i,2)/r uu=ak1*u*u/2. p=ak1*q(i,3)-r*uu
cc=ak*p/r c=SQRT(cc) H=(cc+uu)/ak1
ENDSUBROUTINE! ********** Splitted propagating velocities
SUBROUTINE AAA(u,c,ap,am)
DIMENSION ap(3),am(3)a1=u  ap(1)=(a1+ABS(a1))/2. am(1)=(a1-ABS(a1))/2.
a2=u+c ap(2)=(a2+ABS(a2))/2. am(2)=(a2-ABS(a2))/2.
a3=u-c ap(3)=(a3+ABS(a3))/2. am(3)=(a3-ABS(a3))/2.
ENDSUBROUTINE! ********** MATRIX, left hand side operators
SUBROUTINE MATRIX(i,q,if,a,amat)
DIMENSION q(0:if,3),a(3),amat(3,3)
COMMON na,dt,dx,ak ak1=ak-1.
CALL SUBSD(i,q,if,r,u,H,c)
aa=(a(2)-a(3))/2. ab=(a(2)+a(3))/2.-a(1) ac=(a(2)+a(3))/2.
aM=u/c phi=ak1*u*u/2. psi=phi/(c*c)
amat(1,1)=a(1)aM*aa+
psi*abamat(2,1)=(ak-3.)/2.*u*aM*aa+u*(psi-1.)*abamat(3,1)=(phi-H)*aM*aa+u*u/2.*(psi-1.)*abamat(1,2)=
1./c*aaak1/c*aM*abamat(2,2)= ac+(2.-ak)*aM*aa-2.*psi*abamat(3,2)=(H-2.*phi)/c*aau*psi*abamat(1,3)=
ak1/(c*c)*ab
amat(2,3)=
ak1/c*aa+
ak1/c*aM*abamat(3,3)= ac+ak1*aM*aa+
psi*abENDSUBROUTINE! ********** Gaussian elimination for linear eqns having a reduced array
SUBROUTINE GAUSSB(c,b,if,k1,k2,m1,m2)
DIMENSION c(if,m1:m2),b(if)!k1--k2, m1--m2: range of computation
DO k=k1,k2
b(k)=b(k)/c(k,0)
IF(k==k2)CYCLE
j2=MIN0(m2,k2-k)
FORALL(j=1:j2)c(k,j)=c(k,j)/c(k,0)
i2=MIN0(k2,k-m1)
DO i=k+1,i2 j0=k-ib(i)=b(i)-c(i,j0)*b(k)数値計算例I67

図 16.19: リーマン衝撃波管内の流れ t = 0:0025 naf = 800
DO jk=1,j2 j=jk+k-i
c(i,j)=c(i,j)-c(i,j0)*c(k,jk)
ENDDO ENDDO
ENDDO
DO i=k2-1,k1,-1 j2=MIN0(m2,k2-i)
DO j=1,j2 k=i+jb(i)=b(i)-c(i,j)*b(k)ENDDO ENDDO
ENDSUBROUTINE GAUSSB

このプログラムは，前述のスカラー輸送方程式の初期値問題のプ ログラムをオイラー方程式に拡張したものである．サブルーチンは，流束ベクトル分離法，流束差分分離法，有限体積法の３群と，その補助サブ

ルーチンからなる．CALFVS は流束ベクトル分離法に属する次の 3 解法のサブルーチンである．
mode=11 Roe スキーム + Euler 前進法

mode=21 QUICK スキーム + 3 次 Runge-Kutta 法

mode=22 QUICK スキーム + Crank-Nicholson 予測子修正子法

計算には 16.3 節の数値スキームと本節 1 項に示した時間積分法が用いられる．FLUXR は Roe スキームの数値流束を求めるサブルーチンで，既知の qi から補助サブルーチン SUBSD を引用し i  ui  Hi  ci ，また

qi+1 から i+1  ui+1  Hi+1  ci+1 ，AAA を用い位相速度 ap = +i+1=2 と am = ;i+1=2 ，SUBFVS を用い Steger-

68

圧縮性流れの解法|１次元 Euler 方程式

図 16.20: リーマン衝撃波管内の流れ t = 0:01 naf = 200

Warming の流束ベクトル分離法の式 (16.33b) から流束 fp = Fi+ ，fm = Fi;+1 ，数値流束 f(i,j) = Fi+1=2 の順に計算している．FLUXQ の QUICK スキームの数値流束の計算も同様に行われる．ただし流束 fap = Fi+
;1 ，
+
+
;
;
;
f0p = Fi ，f1p = Fi+1 ，f0m = Fi ，f1m = Fi+1 ，f2m = Fi+2 である．
ここで 16.6.1 項に述べた Crank-Nicholson 予測子修正子法のオイラー方程式への適用について述べる．
式 (16.109) はオイラー方程式では次のようになる．
m);DA+i qi(;m1) + (I + DjAi j)qi(m) + DA;i qi(+1m;1) ; F n ; F (m;1) )= ;(qi(m;1) ; qin ) ; D(Fin+1=2 + Fi(+1i;1=2 i;1=2=2q(m) = q(m;1) + q(m)(16.113)

ただし D = 0:5t=x，I は単位行列である．この式は各計算点に対し て成立するもので ，その全体は

qi(m)  (i = ib  ib +1 ib +2 : : :  ie ) を未知変数とする連立 1 次方程式を構成し，その係数行列は次の 3  3

ブロック３重対角行列になる．

数値計算例I69

図 16.21: リーマン衝撃波管内の流れ t = 0:025 naf = 80

0I + DjA j DA;
1
i
i
CC
B
;DA+i +1 I + DjAi +1 j DA;i +1
B
CC
B
B;DA+i +2 I + DjAi +2 j DA;i +2
B
CC
B
...
...
...
B
CC
B
...
...
...
B
CC
B
B
+
;
;DAi ;1 I + DjAi ;1 j DAi ;1 C
A
@
b

b

b

b

b

b

b

e

b

e

e

;DA+i
I + DjAi j
この行列のバンド 幅は 11 で，バンド 幅内の要素の値は 300  (;5 : 5) の縮小配列 c に入力されるが，要素eeの値の計算に際しては amat = A の 9 要素の値を式 (16.74) から計算するサブルーチン MATRIX が使われる．また連立 1 次方程式の右辺の値は配列 rhs=b に入力される．GAUSSB はこの連立 1 次方程式をガウス消去法で解くサブルーチンで，計算で求めた q (m) の値は rhs に上書きされる．予測子修正子法の計算は

m = 3 で打切られる．

CALFDS は流束差分分離法に属する次の解法のサブルーチンである．

3 次 Chakravarthy-Osher TVD スキーム + 3 次 Runge-Kutta 法
mode=43,44
3 次 Chakravarthy-Osher TVD スキーム + Crank-Nicholson 予測子修正子法
なお制限関数は mode=41,43 では minmod，mode=42,44 では superbee が用いられる．サブルーチン FLUXCO
mode=41,42

70

圧縮性流れの解法|１次元 Euler 方程式

は Chakravarthy-Osher TVD スキームの数値流束を求めるもので，上記のようにして流束 f0p = Fi+ とFi;+1 ，サブルーチン SUBFDS を用い式 (16.70b) から分離流束差分 dfap = Fi+;1=2 ，df0p = Fi++1=2 ，;df0m = Fi;
+1=2 ，df1m = Fi+3=2 ，式 (16.69) から数値流束 f(i,j) = Fi+1=2 の順に計算している．
f1m =CALFVM は有限体積法 (ゴド ゥノフ型スキーム) に属する次の解法のサブルーチンである．

MUSCL 法 + 2 段階時間積分法
mode=63,64
2 次 Roe スキーム
mode=81,82
3 次有限体積法 TVD スキーム + 3 次 Runge-Kutta 法
mode=83,84
3 次有限体積法 TVD スキーム + Crank-Nicholson 予測子修正子法
なお制限関数は mode=61,63,81,83 では minmod，mode=64,82,84 では superbee を用い，また数値流束
はすべての解法で Roe の近似リーマン解から求めている．
プログラムの MUSCL 法は，その第 1 段階で数値流束 F^in+1=2 を用い時間間隔 t=2 と置いてオイラー前
n+1=2 を求め，その第 2 段階で時間平均数値流束 F^ n+1=2 を用い式 (16.93)
進法で中間段階のセル平均値 qii+1=2からセル平均値 qin+1 を 2 次精度で求めるものである．サブルーチン FLUXM は MUSCL 法の数値流束を求めるもので，その中では区分的 1 次式 (16.91) からセル境界値 ql = qi+1=2L と qr = qi+1=2R ，サブルーチ
ン ROEARS を引用し 式 (16.86){(16.89)(16.90c) から Roe の近似リーマン解 fi(j) = f(i,j) = F^i+1=2 の順
，bH = H ，bcc = c 2 ，bc = c，ak = jk j，dwk = @ wkに計算が行われる．なお br = ，R = R，bu = uである．2 次 Roe スキームは MUSCL 法の大幅改良版で，サブルーチン FLUXR2 はその時間平均数値流束
F^in+1+1==22 を求めるものである．その改良点は，区分的 1 次式 (16.91) の制限関数を minmod から superbee
n+1=2
n+1=2
に換えたこと，中間段階の ql = qi+1=2L ，qr = qi+1=2R を Roe の波動分離法の式 (16.94) で計算したことである．3 次の有限体積法 TVD スキームでは，流束はサブルーチン FLUX3 から求め，また時間積分は 3
次 Chakravarthy-Osher TVD スキームと同じ要領で行っている．FLUX3 の中では，制限関数 minmod または superbee を用いた区分的 3 次式 (16.103) からセル境界値 ql = qi+1=2L と qr = qi+1=2R ，サブルーチン
ROEARS を引用し Roe の近似リーマン解 f(i,j) = F^i+1=2 の順に計算が行われる．
図 16.19 〜 16.21 に，初期密度比 10:1，圧力比 10:1 のリーマン問題を解いた結果を示す．これらの図では時間ステップを t = 0:0025 0:01 0:025 に変えているが，t = 0:04 では計算不能になる．なお境界面
mode=61の密度変化，衝撃波の諸量の変化は本来ステップ状になるべきものである．スキームの評価はスカラー輸送
方程式の場合と同様にくだされる．

高

16.7

次

ス キ

ー

71

ム

高次スキーム境界面や滑り面などの弱い不連続の鋭い捕獲 (capturing) には，4 次以上のスキームが必要である．精度

は 2 次ないしせいぜい 3 次あれば十分であるが，弱い不連続を持続させるには 4 次以上の多項式の柔軟性が必要である．なお衝撃波はメッシュを細かくすることによりより鮮明に捕らえることができるが，弱い不連続はメッシュを細かくするだけではだめである．

16.7.1

高次コンパクト TVD スキーム

始めに次式で与えられる 4 次上流差分と 4 次中心差分の線形結合を作る．

(fx)i = 121x (;fi+;3 +6fi+;2 ; 18fi+;1 +10fi+ +3fi++1;3fi;;1 ; 10fi; +18fi;+1 ; 6fi;+2 + fi;+3) ; 5!6 x4f (5)(fx)i = 121x (fi;2 ; 8fi;1 +8fi+1 ; fi+2) + 5!4 x4f (5)(16.114a)(16.114b)

これらの式から数値流束を求め，次に 3 次上流差分＋ 4 次補正項の形に書換えれば次式が得られる41 ．

4UD = 1 (f + ; 5f + +13f + +3f + + 3f ; ; 13f ; ; 5f ; + f ; )hi+1=2 12 i;2
i;1
i
i+1
i
i+1
i+2 i+3

Roe + 1 f + + 1 f + ; 1 3 f + ; 1 f ; ; 1 f ; + 1 3 f ; = hi+1=2 6 i;1=2 3 i+1=2 12i;1=2 6 i+3=2 3 i+1=2 12i+3=24CD = 1 (;fi;1 +7fi +7fi+1 ; fi+2)
hi+1
=2 12
Roe + 1 f + + 1 f + ; 1 3 f + ; 1 f ; ; 1 f ; + 1 3 f ;= hi+1=2 6 i;1=2 3 i+1=2 12
i+1=2 6 i+3=2 3 i+1=2 12
i+1=2

ただし 3fi+1=2

 2fi+1 ; 2fi = ;fi;1 +3fi ; 3fi+1 + fi+2 である．

4 次上流差分と 4 次中心差分の線形結合を取れば，次の一般的 4 次スキームの数値流束の式が得られる42 ．
1 ; 4UD 1+ 4CDh(4)i+1=2 = 2 hi+1=2 + 2 hi+1=2
Roe + 1 f + ; 1 ; 3f + + 1 f + ; 1+ 3f += hi+1=2i;1=2 3 i+1=2 24i+1=2
6 i;1=2 24; 3f ; ; 1 f ; + 1+ 3f ;; 16 fi;+3=2 + 124(16.115)i+3=2 3 i+1=2 24
i+1=2
{z
} |
{z
}
| {z } |4 次上流差分の補正項
4 次中心差分の補正項
Roe スキーム
1
1
1
1
Roe + Df + + Df + ; Df ; ; Df ;
 hi+1=2 6 i;1=2 3 i+1=2 6 i+3=2 3 i+1=2= a+ の場合の 4 次上流差分の部分の計算要領を下表に示す．
乗数
fi+;3 fi+;2 fi+;1
fi+
fi+;1
(16.114a) 1=12x ;1
6 ;18
10
3
4UD
hi+1
1/12
1
;5 13
3
=2
4UD
hi;
1/12
;1
5 ;13 ;3
1=2
Roe
1/12
12
hi+1
=2
+
1/12
;
2
2
f
3 次上流差分4UDi;
1=2 =6
hi+1=2
1/12;4
4 fi++1=2 =3
1/12
1 ;3
3 ;1 ;3 fi+;1=2 =12 4 次補正項
42 Yamamoto, S. and Daiguji, H., Higher-order-accurate upwind schemes for solving the compressible Euler and NavierStokes equations, Comput. & Fluids, 22(1993), 259{270.
41 a

72

圧縮性流れの解法|１次元 Euler 方程式= ;1 ならば 4 次上流差分， = 1 ならば 4 次中心差分のものに，また式 (16.114) の打切り誤;6(1 ; )+4(1+ ) = 0 すなわち = 1=5 のときに相殺され，この式は 5 次上流差分のものになる．

この式は，
差は

= 1=5 の 5 次スキームの場合には，式 (16.115) から Df は次のように表される．
3 3f  
Dfi+1=2 = fi+1=2 ; 20
i+1=2
(j = i  1)
Dfj+1=2 = fj+1=2 ; 15 3fj+1=2

また(16.116); : 1+ = 1 : 1 となり，Df は 1 つの式で表すことができる．
= 1=3 の場合には， 124
24 6 3

Dfj+1=2 = fj+1=2 ; 16 3fj+1=2(j = i i  1)

(16.117)= 1=5 のときにのみ 5 次でそれ以外は 4 次であるが，実質的には の値によって突然変わることはないから， = 1=3 のときにも 5 次に近い結果が期待できよう．
次に上記の高次スキームの TVD 化について述べる．式 (16.63) にならって TVD 化すれば，とりあえず次の高次の TVD 差分スキームが得られる．
1 ~+
1 ~;
1 ~;
1 ~+
Roe
(16.118)h(4)i+1=2 = hi+1=2 + 6 Df i;1=2 + 3 Dfi+1=2 ; 6 Dfi+3=2 ; 3 Df i+1=2
Df~j+1=2 = minmod(Dfj+1=2  bDfj;1=2 )(j = i i +1)
Df~j+1=2 = minmod(Dfj+1=2  bDfj+3=2 )(j = i ; 1 i)

式 (16.115) の精度は，数学的には

ただし補正勾配 Df は 5 次スキームの場合には

3 3f 
Dfi+1=2 = fi+1=2 ; 20
i+1=2

Dfj+1=2 = fj+1=2 ; 15 3fj+1=2(j = i  1)

Dfj+1=2 = fj+1=2 ; 16 3fj+1=2(j = i i  1)

(16.119)

また 4 次コンパクトスキームの場合には(16.120)

次にこの 4 次 TVD スキームの安定性について検討する．このスキームは 3 次上流差分スキームの勾配

f を補正勾配 Df に置換えたものであるが，このとき二つの条件 (16.66) と (16.67) はど うなるのであろう
か．もう 1 つは，補正勾配 Df は f に比べ一般に大きい擾乱を含み，それに起因する不安定対策である．
第 1 の点に関して，2 次 TVD スキームの式 (16.64) に相当の 4 次 TVD スキームの式は次のようになる．

h




i
+ C3 Ra+ minmod(ri+;1=2  b) ; minmod(1 bri;;1=2 )h 
a~;i+1=2 = a;i+1=2 1+ C6 Ra; minmod(1 bri;+1=2 ) ; minmod(ri++1=2  b)i
+ C R; minmod(r;  b) ; minmod(1 br+ )a~+i;1=2 = a+i;1=2 1+ C6 Ra+ minmod(1 bri+;1=2 ) ; minmod(ri;;1=2  b)

3 a

i+1=2

i+1=2

(16.121a)(16.121b)

+
;
;
+
;
ただし C = Dui;1=2 =ui;1=2  Ra+ = a+i+1=2 =ai;1=2  Ra = ai;1=2 =ai+1=2  ri;1=2 = Dui+1=2 =Dui;1=2 

ri;;1=2 = Dui;3=2 =Dui;1=2 である．この式から倍率 b の条件は次のようになる．
0 < b  6C;1 ; 2(16.122)

高

次

ス キ

ー

図 16.22: 勾配 f ，補正勾配 Df = f

73

ム

; 3f=6，制限補正勾配 Df

また時間ステップ t の条件は次のようになる．

(1 ; )b1C  1

b1 = 1+ 16 CRa (1+2b)

C = jajt=x(16.123); CRa=2 となる．
第 2 の点に関しては，補正勾配 Df  f ; 3f=6 は，勾配 f に較べ大きい擾乱を含み不安定性を惹き

なお b の上限に対しては b1 = 1+2Ra

起こす虞があるので，この勾配の補正項 3f=6 の大きさを制限する必要がある．制限する方法はいろいろ考えられるが，ここでは勾配 Df (x) に極値が生じないように制限することにする．関数 f (x) の極値は勾配

f の大きさを制限することによって除かれたが，勾配 Df (x) の極値も曲率 2f の大きさを制限することによって除くことができる．この考えをもとに高次補正項を次のように置く43 ．

3fj+1=2 = 2f~j+1 ; 2f~j(j = i i  1)

(16.124)

2f~k = minmod(2fk b2 2fk;1 )
2f~k = minmod(2fk b2 2fk+1 ) 2fk = fk+1=2 ; fk;1=2
minmod 関数の働きによって，勾配補正項 3f の付加による新たな勾配 @f=@x の極値，変曲点 @ 2f=@x2 = 0の発生は確かに阻止される．もちろんこのとき，3 次上流差分スキームで得られる変曲点は何らかの影響を受けるにせよ存在し続けるであろう．このことは 2 次 TVD スキームでもともとある極値が影響をうけても存続し続けるのと同じである．

次に minmod 関数の中で使われる倍率 b2 の大きさを制限補正勾配 Df に極値が生じないように決定する．

制限補正勾配 Df は簡単のため j = 0 と置き，曲率比 R = 2f1 =2f0 を用いれば次のようになる．

Df1=2 = f1=2 ; 61 fminmod(R b2 ) ; minmod(1 b2 R)g2f0

8>
f1=2 ; 61 (b2 ; 1)2f0(R > b2 )第 1 の minmod 関数が働く>>>< f1=2 ; 1 (R ; 1)2f0 (1=b2  R  b2) 4 次上流差分
6
=
1
>
f
;
>
1=2 6 (1 ; b2)R2f0 (0  R < 1=b2) 第 2 の minmod 関数が働く>: f1=2(R < 0)3 次上流差分：第 1,2 の minmod 関数が働く(16.125)

43 Daiguji, H., Yuan, X. and Yamamoto, S., Stabilization of higher-oder high resolution schemes for the compressible
Navier-Stokes equations, Numer. Meth. Heat & Fluid Flow, 7(1997), 250{274.

74

圧縮性流れの解法|１次元 Euler 方程式

図 16.22 に 3 つの勾配，すなわち普通の意味での勾配 f ，補正勾配 Df ，制限補正勾配 Df を示す．図中の直線の傾きは曲率を表し ，変曲点は傾きが正から負またはその逆に変化するときに生ずる．したがって，
制限補正勾配 Df の変曲点は

Df1=2 = f1=2 ; 61 (1 ; b2)2f1  f1=2 + 12 (f3=2 ; f1=2 )Df3=2 = f3=2 ; 16 (b2 ; 1)2f1 f3=2 ; 12 (f3=2 ; f1=2 )が成立すれば現れないことになる．これらの式から倍率 b2 の上限は次のようになる．

1 (b ; 1)  1 すなわち 1 < b  4(16.126)2
6 2
2
最後に，条件式 (16.122)，(16.123) における制限補正勾配 Df を無次元化した C について検討する (なおRa は 16.4.3 項の考察により 1 と置くことにする)．倍率 b2 の上限 4 を選べば ，式 (16.125) から

8>
1 ; (1 ; r;)=2
>
<
Du
Df
1 ; (r+ ; 2+ r;)=6
C = 1=2 = 1=2 =u1=2 f1=2 >
1 + (r+ ; 1)=2>:
1

(R > 4)(1=4  R  4)
(0 < R < 1=4)
(R  0)

ただし r; = f;1=2 =fi+1=2  r+ = f3=2 =fi+1=2  R = 2f1 =2f0 = (r+り C の大きさは; 1)=(1 ; r;) である．これよ

1=2  C  1 + 1=8(16.127)となる44 ．この C を用いれば ，4 次コンパクト TVD スキームの倍率 b b2 とクーラン数 C を制限する条件
式は次のようになる．

0 < b  10
3 ( 4)(16.128a)(1 ; )b1C  1 b1 = 39
16 (= 2:5)
b2 = 4(16.128b)(16.128c)

なお括弧内の数字は 3 次 TVD 上流差分スキームで用いられているもので，これらをそのまま用いても経験上問題はないようである．

最後に以上述べた 4 次コンパクト TVD スキームについてまとめれば ，計算に必要な式は，式 (16.118)，(16.120)，(16.124) と (16.53) で，b b1  b2 の値は式 (16.128) によって制限される．この 4 次コンパクト TVD

44 本稿を執筆するに当たって，上式の意味が分からなくなったので歳の所為？ C の図を追加して説明する．2f > 0 の場合の C は下図に示すようになる．C の最大値は R = 1=4 の 1+(1 r ; )=8，最小値は R 4 の 1 (1 r ; )=2 であるが，この高次スキームはr; 0 のときに意味をなし ，r; = 0 のときに C は上記の絶対的最大最小値を取る．2f < 0 の場合にも対称性により同様のこと
が言え同じ結論が得られる．

;



XXXXX

XXXXX

1

r;



;1

0 1/4

1

2

; ;

XXXXX

C
XX ;;

3

4

R

5

高

次

ス キ

ー

ム

75

スキームと 3 次の Chakravarthy-Osher TVD スキームの式は同形で，3 次スキームの勾配 f を制限補正

勾配 Df で置換えれば 4 次コンパクト TVD スキームになる．最後に，このスキームで計算したときに変曲

点はど うなるのかという問に対しては，3 次 Chakravarthy-Osher TVD スキームの計算結果に現れる変曲
点はほとんどそのままであろう．もし 3 次スキームでは捕らえられず，4 次スキームではじめて捕らえられるような変曲点があれば ，そのような変曲点はこのスキームでは除かれてしまう．

これらのスカラー輸送方程式に対する高次コンパクト TVD スキームはほとんどそのままオイラー方程式にも適用できる．オイラー方程式への拡張については 16.4.4 項を参照されたい．

16.7.2

高次コンパクト 有限体積法 TVD スキーム

これから述べる高次コンパクトスキームは，多次元に拡張したときに滑り面や境界面など の弱い不連続の捕獲に有効である．またカルマン渦列など の呆け防止にも役立つ．しかしながら衝撃波のより鮮明な捕獲という観点からは期待できない．前章の 16.5.4 項では式 (16.96) の右辺 3 項までを取り，2 次式で 3 次
精度の再構成を行ったが，本項では右辺のすべての項を取り 4 次式で 5 次精度の再構成を行う．5 次精度を保つように，この式中のセル平均値 u0i  u00i  : : : を次の差分式で近似する．

u0i = 121x (ui;2 ; 8ui;1 +8ui+1 ; ui+2)+O(x4 )

1 (;u +16u ; 30u +16u ; u )+O(x4 )
u00i = 12x
i;2
i;1
i
i+1 i+22

1 (;u +2u ; 2u + u )+O(x2 )
u000i = 2xi;2i;1i+1 i+2312u(4)i = x4 (ui;2 ; 4ui;1 +6ui ; 4ui+1 + ui+2 )+O(x )これらの差分式を 1 階と 3 階の差分を用いて表せば

x u0i = 12 (ui;1=2 + ui+1=2 ) + 4!2 (;3 ui;1=2 ; 3 ui+1=2 )x2 u00i = (;ui;1=2 + ui+1=2 ) + 4!2 (3 ui;1=2 ; 3 ui+1=2 )+ 12 (3 ui;1=2 + 3ui+1=2 )x3 u000i =x4 u(4)i =+ (;3 ui;1=2 + 3ui+1=2 )これらの式を式 (16.96) に代入すれば ，次の再構成段階の区分的 4 次式が得られる．

;



;



1 u
1
1
ui (x) = ui + 21 ; 2 + 12i;1=2 + 2 + 2 ; 12 ui+1=2;
9 3 u+ 4!1 ; 4 +2 3 + 32 2 ; 52 ; 80i;1=2;
9 3 u(;1=2   1=2)
+ 4!1 4 +2 3 ; 23 2 ; 52 + 80
i+1=2 + O(x5 )セル境界 = 1=2 における変数値は上式より次のようになる．
1 3 u1
uLi+1=2 = ui + 61 ui;1=2 + 13 ui+1=2 ; 30i;1=2 ; 20 3 ui+1=2 + O(x5 )1 3 u1
uRi;1=2 = ui ; 61 ui+1=2 ; 13 ui;1=2 + 30
i+1=2 + 20 3 ui;1=2 + O(x5 )76

圧縮性流れの解法|１次元 Euler 方程式

この 5 次精度の式は，4 ui の大きさの項， (1=5f; )=4!g(3ui+1=2 ;3 ui;1=2 ) を加えれば ，4 次精度に落ちるが，前述の一般的な 4 次精度の数値流束の式と同形になる．すなわち; 3 u ; 1+ 3 uuLi+1=2 = ui + 61 ui;1=2 + 13 ui+1=2 ; 124i;1=2 24
i+1=2 + O(x4 ); 3 u + 1+ 3 uuRi;1=2 = ui ; 16 ui+1=2 ; 13 ui;1=2 + 124
i+1=2 24i;1=2 + O(x4 )(16.129a)(16.129b)

この式は形式的に次のように書くこともできる．

uLi+1=2 = ui + 61 Dui;1=2 + 31 Dui+1=2(16.130a)uRi;1=2 = ui ; 16 Dui+1=2 ; 31 Dui;1=2
パラメータ(16.130b)= 1=5 に選べば ，再構成は 5 次精度の区分的 4 次式で行われることになる．また = 1=3 に選べば ，再構成は 5 次に近い 4 次精度に落ちるが，Du は１つの式に纏まり次のようになる．

Dui1=2 = ui1=2 ; 61 3 ui1=2(16.131)

上記の 5 次精度の区分的 4 次式は， を含む項の付加により，次の 4 次精度の区分的 4 次式になる．

;



;

;
5 + 3 u+ 4!1 ; 4 +2 3 + 32 2 ; 52 ; 16
i;1=2
;

+ 1 4 +2 3 ; 3 2 ; 5 + 5 ; 3 u
+ O(x4 )

1 u
1
2 1
ui (x) = ui + 21 ; 2 + 12i;1=2 + 2 + ; 12 ui+1=2
4!

2

そのセル中心の値は

2

;

16

i+1=2

(;1=2   1=2)

5 ; 4 uui (xi ) = ui ; 4!1 2 ui + 4!1 16
i
またセル境界 xi+1=2 における変数 u の跳躍量は(16.132)(16.133)

u]i+1=2 = uRi+1=2 ; uLi+1=2 = 4!1 (1 ; )5 ui+1=2(16.134)となる．もとの関数 u(x) が適当に滑らかに変化するところではこの跳躍量 u]i+1=2 は無視できる．

セル境界における変数値の式 (16.129) は，4 次コンパクトスキームの数値流束の式 (16.115) と形式的に全く同じであるから，その TVD スキームの式 (16.118)，(16.119)，(16.120)，(16.124) にならって次のよ
うに TVD 化することにする．

uLi+1=2 = ui + 61 Du~i;1=2 + 31 Du~i+1=2 uRi+1=2 = ui+1 ; 61 Du~i+3=2 ; 13 Du~i+1=2
Du~j+1=2 = minmod(Duj+1=2  bDuj;1=2 )Du~j+1=2 = minmod(Duj+1=2  bDuj+3=2 )(16.135)(j = i i +1)(j = i ; 1 i)

ただし制限補正勾配 Du は 5 次の再構成の場合には3 3 uDui+1=2 = ui+1=2 ; 20i+1=2 Duj+1=2 = uj+1=2 ; 51 3 uj+1=2(j = i  1)

(16.136)

数値計算例II77

また 4 次のコンパクト再構成の場合にはDuj+1=2 = uj+1=2 ; 61 3 uj+1=2(j = i i  1)

(16.137)

3 uj+1=2 = 2 u~j+1 ; 2 u~j(j = i i  1)

(16.138)

また高次補正項 3 u
は

2 u~k = minmod(2 uk  b2 2 uk;1 )
2 u~k = minmod(2 uk  b2 2 uk+1 ) 2 uk = uk+1=2 ; uk;1=2
以上述べた高次有限体積法 TVD スキームの TVD 安定性については，このスキームが前項に述べた高次の流束差分分離法 TVD スキームと類似していることより，全く同様に論じることができる．minmod 関数の中の倍率 b b2 ，クーラン数 C = at=x の上限は，前記の条件式 (16.128) をそのまま用い求めることができる．4 次コンパクト TVD スキームの TVD 安定性は一応検討済みで，これらの条件式も検討の結果得られたものである．しかしながら，5 次 TVD スキームについては未完である．4 次コンパクト TVD スキー
ムの TVD 安定条件が Chakravarthy-Osher 型 TVD スキームのものとあまり変わらないこと，4 次コンパ
クト TVD スキームと 5 次 TVD スキームのの値がそれぞれ 1/3 と 1/5 で，4 次上流差分スキームの;1，

4 次中心差分の 1 に対して近いところにあることを考えれば ，4 次コンパクト TVD スキームのものをそのまま用いても大過ないものと思われる．なお衝撃波を含む流れでは 4 次コンパクト TVD スキームと 3 次
TVD スキームの計算結果はあまり違わず，また弱い不連続を含む流れでは 4 次コンパクト TVD スキームの結果は 3 次 TVD スキームのものとかなり違うが，5 次 TVD スキームのものとはほとんど 同じになる．
これらの高次コンパクト有限体積法 TVD スキームのオイラー方程式への拡張については 16.5.4 項を参照されたい．

16.8

数値計算例 II

16.8.1 スカラー輸送方程式の初期値問題
このプログラムは 16.6.2 項のプログラムを基に作られる．すなわちそのメインプログラムと，サブルー
チン CALFDS または CALFVM の中に下記のものを追加し，同時にそれらの補助サブルーチンも追加し，冒頭部分に新たに用いる配列の宣言などを行う．
PROGRAM MAIN
zm(51)='4th YD and RK, minmodzm(52)='4th YD and RK, superbeezm(53)='4th YD, CNpcm, minmodzm(54)='4th YD, CNpcm, superbeezm(91)='4th FVM and RK, minmodzm(92)='4th FVM and RK, superbeezm(93)='4th FVM, CNpcm, minmodzm(94)='4th FVM, CNpcm, superbee! YD: Yamamoto-Daiguji scheme' !mode=51' !mode=52' !mode=53' !mode=54' !mode=91' !mode=92' !mode=93' !mode=94! ********** Solve 1D scalar transport eq by flux difference splitting
SUBROUTINE CALFDS(x,u,is,if,mode,dc)
IF(mode==51.OR.mode==52)THEN !YD compact scheme, 4th-order Runge-Kutta

78

圧縮性流れの解法|１次元 Euler 方程式

CALL FLUXYD(u,f,is,if,mode)
FORALL(i=is+3:if-3)
uk1(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uk1(i)/2.
ENDFORALLCALL FLUXYD(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uk2(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+(uk1(i)+uk2(i))/4.
ENDFORALLCALL FLUXYD(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uks(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uks(i)/2.
ENDFORALLCALL FLUXYD(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uk3(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uks(i)ENDFORALLCALL FLUXYD(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uk4(i)=-dt/dx*(f(i)-f(i-1))u(i)=u(i)+(uk1(i)+2.*uk2(i)+2.*uk3(i)+uk4(i))/6.
ENDFORALL
ENDIF
IF(mode==53.OR.mode==54)THEN !YD compact scheme, Crank-Nicholson predictor-corrector method
ib=is+3 ie=if-3 dxt=dt*.5/dx ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
FORALL(i=is:if)u1(i)=u(i)CALL FLUXYD(u,f,is,if,mode)
m=-1 110 m=m+1
CALL FLUXYD(u1,f1,is,if,mode)
DO i=ib,iec(i,1)=-dxt*ap
c(i,2)=1.+dxt*(ap-am)c(i,3)=dxt*amrhs(i)=-(u1(i)-u(i))-dxt*(f(i)-f(i-1)+f1(i)-f1(i-1))!right hand side
ENDDO
CALL GAUSS3(c,rhs,is,if,ib,ie)
FORALL(i=ib:ie)u1(i)=u1(i)+rhs(i)IF(m<2)
GOTO 110
FORALL(i=ib:ie)u(i)=u1(i)ENDIF
END SUBROUTINE CALFDS! ********** FLUXYDSUBROUTINE FLUXYD(u,f,is,if,mode)
DIMENSION u(is:if),f(is:if)
COMMON na,dt,dx,ab=2. b2=2. ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
DO i=is+2,if-3
dub=u(i-1)-u(i-2) dua=u(i)-u(i-1) du0=u(i+1)-u(i)du1=u(i+2)-u(i+1) du2=u(i+3)-u(i+2)
d2ua=dua-dub d2u0=du0-dua d2u1=du1-du0 d2u2=du2-du1
dua=dua-(AMINMOD(d2u0,b2*d2ua)-AMINMOD(d2ua,b2*d2u0))/6.
du0=du0-(AMINMOD(d2u1,b2*d2u0)-AMINMOD(d2u0,b2*d2u1))/6.
du1=du1-(AMINMOD(d2u2,b2*d2u1)-AMINMOD(d2u1,b2*d2u2))/6.
IF(mode==51.OR.mode==53)THEN
f(i)=ap*(u(i )+AMINMOD(dua,b*du0)/6.+AMINMOD(du0,b*dua)/3.) &+am*(u(i+1)-AMINMOD(du1,b*du0)/6.-AMINMOD(du0,b*du1)/3.)

数値計算例

II

79

ELSE
f(i)=ap*(u(i)+SUPERBEE(dua,du0)/2.)+am*(u(i+1)-SUPERBEE(du1,du0)/2.)
ENDIF
ENDDO
ENDSUBROUTINE FLUXYD! ********** Solve 1D scalar transport eq by finite volume method
SUBROUTINE CALFVM(x,u,is,if,mode,dc)
IF(mode==91.OR.mode==92)THEN !4th-order compact FVM and 4th-order Runge-Kutta
CALL FLUXC(u,f,is,if,mode)
FORALL(i=is+3:if-3)
uk1(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uk1(i)/2.
ENDFORALLCALL FLUXC(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uk2(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+(uk1(i)+uk2(i))/4.
ENDFORALLCALL FLUXC(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uks(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uks(i)/2.
ENDFORALLCALL FLUXC(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uk3(i)=-dt/dx*(f(i)-f(i-1)) v(i)=u(i)+uks(i)ENDFORALLCALL FLUXC(v,f,is,if,mode)
FORALL(i=is+3:if-3)
uk4(i)=-dt/dx*(f(i)-f(i-1))u(i)=u(i)+(uk1(i)+2.*uk2(i)+2.*uk3(i)+uk4(i))/6.
ENDFORALL
ENDIF
IF(mode==93.OR.mode==94)THEN !4th-order compact FVM, Crank-Nicholson predictor-corrector method
ib=is+3 ie=if-3 dxt=.5*dt/dx
FORALL(i=is:if)u1(i)=u(i)CALL FLUXC(u,f,is,if,mode)
m=-1 110 m=m+1
CALL FLUXC(u1,f1,is,if,mode)
DO i=ib,ie
ap=(a+ABS(a))/2. am=(a-ABS(a))/2.
c(i,1)=-dxt*ap
c(i,2)=1.+dxt*(ap-am)c(i,3)=dxt*amrhs(i)=-(u1(i)-u(i))-dxt*(f(i)-f(i-1)+f1(i)-f1(i-1))!right hand side
ENDDO
CALL GAUSS3(c,rhs,is,if,ib,ie)
FORALL(i=ib:ie)u1(i)=u1(i)+rhs(i)IF(m<2)
GOTO 110
FORALL(i=ib:ie)u(i)=u1(i)ENDIF
ENDSUBROUTINE CALFVM! ********** FLUXCSUBROUTINE FLUXC(u,f,is,if,mode)
DIMENSION u(is:if),f(is:if)
COMMON na,dt,dx,a ap=(a+ABS(a))/2. am=(a-ABS(a))/2.

80

圧縮性流れの解法|１次元 Euler 方程式

図 16.23: 矩形波 a = 1 T = 2 CFL = 0:75b=2. b2=2.
DO i=is+2,if-3
dub=u(i-1)-u(i-2) dua=u(i)-u(i-1) du0=u(i+1)-u(i)du1=u(i+2)-u(i+1) du2=u(i+3)-u(i+2)
d2ua=dua-dub d2u0=du0-dua d2u1=du1-du0 d2u2=du2-du1
dua=dua-(AMINMOD(d2u0,b2*d2ua)-AMINMOD(d2ua,b2*d2u0))/6.
du0=du0-(AMINMOD(d2u1,b2*d2u0)-AMINMOD(d2u0,b2*d2u1))/6.
du1=du1-(AMINMOD(d2u2,b2*d2u1)-AMINMOD(d2u1,b2*d2u2))/6.
IF(mode==91.OR.mode==93)THEN
f(i)=ap*(u(i )+AMINMOD(dua,b*du0)/6.+AMINMOD(du0,b*dua)/3.) &+am*(u(i+1)-AMINMOD(du1,b*du0)/6.-AMINMOD(du0,b*du1)/3.)ELSE
f(i)=ap*(u(i)+SUPERBEE(dua,du0)/2.)+am*(u(i+1)-SUPERBEE(du1,du0)/2.)
ENDIF
ENDDO
ENDSUBROUTINE FLUXC

図 16.23 に矩形波の場合，図 16.24 に帆船波の場合の上記プログラムによる計算結果を示す．またこれらの図には比較のために前記の 3 次スキームの計算結果も示してある．矩形波の場合に，制限関数 superbee

は minmod 関数に比べ不連続を鋭く捕らえており，3 次の場合に見られた不連続前後の突起も小さくないしは完全に消失している．帆船波でも同様の傾向が見られるが，ピーク値は 3 次の場合に比べかなり低下し数値計算例II81

図 16.24: 帆船波 a = 1 T = 2 CFL = 0:75ている．4 次スキームは不連続を鋭く捕獲するという目的に適しているとは必ずしも言えない．

16.8.2 リーマン問題
以下に示すプ ログラムは，16.6.3 項に示したメインプログラムとサブルーチン CALFDS または CALFVMの中に，またそれらの補助サブルーチンとして追加されるものである．
PROGRAM MAIN
zm(51)='4th YD and RK, minmod:zm(94)='4th FVM, CNpcm, superbee' !mode=51' !mode=94! ********** Compute Riemann problem by flux difference splitting
SUBROUTINE CALFDS(q,if,mode)IF(mode==51.OR.mode==52)THEN !YD compact scheme, 4th-order Runge-Kutta
CALL FLUXYD(q,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk1(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uk1(i,j)/2.
ENDFORALLCALL FLUXYD(u,f,if,mode)

82

圧縮性流れの解法|１次元 Euler 方程式

FORALL(i=3:if-3,j=1:3)
uk2(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+(uk1(i,j)+uk2(i,j))/4.
ENDFORALLCALL FLUXYD(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uks(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uks(i,j)/2.
ENDFORALLCALL FLUXYD(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk3(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uks(i,j)
ENDFORALLCALL FLUXYD(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk4(i,j)=-dt/dx*(f(i,j)-f(i-1,j))q(i,j)=q(i,j)+(uk1(i,j)+2.*uk2(i,j)+2.*uk3(i,j)+uk4(i,j))/6.
ENDFORALL
ENDIF
IF(mode==53.OR.mode==54)THEN !YD compact scheme, Crank-Nicholson predictor-corrector method
ib=3 ie=if-3 dxt=dt*.5/dx
FORALL(i=0:if,j=1:3)q1(i,j)=q(i,j)
CALL FLUXYD(q,f,if,mode)
m=-1 110 m=m+1
CALL FLUXYD(q1,f1,if,mode)
DO i=ib,ie
CALL SUBSD(i,q,if,r,u,H,c)
CALL AAA(u,c,ap,am)
CALL MATRIX(i,q,if,ap,amat)
DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii-3)=-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii )= dxt*amat(ii,jj)
ENDDO ENDDOCALL MATRIX(i,q,if,am,amat)
DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii )=c(3*i-3+ii,jj-ii)-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii+3)= dxt*amat(ii,jj)
ENDDO ENDDO
DO j=1,3c(3*i-3+j,0)=c(3*i-3+j,0)+1.
rhs(3*i-3+j)=-(q1(i,j)-q(i,j))-dxt*(f(i,j)-f(i-1,j)+f1(i,j)-f1(i-1,j))
ENDDO ENDDOCALL GAUSSB(c,rhs,300,3*ib-2,3*ie,-5,5)
FORALL(i=ib:ie,j=1:3)q1(i,j)=q1(i,j)+rhs(3*i-3+j)IF(m<3)
GOTO 110
FORALL(i=ib:ie,j=1:3)q(i,j)=q1(i,j)
ENDIF
END SUBROUTINE CALFDS! ********** FLUXYDSUBROUTINE FLUXYD(q,f,if,mode)
DIMENSION q(0:if,3),f(0:if,3),ap(3),am(3),f0p(3),f1m(3), &dfbp(3),dfap(3),df0p(3),df1p(3),dfam(3),df0m(3),df1m(3),df2m(3), &d2fap(3),d2f0p(3),d2f1p(3),d2f0m(3),d2f1m(3),d2f2m(3)b=2. b2=2.
DO i=2,if-3
CALL SUBSD(i ,q,if,r0,u0,H0,c0)
CALL SUBSD(i+1,q,if,r1,u1,H1,c1)

数値計算例II

CALL AAA((u0+u1)/2.,(c0+c1)/2.,ap,am)
CALL SUBFVS(r0,u0,H0,c0,ap,f0p)
CALL SUBFVS(r1,u1,H1,c1,am,f1m)
u=(u0+u1)/2. H=(H0+H1)/2. c=(c0+c1)/2.
CALL SUBFDS(i-2,q,if,u,H,c,ap,dfbp)
CALL SUBFDS(i-1,q,if,u,H,c,ap,dfap)
CALL SUBFDS(i ,q,if,u,H,c,ap,df0p)
CALL SUBFDS(i+1,q,if,u,H,c,ap,df1p)
CALL SUBFDS(i-1,q,if,u,H,c,am,dfam)
CALL SUBFDS(i ,q,if,u,H,c,am,df0m)
CALL SUBFDS(i+1,q,if,u,H,c,am,df1m)
CALL SUBFDS(i+2,q,if,u,H,c,am,df2m)
FORALL(j=1:3)
d2fap(j)=dfap(j)-dfbp(j) d2f0p(j)=df0p(j)-dfap(j) d2f1p(j)=df1p(j)-df0p(j)d2f0m(j)=df0m(j)-dfam(j) d2f1m(j)=df1m(j)-df0m(j) d2f2m(j)=df2m(j)-df1m(j)ENDFORALL
DO j=1,3
dfap(j)=dfap(j)-(AMINMOD(d2f0p(j),b2*d2fap(j))-AMINMOD(d2fap(j),b2*d2f0p(j)))/6.
df0p(j)=df0p(j)-(AMINMOD(d2f1p(j),b2*d2f0p(j))-AMINMOD(d2f0p(j),b2*d2f1p(j)))/6.
df0m(j)=df0m(j)-(AMINMOD(d2f1m(j),b2*d2f0m(j))-AMINMOD(d2f0m(j),b2*d2f1m(j)))/6.
df1m(j)=df1m(j)-(AMINMOD(d2f2m(j),b2*d2f1m(j))-AMINMOD(d2f1m(j),b2*d2f2m(j)))/6.
IF(mode==51.OR.mode==53)THEN
f(i,j)=f0p(j)+f1m(j)+AMINMOD(dfap(j),b*df0p(j))/6.+AMINMOD(df0p(j),b*dfap(j))/3. &-AMINMOD(df1m(j),b*df0m(j))/6.-AMINMOD(df0m(j),b*df1m(j))/3.
ELSE
f(i,j)=f0p(j)+f1m(j)+SUPERBEE(dfap(j),df0p(j))/2.-SUPERBEE(df1m(j),df0m(j))/2.
ENDIF
ENDDO ENDDO
ENDSUBROUTINE FLUXYD! ********** Compute Riemann problem by finite volume method
SUBROUTINE CALFVM(q,if,mode)IF(mode==91.OR.mode==92)THEN !4th-order compact FVM and 4th-order Runge-Kutta
CALL FLUXC(q,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk1(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uk1(i,j)/2.
ENDFORALLCALL FLUXC(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk2(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+(uk1(i,j)+uk2(i,j))/4.
ENDFORALLCALL FLUXC(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uks(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uks(i,j)/2.
ENDFORALLCALL FLUXC(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk3(i,j)=-dt/dx*(f(i,j)-f(i-1,j)) u(i,j)=q(i,j)+uks(i,j)
ENDFORALLCALL FLUXC(u,f,if,mode)
FORALL(i=3:if-3,j=1:3)
uk4(i,j)=-dt/dx*(f(i,j)-f(i-1,j))q(i,j)=q(i,j)+(uk1(i,j)+2.*uk2(i,j)+2.*uk3(i,j)+uk4(i,j))/6.
ENDFORALL
ENDIF

83

84

圧縮性流れの解法|１次元 Euler 方程式

IF(mode==93.OR.mode==94)THEN !4th-order compact FVM, Crank-Nicholson predictor-corrector method
ib=3 ie=if-3 dxt=.5*dt/dx
FORALL(i=0:if,j=1:3)q1(i,j)=q(i,j)
CALL FLUXC(q,f,if,mode)
m=-1 110 m=m+1
CALL FLUXC(q1,f1,if,mode)
DO i=ib,ie
CALL SUBSD(i,q,if,r,u,H,c)
CALL AAA(u,c,ap,am)
CALL MATRIX(i,q,if,ap,amat)
DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii-3)=-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii )= dxt*amat(ii,jj)
ENDDO ENDDOCALL MATRIX(i,q,if,am,amat)
DO ii=1,3 DO jj=1,3c(3*i-3+ii,jj-ii )=c(3*i-3+ii,jj-ii)-dxt*amat(ii,jj)
c(3*i-3+ii,jj-ii+3)= dxt*amat(ii,jj)
ENDDO ENDDO
DO j=1,3c(3*i-3+j,0)=c(3*i-3+j,0)+1.
rhs(3*i-3+j)=-(q1(i,j)-q(i,j))-dxt*(f(i,j)-f(i-1,j)+f1(i,j)-f1(i-1,j))
ENDDO ENDDOCALL GAUSSB(c,rhs,300,3*ib-2,3*ie,-5,5)
FORALL(i=ib:ie,j=1:3)q1(i,j)=q1(i,j)+rhs(3*i-3+j)IF(m<3)
GOTO 110
FORALL(i=ib:ie,j=1:3)q(i,j)=q1(i,j)
ENDIF
ENDSUBROUTINE CALFVM! ********** FLUXCSUBROUTINE FLUXC(q,f,if,mode)
DIMENSION q(0:if,3),f(0:if,3),ql(3),qr(3),fl(3),fr(3),fi(3)COMMON na,dt,dx,ak ak1=ak-1.
b=2. b2=2.
DO i=2,if-3
DO j=1,3
dqb=q(i-1,j)-q(i-2,j) dqa=q(i,j)-q(i-1,j) dq0=q(i+1,j)-q(i,j)
dq1=q(i+2,j)-q(i+1,j) dq2=q(i+3,j)-q(i+2,j)d2qa=dqa-dqb d2q0=dq0-dqa d2q1=dq1-dq0 d2q2=dq2-dq1
dqa=dqa-(AMINMOD(d2q0,b2*d2qa)-AMINMOD(d2qa,b2*d2q0))/6.
dq0=dq0-(AMINMOD(d2q1,b2*d2q0)-AMINMOD(d2q0,b2*d2q1))/6.
dq1=dq1-(AMINMOD(d2q2,b2*d2q1)-AMINMOD(d2q1,b2*d2q2))/6.
IF(mode==91.OR.mode==93)THEN
ql(j)=q(i ,j)+AMINMOD(dqa,dq0)/6.+AMINMOD(dq0,dqa)/3.
qr(j)=q(i+1,j)-AMINMOD(dq1,dq0)/6.-AMINMOD(dq0,dq1)/3.
ELSE
ql(j)=q(i ,j)+SUPERBEE(dqa,dq0)/2.
qr(j)=q(i+1,j)-SUPERBEE(dq1,dq0)/2.
ENDIF
ENDDO
rl=ql(1) ul=ql(2)/rl pl=ak1*(ql(3)-ql(2)*ul/2.)
rr=qr(1) ur=qr(2)/rr pr=ak1*(qr(3)-qr(2)*ur/2.)
fl(1)=ql(2) fl(2)=ql(2)*ul+pl fl(3)=(ql(3)+pl)*ul
fr(1)=qr(2) fr(2)=qr(2)*ur+pr fr(3)=(qr(3)+pr)*ur
CALL ROEARS(rl,rr,ul,ur,pl,pr,fl,fr,fi)
FORALL(j=1:3)f(i,j)=fi(j)数値計算例II85

図 16.25: リーマン衝撃波管内の流れ t = 0:01 naf = 200
ENDDO
ENDSUBROUTINE FLUXC

上記のプログラムによるリーマン問題の計算結果を図 16.25 に示す．3 次スキームの場合と同様に制限関

数 superbee を用いた有限体積法が良い結果を示すが，3 次スキームよりも特にすぐれているということで
はない．

86

圧縮性流れの解法|１次元 Euler 方程式

付録１ Roe の波動分離法
ここで Roe の波動分離法 (uctuation splitting) 45 について説明する．この方法ではヤコビ行列 A を特性速度の符号にしたがって

A = A+ + A; A = RL(16.139)のように分離し ，流束の差分を次のように置く．

F n+1 ; F n = F = A+q + A;q

(16.140)

この式の右辺第 1 項は x の正の方向へ伝播する波，第 2 項は負の方向へ伝播する波を表している．１次元
オイラー方程式は，この式に対し 1 次上流差分を取れば ，その差分方程式は次のようになる．

t (A+q)n + (A;q)n 
qin+1 = qin ; x
i;1=2
i+1=2

ただし qj +1=2 = qj +1(16.141); qj である．

dx
= 1
dt
qin+1
@
@

t6

J

6

@

dx
dx
= 2  JJ
= 3
dt


J
@
@
; dt

-

  JJ J  J   JJ JJ   J J J Jx qin;1qin

1 t -
x

x

t
qin+1

?

-

図 16.26: Roe の波動分離法
式 (16.141) は次のように解釈できる．いま Lq = w と置けば ，

qin+1 ; qin = (q)ni +1=2 = (Rw)ni +1=2 =X(wk rk )ni +1=2 (16.142a)

k
+
n
;
n
+
n
(A q)i;1=2 + (A q)i+1=2 = (R w)i;1=2 + (R; w)ni+1=2
XX= (+k wk rk )ni;1=2 + (;k wk rk )ni+1=2(16.142b)kkとなる．図 16.26 を参照すれば，変数 qin が qin+1 に変化するのは，t 時間内に３つの波 wk rk (k = 1 2 3)
n+1=2 は，図では右方へ伝播する波で，この波が点 xi を通過したことによる．その内 第 1 の波 (w1 r1 )i
は時間 tn に図の区間 x を通過した波 (w1 r1 )ni;1=2 の内 区間 1 t を通過した波である．したがって
n
+1
=
2
n
(w1 r1 )i= (w1 r1 )i;1=2 1t=x となる．ほかの波についても同様でこれらをまとめて書けばXX +k t knX ;k t kn(wk rk )ni +1=2 = ;wr;
wk r i+1=2
k i;1=2kk xk xすなわち式 (16.141) になる．
45 Roe, P. L., Fluctuations and signals, a framework for numerical evolution problems, Numerial Mehotds in Fluid Dynamics, 219{257, 1982.

87

特性曲線法とリーマン問題の解付録２ 特性曲線法とリーマン問題の解
ここでは特性曲線法 (method of characteristics, characteristic method) によりリーマン問題を正確に解く．はじめに特性曲線法の概要について Hoskin の解説に沿って述べる46 ．圧縮性流体の１次元非定常流れ

問題は，この章の始めに詳しく述べたように質量・運動量・エネルギーの保存方程式，状態方程式，初期・境界条件からなる Cauchy 問題で，準線形で，不連続を含む．拡散を無視すれば ，支配方程式は実特性を持つ双曲型になり，特性方向の内微分のみの常微分方程式系になる．特性曲線法ではこの方程式系を特性曲
線のメッシュ上で解く．この解法の特徴は，特異性 (例えば膨張扇) を正確に扱えること，不連続が特性に沿って拡散せずに伝播，メッシュ粗く取ることができ計算時間小，不連続の数が増すとプログラムが急激に煩雑になることである．

流れの方程式
ラグランジュ空間 (r t) を考える．流体粒子の流脈線はこの空間内では r = const:，質量・運動量・エネ

ルギーの保存方程式は 47

vt ; Rr ur = uv
R1
Rut +  r pr = 0
0
Tst = t + pvt = 0(16.143a)(16.143b)(16.143c)

また

Rt = up = p(v )(16.144)

ただし r はラグランジュ座標，R はオイラー座標，@=@t はオイラー座標系の実質微分 (substantial derivative)に相当の演算子である．v = 0 =，平面，円柱，球面流れに対しそれぞれ  = 0 1 2，また u は流速， p T s  はそれぞれ密度，静圧，静温度，比エントロピー，比内部エネルギーである．
次に特性曲線に沿って伝播する圧力波の式を示す．

@p  = @v  @p  = ; v2 @p  = ; v2 pt
c2 = @@ r @v r
 @v r v
rt
Hoskin, N.E., Solution by characteristics of the equations of one-dimensional unsteady ow, Methods in Computational
Physics, ed. Alder, B., Fernbach, S., Rotenberg, M., Vol.3 Fundamental Methods in Hydrodynamics, pp.265{93,1964,
Academic Press.;47 任意関数を( ) とすれば，t = tR + t R = tR + R
0

0

46

f t R t r

f

f

R f

f

uf

ただし ftR はオイラー座標系における時間微分である．
面積比は Rr ，体積比は (R=r ) Rr = 0 = = v ，質量保存の式は (v )t = 0 すなわちn  R  o
 R 
 R 
 R 
 R 
@
u
uv
@t



r

R

r

= t


r

これより式 (16.143a) が導かれる．
また運動量保存の式は

t=;

u

1

r +

R

R

1 pr = ; 1  R  p
=
;
r
R

 Rr
0
r

r

r +

R

r

r = t v + 

u

R

+



r

r =0

u

p

これより式 (16.143b) が導かれる．なおこれらの式の導出には体積比の関係が随所に用いられた．

88

圧縮性流れの解法|１次元 Euler 方程式

ただし下添え字の r は r =const. を意味し ，この式の微分は同一流体粒子すなわち熱力学システムの状態のcv(16.143a) に上式の関係を用いれば ，
1 p + c R  u = ; uc
c t v r r
R
圧力波の伝播の式は (16.145)(16.143b) となり
1 np  c R  p o  nu  c R  u o = ; uct v rr
c t v r rRあるいは @=@t  (c=v )(R=r) @=@r = d=dt と置けば
1 dp  du + uc dt = 0
c R  dt に沿って
dr
=

c
R
v r
時間変化を示している．

(16.145)(16.146a)(16.146b)

またエントロピー波の伝播の式は式 (16.143c) から

ds = d + p dv = 0( dr = 0 に沿って )(16.147)c R 
v r -@@ 61 ;;@;
negative characteristic ;@@@;; @ positive characteristic?@ patht6r
次に不連続の条件について述べる．物質間の境界面 (interface)，自由表面など の接触不連続面 (contact

surface) は p u が連続，  s が不連続の流脈線である．

dR = u dt

dr = 0(16.148)

次に衝撃波は，その伝播速度を U とすれば

dR = U dt(16.149)で表され，ここではすべての変数が不連続になり次の Rankine-Hugoniot の関係が成立する48 ．

(u1 ; u0)2 = (p1 ; p0 )(v0 ; v1 )U = (v0 u1 ; v1 u0 )=(v0 ; v1)
1 ; 0 = 12 (p1 + p0)(v0 ; v1 )p1 = p1 (v1  1 )(16.150a)(16.150b)(16.150c)(16.150d)

ただし添え字の 0 は衝撃波の前方，1 は後方とする．衝撃波前方の u0  p0  v0  0 を既知とすれば ，上の 4式の未知変数は u1  p1  v1  1  U の 5 個になる．今 後方の流速 u1 の値を指定すれば残りの変数の値は決定

48 これらの式は Rankine-Hugoniot の式 (16.58) から導かれる．すなわち (a) 式は ]u2+p] = u]2 から，(b) 式は U = u]=]から導かれる．また (c) 式は ](e + p)u] = u]e] に (a) 式を考慮して導かれる．

特性曲線法とリーマン問題の解89できる．その計算手順は，v1 の予測値を (a) 式に入れ p1 を決定，(d) 式から 1 を決定，(c) 式により v1 の値を修正，以上を反復，収束後に U c1 を決定するというものである．

この項の終わりに，衝撃波などの不連続はないものとして特性格子の形成と解の延長について述べる．点A B の解が既知のときに点 D の解は式 (16.146b)(16.147) から得られる次の差分式から求められる．
h1i
h uc i
(
p
;
p
)
+
u
;
u
+
(16.151a)
D
A
D
A
c a
R a (tD ; tA ) = 0 ih(16.151b)rD ; rA ; vc Rr a (tD ; tA) = 0
h uc i
h1i
(
p
;
p
)
;
u
+
u
+
(16.151c)
D
B
D
B
c b
R b (tD ; tB ) = 0h irD ; rB + vc Rr b (tD ; tB ) = 0(16.151d)
RD ; RA ; u + c]a(tD ; tA) = 0(16.151e)
RD ; RB ; u ; c]b(tD ; tB ) = 0(16.151f)(16.151g)
D ; F + 21 (pD + pF )(vD ; vF ) = 0
添え字は下図参照．その手順は平均値  ] を予測，(b)(d) 式から rD  tD を決定，(a)(c) 式から pD  uD を決定，点 F の値を点 A B の値から補間，(g) 式と (16.144) から D  vD を決定，cD を決定，(e)(f) 式から
RD を決定，２つの値の違いは数値計算の誤差，平均値  ] を修正，以上を反復する．下図の自由表面の場
合には (c)(d)(f) 式は次のようになる．

pD = 0rD = rB
RD ; RB ; 12 (uD + uB )(tD ; tB ) = 0
この場合も同様に反復法で解かれる．

D

a ;@@
;
A;
PPPP @b
F PP@P
@P B

D

;
;
A;
PPPH free furface
B =F

以上述べた方法によって，不連続がなければ与えられた初期値をもとにその影響領域へ解を延長することができる．

プログラム
この計算では後の計算に必要なもののみ記憶し計算の結果はそのつど 出力する．特性のネットワークを繋いで，通常点，境界点，衝撃波点，自由表面点，端点などからなる計算点のチェーンを作り，各計算点のデータを次の 11 要素からなる解ベクトルに記憶する．

p v  c r R u U t 論理関数  2
ただし 論理関数には媒質と計算点のタイプを識別する番号，当該および左右の点のアドレ スを記憶，計算点のタイプを示す番号は

90
0
1
2
3
4
5

圧縮性流れの解法|１次元 Euler 方程式
通常点 (ordinary point)

境界点 (interface point)

２つの媒質の境界

単純衝撃波点 (simple shock point)

複雑衝撃波点 (complex shock point)
自由表面点 (free surface point)
端点 (edge point)

静止気体中を伝播する衝撃波
運動気体中を伝播する衝撃波

真空との境界

膨張波の前面とする．また SIGN は計算点チェーンに沿って時間の増加と共に r が増加するときに正，r が減少するときに負とする．SIGN の導入により左右に伝播する波が同じサブルーチンで計算可能になる．計算の結果は解ベクトル

SV リストVV リスト

SIGN

特殊ベクトルリスト，特殊点 2, 3, 4, 5 のアドレスと数
空白ベクトルリスト，解で満たされない点のアドレスと数で表される．
この解法の一つの計算点チェーンの計算手順は次のようになる．

(i) SV リストを走査し ，t 最小の特殊点 B を選ぶ．
(ii) 点 B のタイプ (2, 3, 4, or 5) を調べる．
(iii) 更に B が干渉点かを調べ，もしそうであれば反射波，透過波を計算する．
(iv) B から左へ左隣接点の t が大きくなる点 M をさがす．点 LMN から通常点または境界点 P を計算する．(iv) の計算を B のところまで繰返し実行する．
(v) 必要に応じ ，B から右へ (iv) に相当の計算を実行する．
(vi) 次の特殊点 A に対し同様の操作を行う．






t A

SS

S

S
 S BS SS 
SS SS 
SS
 SS  SS SS P SSS
LS SNSM

r
通常点 (タイプ 0) の計算：

P

Q Q 特性Q;Q 
QN
L
Q Q




QQ 
Q
特性

@

M

点 LMN のデータから点 P の位置と流れを計算する．式 (16.151a){(16.151d) を特性 LP ，NP に沿って用い pP  rP  uP  tP ，式 (16.151e){(16.151g)(16.144) から vP  P  cP  RP を予測子修正子法で計算する．

91

特性曲線法とリーマン問題の解
境界点 (タイプ 1) の計算：

MN Q Q 特性

Q Q ;QQ ; Q
QL@境界面 QQQ O
Q QQQ 
Q
0

特性

@

0

MN

SIGN は+とする．rM N = rMN ．平均値  ] の値を予測，点 M N の位置，点 Q の位置を決定，( )Qの値を補間，特性 LM に沿っての式 (16.151a) と QN に沿っての式 (16.151c) から pM N  uM N を決定，
流脈 MM に沿っての式 (16.151g)，(16.144) から vM  vN を決定，更に M  N  cM  cN を決定する．
平均値  ] の値を修正し全体の計算を反復する．式 (16.151e)(16.151f)，dR=dt = u から RM N を決定，計算誤差をチェックする．なお点 O が Q の左にあるときには，O の代わりにその右隣接点を用いる．
0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

単純衝撃波点 (タイプ 2) の計算：

OO

M

@

QQQQQ


Q

0

OO

0

特性

0

0

特性

@ 衝撃波

@

QMQQ @ 衝撃波 QL L
M
0

LL



0

0

SIGN は+，uO = 0，pO  vO  O  cO は既知とする．ROO を指定する．uO の値を予測，式 (16.150) から pO  vO  O  cO  U を決定する．式 (16.149) から tOO を決定，また点 Q の位置を決定，( )Q の値を補間する．QO に沿って式 (16.151a) の残差を計算，これを減らすように uO を修正し，以上の計算を反復する．QO に沿っての式 (16.151e) から計算誤差をチェックする．右図では M の代わりに M を用いる．
0

0

0

0

0

0

0

0

0

0

0

複雑衝撃波点 (タイプ 3) の計算：

CC BB特性@  O BBO
 B 特性
特性
@

B;B
M


Q
@
Q
 QQQQ L 衝撃波 BB B

L B
 BB
B
BB  B
BB 
BB
A

 BB B
特性@  OBBBO
  B 特性特性@M  B;BQ
Q QQQQ L @ 衝撃波 BB
BB D
L B 
B
AB
 BBBB
BB  BB
B 
BB 
E B

0

0

0

0

)C を計算する．uO の値を予測，U を予測，式 (16.151e)(16.149)
から tOO 決定，( )O の値を補間，式 (16.150) から pO  vO  O  cO  U 決定する．U を修正し以上の計
衝撃波前方の低圧側のものとして (
0

0

0

0

0

0

92

圧縮性流れの解法|１次元 Euler 方程式

算を反復する．Q の位置を決定，()Q の値を補間，QO に沿って式 (16.151a) の残差を計算，uO を修正
00

し以上の計算を反復する．右図では B を捨てる．
自由表面点 (タイプ 4) の計算：
特性

OO
0

M

QQ @ @

 Q QQQ 自由表面
QL L
0

自由表面点と単純衝撃波点の取扱いを同じにするため，対の点 OO0 を用い，自由表面の条件を Rankine-

Hugoniot の関係の退化したものと考える．pOO = OO = cOO = 0，rOO 既知とする．ROO を指定する．
uOO を予測，OL に沿って dR=dt = u から tOO を決定，点 Q の位置を決定，( )Q の値を補間，QO に沿って式 (16.151a) の残差を計算，これを減らすように uOO を修正，以上の計算を反復する．なお Q が点
0

0

0

0

0

0

0

0

0

M の左側にくるときには，点 M からの正特性の延長線と自由表面の交点に点 OO を取る．
0

端点 (タイプ 5) の計算：

E Q

QQ; 特性
QQ L
;
QQ
自由表面

Q


E
0

ここでは SIGN 負とする．rE  uE (t) RE (t) は既知とする．平均値 ] を予測，点 E の位置を決定，0

uE  pE  vE  E  cE を決定，RE を比較，平均値  ] を修正し以上の計算を反復する．
0

0

0

0

0

0

１次元流れを解くには，以上述べたものの外に衝撃波と境界面の干渉 (反射波が衝撃波の場合，膨張扇の場合)，圧縮波からの衝撃波の生成，対向衝撃波 (opposite facing shocks) の干渉，追越し衝撃波 (overtaking

shocks) の干渉などのサブルーチンを用意する必要がある．次にリーマン問題のサブルーチンを示す．
リーマン問題の解

本項でははじめに通常点，境界点など のサブルーチンを示し ，次いでこれらを参考にリーマン問題のサブルーチンを作る．プログ ラム中の q1,q2,... は静圧 p = p, 比体積 v = v , 比内部エネルギー e = , 音

速 c = c, ラグランジュ座標系の距離 r = r, オイラー座標系の距離 CR = R, 流速 u = u, 衝撃波の伝播速度

CU = U , 時間 t = t の 9 要素からなる解ベクトルである．ORDINP は通常点のサブルーチンで，与えられた
データ q1 = qL , q3 = qN から通常点の解ベクトル q2 = qP を求めるものである．INTERF は境界点のサブルーチンで，与えられたデータ q1 = qL , q2 = qM , q3 = qN , q4 = qO から境界点の q2 = qM 0 , q3 = qN 0 を求めるものである．また SSHOCK は単純衝撃波点のサブルーチンで，与えられたデータ q1 = qM , q2 = qL0 ,q3 = qL から衝撃波点の q2 = qO0 , q3 = qO を求めるものである．
リーマン衝撃波管流れ問題では初期状態の流速は 0 であるが，ここでは Godunov 法におけるリーマン問

題を考え，初期流速は必ずしも 0 ではないものとする．図 16.27 はリーマン問題のサブルーチン RIEMANNの計算点を示したもので，ここでは

 で示す点の位置と流れが求められる．すなわち予測子修正子法によ

93

特性曲線法とリーマン問題の解

図 16.27: リーマン問題の計算点
り，与えられた隔膜後方と前方の静圧，比体積，流速 p1  v1  u1  p6  v6  u6 ，比熱比 ，予測値 p4  v5 を基に，膨張扇内の点 JKL の位置と流れ，衝撃波点 O の流れ，境界点 MN の位置と流れの順に，それぞれサブルーチン EXPFAN，RAKHUG または INTERF を引用して反復計算される．以下にこの計算に用いられるプロ
グラムを示すが，解の出力とグラフィックスに関する部分は省略してある．s = SIGN に

1 を入れること

により流れの向きを変えることができる．
PROGRAM MAIN!*******************************************************************************************! Problem: Riemann Shock Tube Flow Problem! Numerical Method: Characteristic Method!*******************************************************************************************PARAMETER(if=100)
DIMENSION q1(9),q2(9),q3(9),q4(9),q5(9),q6(9),qJ(9),qK(9),qL(9),qM(9),qN(9),qO(9), &qQ(9),x(0:if),qs(0:if,3),R(7),t(7)COMMON ak,ak1,dR
DATA ak,dR/1.4,.1/ ak1=ak-1! Initial data
DATA p1,v1,u1,p6,v6,u6/1.,1.,0., .1,10.,0./!high and low pressure side conditions
q1(1)=p1 q1(2)=v1 q1(7)=u1 q6(1)=p6 q6(2)=v6 q6(7)=u6
CALL RIEMANN(q1,q2,q3,q4,q5,q6,qJ,qK,qL,qM,qN,qO,qQ,1.)! Output of computational results:
CALL RIEMANNCG(R,t,x,qs,if)!Graphics
STOP
END PROGRAM MAIN
SUBROUTINE ORDINP(q1,q2,q3,err)!ordinary point
REAL q1(9),q2(9),q3(9)COMMON ak,ak1
p1=q1(1) v1=q1(2) e1=q1(3) c1=q1(4) r1=q1(5) CR1=q1(6) u1=q1(6) t1=q1(9)p3=q3(1) v3=q3(2) e3=q3(3) c3=q3(4) r3=q3(5) CR3=q3(6) u3=q3(6) t3=q3(9)aa=c1/v1 ab=c3/v3na=0
1 na=na+1
rhsa=r1-aa*t1 rhsb=r3+ab*t3 del=aa+ab
rP=(rhsa*ab+rhsb*aa)/del tP=(rhsb-rhsa)/delrhsa=p1+aa*u1 rhsb=p3-ab*u3 del=-aa-abpP=(-ab*rhsa-aa*rhsb)/del uP=(rhsb-rhsa)/delpF=((rP-r3)*p1+(r1-rP)*p3)/(r1-r3)
vF=((rP-r3)*v1+(r1-rP)*v3)/(r1-r3)
eF=((rP-r3)*e1+(r1-rP)*e3)/(r1-r3)

94

圧縮性流れの解法|１次元 Euler 方程式

pm=.5*(pP+pF) vP=(eF+pm*vF)/(pP/ak1+pm)
eP=pP*vP/ak1 cP=SQRT(ak*pP*vP)
aa=.5*(c1/v1+cP/vP) ab=.5*(c3/v3+cP/vP)
IF(na.LE.2)
GOTO 1
CRa=CR1+.5*(u1+c1+uP+cP)*(tP-t1)
CRb=CR3+.5*(u3-c3+uP-cP)*(tP-t3)
CRP=.5*(CRa+CRb) err=CRa-CRb
q2(1)=pP q2(2)=vP q2(3)=eP q2(4)=cP q2(5)=rP q2(6)=CRP q2(7)=uP q2(9)=tP
END SUBROUTINE ORDINPSUBROUTINE INTERF(q1,q2,q3,q4,qQ,s,err)!interface point
REAL q1(9),q2(9),q3(9),q4(9),qQ(9)COMMON ak,ak1
p1=q1(1) v1=q1(2)
c1=s*q1(4) r1=q1(5) CR1=q1(6) u1=q1(7) t1=q1(9)v2=q2(2) e2=q2(3)p3=q3(1) v3=q3(2) e3=q3(3) c3=s*q3(4) r3=q3(5) CR3=q3(6) u3=q3(7) t3=q3(9)p4=q4(1) v4=q4(2)
r4=q4(5) CR4=q4(6) u4=q4(7) t4=q4(9)rN=q3(5)aa=c1/v1 ab=c3/v3 ac=(r3-r4)/(t3-t4)na=0
1 na=na+1
tN=t1+1./aa*(rN-r1)
rhsb=rN+ab*tN rhsc=r3-ac*t3 del=-ab-acrQ=(-ac*rhsb-ab*rhsc)/del tQ=(rhsc-rhsb)/delpQ=((rQ-r4)*p3+(r3-rQ)*p4)/(r3-r4)
vQ=((rQ-r4)*v3+(r3-rQ)*v4)/(r3-r4)
eQ=pQ*vQ/ak1 cQ=s*SQRT(ak*pQ*vQ)
uQ=((rQ-r4)*u3+(r3-rQ)*u4)/(r3-r4)
rhsa=p1+aa*u1 rhsb=pQ-ab*uQ del=-aa-abpN=(-ab*rhsa-aa*rhsb)/del uN=(rhsb-rhsa)/delpb=.5*(p3+pN)
vM=(e2+pb*v2)/(pN/ak1+pb) eM=pN*vM/ak1 cM=s*SQRT(ak*pN*vM)
vN=(e3+pb*v3)/(pN/ak1+pb) eN=pN*vN/ak1 cN=s*SQRT(ak*pN*vN)
aa=.5*(c1/v1+cM/vM) ab=.5*(cQ/vQ+cN/vN)
IF(na.LE.2)
GOTO 1
CRQ=((rQ-r4)*CR3+(r3-rQ)*CR4)/(r3-r4)
CRM=CR1+.5*(u1+c1+uN+cM)*(tN-t1)
CRN=CRQ+.5*(uQ-cQ+uN-cN)*(tN-tQ)
CR =CR3+.5*(u3+uN)*(tN-t3)
err=ABS(CRM-CR)+ABS(CRN-CR) CRM=.5*(CRN+CRN)
q2(1)=pN q2(2)=vM q2(3)=eM q2(4)=s*cM q2(5)=rN q2(6)=CRN q2(7)=uN q2(9)=tN
q3(1)=pN q3(2)=vN q3(3)=eN q3(4)=s*cN q3(5)=rN q3(6)=CRN q3(7)=uN q3(9)=tN
qQ(1)=pQ qQ(2)=vQ qQ(3)=eQ qQ(4)=s*cQ qQ(5)=rQ qQ(6)=CRQ qQ(7)=uQ qQ(9)=tQ
IF(s*rQ>s*r4)FORALL(i=1:9)q3(i)=qQ(i)END SUBROUTINE INTERFSUBROUTINE SSHOCK(q1,q2,q3,s,err)!simple shock point
REAL q1(9),q2(9),q3(9),qO(9)COMMON ak,ak1,dR
FORALL(i=1:9)qO(i)=q2(i)p1=q1(1) v1=q1(2) c1=s*q1(4) r1=q1(5) CR1=q1(6) u1=q1(7) t1=q1(9)p2=q2(1) v2=q2(2) c2=s*q2(4) r2=q2(5) CR2=q2(6) u2=q2(7) t2=q2(9)v3=q3(2)
CRO=CR2+s*dR rO=r2+s*dR/v3
aa=c2/v2 ab=.5*(c1/v1+c2/v2) bb=(r1-r2)/(t1-t2)
1 pO=qO(1) vO=qO(2) cO=s*qO(4) uO=qO(7) CU=qO(8)tO=t2+s*dR/CU

特性曲線法とリーマン問題の解
rhsa=rO-aa*tO rhsb=r2-bb*t2 del=aa-bb
rQ=(-bb*rhsa+aa*rhsb)/del tQ=(rhsb-rhsa)/delpQ=((rQ-r2)*p1+(r1-rQ)*p2)/(r1-r2)
vQ=((rQ-r2)*v1+(r1-rQ)*v2)/(r1-r2)
eQ=pQ*vQ/ak1 cQ=s*SQRT(ak*pQ*vQ)
uQ=((rQ-r2)*u1+(r1-rQ)*u2)/(r1-r2)
aa=.5*(cQ/vQ+cO/vO)
uO1=uQ-(pO-pQ)/aaalpha=.7 du=uO1-uO uO=uO+alpha*duqO(7)=uO
CALL RANHUG(q3,qO,n)IF(ABS(du).GE..001)
GOTO 1
CRQ=((rQ-r2)*CR1+(r1-rQ)*CR2)/(r1-r2)
CRO1=CRQ+.5*(uQ+cQ+uO+cO)*(tO-tQ) err=CRO1-CRO
IF(s*rQ>s*r1)THEN
q1(1)=pQ q1(2)=vQ q1(3)=eQ q1(4)=s*cQ q1(5)=rQ q1(6)=CRQ q1(7)=uQ q1(9)=tQ
ENDIF
FORALL(i=1:9)q2(i)=qO(i) q2(5)=rO q2(6)=CRO q2(9)=tO
q3(5)=rO q3(6)=CRO q3(9)=tO
END SUBROUTINE SSHOCKSUBROUTINE RIEMANN(q1,q2,q3,q4,q5,q6,qJ,qK,qL,qM,qN,qO,qQ,s)!s=SIGN
REAL q1(9),q2(9),q3(9),q4(9),q5(9),q6(9),qJ(9),qK(9),qL(9),qM(9),qN(9),qO(9),qQ(9)COMMON ak,ak1
OPEN(20,FILE='OUTPUT.dat')! initial data q=(p,v,e,c,r,R,u,U,t)p1=q1(1) v1=q1(2) q1(3)=p1*v1/ak1 c1=s*SQRT(ak*p1*v1) q1(4)=s*c1 u1=q1(7)p6=q6(1) v6=q6(2) q6(3)=p6*v6/ak1 c6=s*SQRT(ak*p6*v6) q6(4)=s*c6 u6=q6(7)DATA CR11,CR61,p4,v5/-.1, .4, .28, 5./!DATA CR11,CR61,p4,v5/-.1, .4, .5, 2./
CR1=s*CR11 CR6=s*CR61! r: R1=(1-s*u1/c1)v1r1, r2=r3=r4=r5=0, R6=v6r6+u6t6
q1(5)=-c1/v1/(u1-c1)*CR1! R1:given, R2=R3=R4=R5=0, R6:given
q1(6)=CR1 q6(6)=CR6 qO(6)=CR6! u1:given, u2,u3,u4:pcm, u5=u4, u6:given! t1=-R1/(u1+s*c1), t2=t3=t4=t5=0, t6=R6/U
q1(9)=-CR1/(u1+c1)
w=u1+2.*c1/ak1na=0
1 na=na+1! p1:given, p2,p3,p4:pcm, p5=p4, p6:given
p2=(2.*p1+p4)/3. p3=(p1+2.*p4)/3. p5=p4! v1:given, v2,v3,v4:Riemann invariant, v5:pcm, v6:given! e=pv/(k-1) c^2=kpv
WRITE(20,'(/1H 5X A4,I3)')'na =',na
WRITE(20,'(2X 9A9)')'p','v','e','c','r','R','u','U','t'
WRITE(20,'(A5,9F9.3)')'q1 = ',q1
qJ(1)=p2
CALL EXPFAN(q1,qJ,s,w,n,err)
WRITE(20,'(A5,10F9.3,I4)')'qJ = ',qJ,err,nqK(1)=p3
CALL EXPFAN(qJ,qK,s,w,n,err)
WRITE(20,'(A5,10F9.3,I4)')'qK = ',qK,err,nqL(1)=p4
CALL EXPFAN(qK,qL,s,w,n,err)
WRITE(20,'(A5,10F9.3,I4)')'qL = ',qL,err,n

95

96

圧縮性流れの解法|１次元 Euler 方程式

qO(2)=v5 qO(7)=qL(7)CALL RANHUG(q6,qO,n)t6=q6(6)/qO(8)
q6(9)=t6 qO(9)=t6
r6=(CR6-u6*t6)/v6 q6(5)=r6 qO(5)=r6
WRITE(20,'(A5,9F9.3)')'q6 = ',q6
WRITE(20,'(A5,9F9.3,9X I4)')'qO = ',qO,nFORALL(i=1:9)qM(i)=qL(i) qM(5)=0. qM(6)=0. qM(9)=0.
FORALL(i=1:9)qN(i)=qO(i) qN(5)=0. qN(6)=0. qN(9)=0. qN(8)=0.
CALL INTERF(qL,qM,qN,qO,qQ,s,err)
WRITE(20,'(A5,10F9.3)')'qM = ',qM,err
WRITE(20,'(A5, 9F9.3)')'qN = ',qN,'qQ = ',qQ
dp=qM(1)-qO(1) du=qM(7)-qO(7)IF(na>=20.OR.ABS(dp)+ABS(du)<=.0001)
RETURNalpha=.7 dp=qO(1)-p4 p4=p4+alpha*dp
v5=qO(2)
GOTO 1END SUBROUTINE RIEMANNSUBROUTINE EXPFAN(q1,q2,s,w,n,err)!Expansion fan
REAL q1(9),q2(9)COMMON ak,ak1
p1=q1(1) v1=q1(2) c1=s*q1(4) r1=q1(5) u1=q1(7) t1=q1(9)p2=q2(1) c2=c1 v2=v1
n=0
1 n=n+1 IF(n>20)STOP
aa=.5*(c1/v1+c2/v2)
u2=u1-(p2-p1)/aa
c2=ak1*(w-u2)/2. v21=c2*c2/ak/p2 dv=v21-v2
v2=v21
IF(ABS(dv)>.001)
GOTO 1q2(3)=p2*v2/ak1
a2=c2/v2 r2=(r1-aa*t1)/(1+aa/a2) t2=-r2/a2
q2(6)=q1(6)+.5*(u1+c1+u2+c2)*(t2-t1)
q2(2)=v2 q2(4)=s*c2 q2(5)=r2 q2(7)=u2 q2(9)=t2
END SUBROUTINE EXPFANSUBROUTINE RANHUG(q0,q1,n)!Rankine-Hugoniot equations
REAL q0(9),q1(9)COMMON ak,ak1
OPEN(20,FILE='OUTPUT.dat')
p0=q0(1) v0=q0(2) e0=q0(3) c0=q0(4) u0=q0(7)v1=q1(2) u1=q1(7)n=0 !WRITE(20,'(1H 6A9)')'n','p1','v11','v1','e1','c1'
1 n=n+1 IF(n>20)
STOP
p1=p0+(u1-u0)*(u1-u0)/(v0-v1)
e1=p1*v1/ak1 c1=SQRT(ak*p1*v1)
v11=v0-2.*(e1-e0)/(p0+p1)
alpha=.16 dv=v11-v1 v1=v1+alpha*dv!small damping factor!WRITE(20,'(5X I5,1X 5F9.3)')n,p1,v11,v1,e1,c1
IF(ABS(dv)>.001)
GOTO 1CU=(v0*u1-v1*u0)/(v0-v1)
q1(1)=p1 q1(2)=v1 q1(3)=e1 q1(4)=c1 q1(8)=CU
END SUBROUTINE RANHUG

ここで多少補足説明すれば ，隔膜は原点 r = R = 0 にあり，オイラー座標 R とラグランジュ座標 r の関

特性曲線法とリーマン問題の解97

係は次のようになる．

dR = v dr (t = const:に沿って)； dR = u dt (r = const:に沿って)
dR = 1  uc v dr
(特性 dr  (c=v)dt = 0 に沿って)

なお静止流体中では任意の方向に dR = v dr である．また完全気体の関係が成立し  = pv=(;1) c2 = pv

なる関係が成立するものとする．膨張扇に関しては線 2J 3K 4L は特性で，これらの各特性上の流れは一定になる．またこれらの特性を横断する正特性 dr=dt = u+c 上では，式 (16.151a) が成立しかつリーマン不変;1) が一定になるので，p の値を与えれば v  c u の値は決定できることになる．解の収束状況は jdpj + jduj < 0:0001 から判定される．ただし dp = pM ;pO  du = uM ;uO である．プログラムでは前記の計算結果を基に良質の予測値を与えているが，かなりはずれた予測値，例えば p4 = 0:5 v5 = 2:0を与えても 5 回の反復で同じ結果が得られる．なおサブルーチン RAKHUG では v1 の修正に際し強いダンピ
ング係数 0.16 を用いている．また全体の予測子修正子法の計算でも p4 の修正にダンピング係数 0.7 を用い
量 w = u + 2c=(ている．これらの係数は試行錯誤で決定したものでこの場合の最適値に近いものである．

図 16.28 に計算で求めた s = 1 の場合の xt 面上の膨張扇，境界面，衝撃波と，t = 2:0 における密度，流速，静圧の分布を示す．なお s =;1 に選べば逆向きの解が得られる．

図 16.28: xt 面上の膨張扇等と t = 2:0 の密度等分布