○移流方程式の解法

今回は流体シミュレーションにむけて、移流方程式(波動方程式)の数値的解法について述べます。

・移流方程式

移流方程式は、連続の式において速度一定とした場合の式に相当します。

$\displaystyle{\frac{\partial u(x,t) }{\partial t }}+c\displaystyle{\frac{\partial u(x,t)}{\partial x }}=0$

ここで$c$は移流速度(波動速度)に相当します。

初期条件を$u(x,t=0)=f(x)$とすると、この式の解は$u(x,t)=f(x-ct)$と書けます。すなわち、時刻$t$でのプロファイルは、初期$t=0$でのプロファイルの形を変えずに$ct$だけ移動したものになります。

一般的な流体計算において速度は空間的に変動し、また時間発展しますが、ここではまず、速度一定の場合について考えます。


・風上差分法

時間・空間方向ともに1次精度の解法です。$c>0$のとき、時間、空間の変数$t$,$x$に対し、以下のように差分近似します。

$\displaystyle{\frac{\partial u(x,t) }{\partial t }}\rightarrow \displaystyle{\frac{u_j^{n+1}-u_j^n }{\Delta t}}$

$\displaystyle{\frac{\partial u(x,t) }{\partial x }}\rightarrow \displaystyle{\frac{u_{j}^n-u_{j-1}^n }{\Delta x}}$

$c<0$のときは空間微分を以下のように差分近似します。

$\displaystyle{\frac{\partial u(x,t) }{\partial x }}\rightarrow \displaystyle{\frac{u_{j+1}^n-u_{j}^n }{\Delta x}}$

このように常に流れの上流(風上)側の差分を取ることにより、安定に計算を行う方法です。

このとき、解くべき離散化された移流方程式は、以下のようになります。

$u_j^{n+1}=u_j^n-r(u_{j}^n-u_{j-1}^n)\ \ \ \ \ {\rm if}\ c>0$

$u_j^{n+1}=u_j^n-r(u_{j+1}^n-u_{j}^n) \ \ \ \ \ {\rm if}\ c<0$

$r\equiv\displaystyle{\frac{c\Delta t}{\Delta x}}$

以下に$c>0$, 初期条件

$u(x,0)=1\ \ \ \ \ {\rm if}\ 0.1 < x < 0.3 $

$u(x,0)=0\ \ \ \ \ {\rm otherwise}$

境界条件 $u(0,t)=0$ とした場合のプログラム例を記します。

     1  program main
     2    implicit none
     3  
     4    integer,parameter:: jmax=200
     5    integer,parameter:: nmax=250
     6    integer,parameter:: nint=25
     7  
     8    double precision, dimension(0:jmax):: u
     9    double precision, dimension(1:jmax):: unew
    10    double precision delx,delt,c,r,x
    11  
    12    integer j,n
    13  
    14    character(len=10) fname
    15  
    16    delx=2.0d0/dble(jmax)
    17    delt=delx/2.0d0
    18    c=1.0d0
    19    r=c*delt/delx
    20  
    21    do j=0,jmax
    22       if(j<10 .or. j>30)then
    23          u(j)=0.0d0
    24       else
    25          u(j)=1.0d0
    26       end if
    27    end do
    28  
    29    do n=0,nmax
    30  
    31       if(mod(n,nint)==0) then
    32          write(fname,'(a,i5.5,a)') 't',n,'.dat'
    33          open(10,file=fname)
    34          do j=0,jmax
    35             write(10,'(2f12.5)') dble(j)*delx,u(j)
    36          end do
    37          close(10)
    38       end if
    39  
    40       do j=1,jmax
    41          unew(j)=u(j)*(1.0d0-r)+u(j-1)*r
    42       end do
    43  
    44       do j=1,jmax
    45          u(j)=unew(j)
    46       end do
    47  
    48    end do
    49  
    50  end program main

風上差分法を安定に解くための条件は、$r<1.0$です(クーラン条件)。$r>1.0$のとき、$c\Delta t>\Delta x$となります。情報は移流速度cで伝わりますが、$c\Delta t>\Delta x$のとき時間Δtの間に情報が格子間隔Δxを超えて伝わることになってしまい、計算が破たんします。


・ラックス・ヴェンドロフ法

時間・空間方向ともに2次精度をもつ解法です。

時間・空間に対し、テイラー展開の2次の項まで扱うことにより、以下のような差分近似を行います。

$u_j^{n+1}=u_j^n-c \displaystyle{\frac{\Delta t}{2\Delta x}}(u_{j+1}^n-u_{j-1}^n)+ \displaystyle{\frac{1}{2}}c^2\displaystyle{\biggl(\frac{\Delta t}{\Delta x}\biggr)^2}(u_{j+1}^n-2u_j^n+u_{j-1}^n)$

上述の風上差分法のプログラムにおいて、40-42行目を以下のように変更すると、ラックス・ヴェンドロフ法により移流方程式を解くことができます。

do j=1,jmax-1
   unew(j)= u(j+1)*0.5d0*r*(r-1.0d0)& 
             &+u(j)*(1.0d0-r*r)+u(j-1)*0.5d0*r*(1.0d0+r)
end do

ラックス・ヴェンドロフ法を安定に解くための条件も$r<1$です。

ラックス・ヴェンドロフ法は、流体方程式の解法として、よく使われてきた手法の1つです。

○課題○ 風上差分法とラックス・ヴェンドロフ法で安定性条件を満たす場合の計算結果を比較し、それぞれ矩形波が数値誤差のために時間とともにどのように変形するかを確認せよ。

○課題○ 初期条件がガウシアン(例えば$f(x)=\exp(-((x-0.3)/0.1)^2)$)のときの計算結果を風上差分法とラックス・ヴェンドロフ法の場合で比較し、精度の違いを確認せよ。

○課題○ 風上差分法やラックス・ヴェンドロフ法でΔt、Δxの値を変え、安定性条件を満たさない場合に計算が不安定になり、破たんすることを確認せよ。

○課題○ 空間微分を1次精度の中間差分で差分近似した場合、すなわち

$u_j^{n+1}=u_j^n-c \displaystyle{\frac{\Delta t}{2\Delta x}}(u_{j+1}^n-u_{j-1}^n)$

とした場合、この解法は任意の$r=c\Delta t/\Delta x$に対して不安定であることを確認せよ。