ENO(Essentially Non-Oscillatory polynomial interpolation)は風上差分を改良し,
3次多項式の形で近似することで3次精度を実現した方法である.
ENOの最初のアイデアは
((A. Harten, B. Engquist, S. Osher and S. Chakravarthy, "Uniformly high-order accurate essentially non-oscillatory schemes III", J. Comput. Phys. 71, pp.231-303, 1987.))
で提案され,
((C.-W. Shu and S. Osher, "Efficient implementation of essentially non-oscillatory shock capturing schemes", J. Comput. Phys. 77, pp.439-471, 1988.)),
((C.-W. Shu and S. Osher, "Efficient implementation of essentially non-oscillatory shock capturing schemes II", J. Comput. Phys. 83, pp.32-78, 1989.))
で数値計算に適用され,
((S. Osher and J. Sethian, "Fronts propagating with curvature dependent speed: algorithms based on Hamilton-Jacobi formulations", J. Comput. Phys. 79, pp.12-49, 1988.))
でHamilton-Jacobi(HJ)方程式へ適用された(HJ ENO).
移流方程式はHJ方程式であるので,ここからは,HJ ENOについて説明する.

HJ ENOの式を述べる前に,準備として差分式を定義しておく.
&ref(eqa_phii.gif,,70%);のn階差分を&ref(eqa_Dinphi.gif,,70%);と表記する.とすると,n=0は,
#ref(eqa_eno1.gif,,70%)
&ref(eqa_phii.gif,nolink,70%);のn階差分を&ref(eqa_Dinphi.gif,nolink,70%);と表記する.とすると,n=0は,
#ref(eqa_eno1.gif,nolink,70%)

となる.ここで,iはグリッド番号(座標値&ref(eqa_xi.gif,,70%);).
となる.ここで,iはグリッド番号(座標値&ref(eqa_xi.gif,nolink,70%);).

1階差分はグリッド間(i-1/2とi+1/2)で定義される.
#ref(eqa_eno2.gif,,70%)
#ref(eqa_eno3.gif,,70%)
#ref(eqa_eno2.gif,nolink,70%)
#ref(eqa_eno3.gif,nolink,70%)

2階差分はi-1/2とi+1/2での1階差分値を使って,iで定義される.
#ref(eqa_eno4.gif,,70%)
#ref(eqa_eno4.gif,nolink,70%)

同様に3階差分は,
#ref(eqa_eno5.gif,,70%)
#ref(eqa_eno6.gif,,70%)
#ref(eqa_eno5.gif,nolink,70%)
#ref(eqa_eno6.gif,nolink,70%)

ENOでは3次多項式により&ref(eqa_phi.gif,,70%);を近似する.
#ref(eqa_eno7.gif,,70%)
ENOでは3次多項式により&ref(eqa_phi.gif,nolink,70%);を近似する.
#ref(eqa_eno7.gif,nolink,70%)

ここで,&ref(eqa_Qm.gif,,70%);はm次項である.
&ref(eqa_phix+i.gif,,70%);, &ref(eqa_phix-i.gif,,70%);の式がほしいので,
上式を微分して,x=&ref(eqa_xi.gif,,70%);とすると,
#ref(eqa_eno8.gif,,70%)
ここで,&ref(eqa_Qm.gif,nolink,70%);はm次項である.
&ref(eqa_phix+i.gif,nolink,70%);, &ref(eqa_phix-i.gif,nolink,70%);の式がほしいので,
上式を微分して,x=&ref(eqa_xi.gif,nolink,70%);とすると,
#ref(eqa_eno8.gif,nolink,70%)

-1次項&ref(eqa_Q1d.gif,,70%);~
&ref(eqa_phix-.gif,,70%);の場合k=i-1,&ref(eqa_phix+.gif,,70%);でk=iとすると,
#ref(eqa_eno9.gif,,70%)
#ref(eqa_eno10.gif,,70%)
&ref(eqa_Q1d.gif,,70%);のみの場合が風上差分に相当する.これに,2次項,3次項を加えることで,3次精度を得る.
-1次項&ref(eqa_Q1d.gif,nolink,70%);~
&ref(eqa_phix-.gif,nolink,70%);の場合k=i-1,&ref(eqa_phix+.gif,nolink,70%);でk=iとすると,
#ref(eqa_eno9.gif,nolink,70%)
#ref(eqa_eno10.gif,nolink,70%)
&ref(eqa_Q1d.gif,nolink,70%);のみの場合が風上差分に相当する.これに,2次項,3次項を加えることで,3次精度を得る.

-2次項&ref(eqa_Q2d.gif,,70%);~
#ref(eqa_eno11.gif,,70%)
#ref(eqa_eno12.gif,,70%)
-2次項&ref(eqa_Q2d.gif,nolink,70%);~
#ref(eqa_eno11.gif,nolink,70%)
#ref(eqa_eno12.gif,nolink,70%)
ここで,
#ref(eqa_eno13.gif,,70%)
#ref(eqa_eno13.gif,nolink,70%)

-3次項&ref(eqa_Q3d.gif,,70%);~
#ref(eqa_eno14.gif,,70%)
#ref(eqa_eno15.gif,,70%)
-3次項&ref(eqa_Q3d.gif,nolink,70%);~
#ref(eqa_eno14.gif,nolink,70%)
#ref(eqa_eno15.gif,nolink,70%)
ここで,
#ref(eqa_eno16.gif,,70%)
#ref(eqa_eno17.gif,,70%)
#ref(eqa_eno16.gif,nolink,70%)
#ref(eqa_eno17.gif,nolink,70%)

これらによって,&ref(eqa_phixxi.gif,,70%);を求め,
#ref(eqa_eno18.gif,,70%)
により&ref(eqa_phi.gif,,70%);を更新する.
これらによって,&ref(eqa_phixxi.gif,nolink,70%);を求め,
#ref(eqa_eno18.gif,nolink,70%)
により&ref(eqa_phi.gif,nolink,70%);を更新する.

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS