移流現象とは,物質や運動量などの物理量が流れに従って運ばれる現象である(運動量や運動量に関係する物理量の場合は非線形となる.前に説明したBurgers方程式の左辺は非線形な移流現象を表している).
非常に単純な方程式であるが,流体の運動を支配するNavier-Stokes方程式を数値的に解く際に最も重要な(線形であったとしても面倒な)部分となる.ここでは,流れの速度が一定の
図(a)の概念図から方程式を誘導する(差分法の解説であるが,基礎式の誘導はコントロールボリュームを用いた有限体積法的である.支配方程式が保存則がベースであるので.).まず対象となる微小領域の濃度変化を考える.単位時間内にこの領域内に流入するフラックスは
この式の形式を保存形と呼ぶ.これは境界面での物理量の収支を計算しているので,物質の総量が保存される(ある計算セルから出て行った量は必ず隣の計算セルに入る.式自身が「物質がなくならないこと」(連続式)を保証している).一方,連続式が満たされる
この式は非保存型と呼ばれ,式自身は連続式を保証していない.今回の場合は移流速度
熱拡散の時にも述べたが,方程式(
整理すると
次に,より物理的に理解しやすい方法(有限体積法的な離散化方法)を説明する.はじめに示した図(b)に見られるような離散化を行う(時間の添字がついていない変数は全て既知の時間ステップ
整理整頓すると式(
ここで,プログラムの作成・実行前にVon Neumannの安定解析を行う.
複素数であるので,絶対値を計算すると常に1よりも大きくどのような条件でも安定にならないことがわかる(
実際にプログラムを作成して計算してみる.計算は,領域
厳密解は,分布の形を変えず速度1.0m/sで
program advection implicit none real(8) :: dx=0.05d0, dt=0.01d0, u=1.d0, s, x real(8), dimension(20) :: c=0.d0, c_old integer :: i, n, i_end=20, n_end=30, write_interval=2 character(128) fname ! parameter s = u*dt/dx ! writing initial condition write (fname, '("advection_result", i3.3, ".txt")') 0 open(88, file=fname, status='replace') x = -0.5*dx do i=1, i_end x=x+dx if(x>0.2 .and. x<0.5) then c(i)=1.0 end if write(88,*) x, c(i) end do close(88) c_old = c ! main loop do n=1, n_end do i=2, i_end-1 ! exclude boundaries c(i)=c_old(i)-0.5*s*(c_old(i+1)-c_old(i-1)) end do ! writing result if(mod(n,write_interval).eq.0) then write (fname, '("advection_result", i3.3, ".txt")') n open(99, file=fname, status='replace') x = -0.5*dx do i=1, i_end x=x+dx write(99,*) x, c(i) end do close(99) endif c_old = c ! stock data end do end program advection
結果のアニメーションを作成するGnuplotプログラムを以下に示す.
reset dt = 0.01 set term gif animate optimize size 640,480 set output 'advection_FTCS.gif' set title "Advection by FTCS" set xlabel "x (m)" set ylabel "C" set yrange [-0.5:1.5] do for [j = 0:30:2 ] { plot sprintf("./advection_result%03d.txt", j) with linespoints lw 3 title sprintf("time = %f s", j*dt)}
下のアニメーションに示すように,分布は本来あるべき初期の形で移動(並進)することなく,徐々に発散して行くことがわかる.
FTCSスキームでは計算が発散することがわかった.そこで,他の差分スキームの適用を試みる.時間差分は前進差分のままに固定して,空間の離散化スキームを変更してみよう.高次スキームは後ほど議論することにして,まずは,低次の前進差分と後退差分を検証することにする.前進差分による式(
このFTFSスキームによる結果アニメーションを以下に示す.アニメーションから確認できる様にFTCSスキームよりひどく,全く並進している様子がない.これまでと同様なVon Neumannの安定条件を計算すると,
ここで
今度は空間スキームに後退差分を利用するFTBSスキームを考え,離散化式は以下の様になる.
下に示すアニメーションから,FTBSでは形は変化してしまっている(矩形から拡散した様ななだらかな形状への変化)が,並進移動に関して最もよく表現できていることがわかる.FTBSスキームの安定条件を考える.
この結果から,安定であるためには
物理的な意味でなぜFTBSスキームが安定なのかを考えてみる.今回考えた
FTBSスキームは,安定であったが明らかに精度が低下している.差分法の概要説明で述べた様に,時間に関しても空間に関しても1次精度スキームとなっている.より精度の高い差分スキームとしてLax-Wendroff法が提案されている.風上差分は2階微分の項が誤差の主要項になっており,2階微分は拡散的に振る舞うため分布形がなだらかになると考えられる.そこで,時間差分で2次の項まで再現し,空間を中心差分で展開する方法を考える.まず,
ここで,支配方程式から
Lax-Wendroff法で計算した結果をアニメーションで示すと以下の様になる.結果を見ると,FTCSスキームの様に振幅が徐々に増大するわけではなく,さらに風上差分の様に振幅が急激に減衰することもない.また,安定条件は風上差分と同じ