ユーザーガイド 1.5系 - 4.4 数値スキーム

出典: OFWikiJa

[next] [prev] [up]

[編集] 4.4 数値スキーム

systemディレクトリにあるfvSchemes辞書は、アプリケーションの実行時に現われる、方程式における導関数等の項に対する数値スキームを設定します。 この節では、fvSchemes辞書においてどのように、これらのスキームを指定するかを説明します。 スキームの数学的な解説は、プログラマーズガイドの2.4節を見てください。

fvSchemesにおいて数値スキームを割り充てなければならない典型的な項は、例えば空間勾配構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla といった導関数項や、一つの点集合から他の集合へと値を補間する項等です。 OpenFOAMでは、ユーザーに制限無くスキームを選択できるようにしたいと思っています。 例えば、線形補間は多くのケースで効率的ですが、OpenFOAMでは、全ての補間項に対して幅広い補間スキームの中から自由に選択ができるようになっています。

導関数項では、より一層この選択の自由が顕著です。 ユーザーは、まず離散化手法を選択することができますが、ここではガウスによる有限体積積分を用いるのが一般的です。 ガウス積分は格子の界面における値を足していくことで実現されますが、界面での値は格子中心での値から補間しなければなりません。 この補間スキームにおいてもユーザは自由に選ぶことができ、特定の導関数項、特に対流項に用いる発散項構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\cdot には、特別に設計されたいくつかのスキームが用意されています。 数値スキームを指定しなければならない項はいろいろありますが、それらはfvSchemes辞書において表4.5に示すカテゴリに分類されます。 表4.5における各キーワードはサブ辞書の名前ですが、それらは各々特定のタイプの項を持っているわけです。 例えば、gradSchemesにはgrad(p)(構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla p と表現される)といった全ての勾配項があります。 その他の例は、以下に示したfvSchemes辞書の抜粋をご覧ください。

キーワード 数学的タームのカテゴリ
interpolationSchemes 2点間の値の補間
snGradSchemes 格子界面の法線方向勾配の各要素
gradSchemes 勾配 ∇
divSchemes 発散 ∇・
laplacianSchemes ラプラシアン ∇2
timeScheme 1次と2次の時間導関数 ∂/∂t,∂2/∂2t
fluxRequired フラックスの生成が必要な物理量

表4.5: fvSchemesで使用する主なキーワード

17  ddtSchemes 
18  { 
19      default         Euler; 
20  } 
21   
22  gradSchemes 
23  { 
24      default         Gauss linear; 
25      grad(p)         Gauss linear; 
26  } 
27   
28  divSchemes 
29  { 
30      default         none; 
31      div(phi,U)      Gauss linear; 
32  } 
33   
34  laplacianSchemes 
35  { 
36      default         none; 
37      laplacian(nu,U) Gauss linear corrected; 
38      laplacian((1|A(U)),p) Gauss linear corrected; 
39  } 
40   
41  interpolationSchemes 
42  { 
43      default         linear; 
44      interpolate(HbyA) linear; 
45  } 
46   
47  snGradSchemes 
48  { 
49      default         corrected; 
50  } 
51   
52  fluxRequired 
53  { 
54      default         no; 
55      p; 
56  } 
57   
58  // ************************************************************************* //

この例を見るとfvSchemes辞書は以下の要素から成りたっていることがわかります。

  • 6...Schemesのサブ辞書には、指定した各項に対するキーワードが書いてあり、defaultのキーワードも指定できますが、その他にも、例えば構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla p

についてはgrad(p)というように、特定の項に対して名前を書くことで、それに対応するキーワードを指定することが出来ます。

  • fluxRequiredのサブ辞書には、例えばpのように、アプリケーションの中でフラックスが生成される場が書かれています。


もし、defaultのスキームが特定の...Schemesの副辞書で指定された場合には、副辞書が参照している全ての項にそのスキームが適用されます。 例えば、gradSchemesにおいてdefaultが指定されている場合には、アプリケーションにおける構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla p構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla \textrm{\bold{U}} といった全ての勾配項に対して、そのスキームが適用される訳です。 defaultが指定されている時には、その副辞書において各項のスキームをいちいち指定する必要がなくなります。 この例では、grad(p)grad(U)の行がそれです。 しかしながら、特定の項の行が挿入された場合、その項に対しては、指定されたスキームがdefaultより優先されます。

代わりに、ユーザーはnoneエントリーにより、あえてdefaultスキームを使わないようにもできます。 この場合には、ユーザーはその副辞書の中の全ての項を個々に指定しなければなりません。 defaultは上書きすることができるのですから、defaultnoneを設定することはやりすぎかもしれません。 しかしながら、noneを指定することは、ユーザーに全ての項を個別に指定しなければならないことから、そのアプリケーションに実際にどの項が存在するかを明白にするという点では有用です。

次の節では、表4.5に示したそれぞれのカテゴリーの項について、選択できるスキームを述べます。

[編集] 4.4.1 補間スキーム

interpolationSchemes副辞書には、通常、セル中心から界面中心へ値を内挿する項があります。 OpenFOAMでの内挿スキームの選択肢を表4.6に示しますが、これは4つのカテゴリに分けられます。 1つのカテゴリは一般的なスキームが、そして他の3つのカテゴリは、4.4.5節で説明するように、主に流体での対流(発散)項のガウスの離散化と一緒に使われるものです。 ユーザーがinterpolationSchemes副辞書において、対流特有のスキームを一般的なフィールドの内挿に適用することは、「ほとんどない」のですが、有効な内挿スキームとして4.4.5節よりもむしろここで説明しておきます。 なお、UMISTのようなスキームもOpenFOAMでは利用可能なことに注意すべきですが、一般的に推奨されるスキームのみを表4.6に示します。

普通のスキームは、単にキーワードとエントリーのみを記すことで指定でき、例えばlinearスキームをdefaultとして指定するには以下のようにします。

default linear;

対流特有のスキームは、流れの速度による流束に基づいて内挿を行います。 これらのスキームを指定する場合には、内挿のベースとなる流束場の名前が必要ですが、ほとんどのOpenFOAMのアプリケーションでは、これはphiとなっており、この名前は、通常、surfaceScalarFieldの速度の流束構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \phi に対応するものです。 このガイドの中では、対流特有のスキームの3つのカテゴリーは、general convection, normalised variable (NV), そして、total variation diminishing (TVD)と記述されます。 blendedスキームを除いて、general convectionとTVDスキームは、そのスキーム名と流束場によって指定され、例えば流束phiに基づくupwindスキームをdefaultとして指定するには以下のようにします。

default upwind phi;

いくつかのTVD/NVDスキームには、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 0 \le \psi \le 1 の範囲の係数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi が必要ですが、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi=1 はTVD条件に従うことに対応し、通常最も良い収束性を示すのに対し、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi =0 は最も良い精度を与えます。 通常構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi =1 での実行がお勧めです。 流束phiに基づく構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi =1.0 でのlimitedLinearスキームを、defaultとして指定するには以下のようにします。

default limitedLinear 1.0 phi;
[編集] 4.4.1.1 厳密に範囲が限定されるスカラー量に対するスキーム

厳密に範囲が限定される必要のあるスカラ量のために、いくつかの制限付きスキームという拡張版があります。 ユーザーが指定した範囲に限定するためには、スキームの名前にはlimitedという語が頭に付けられ、下限と上限それぞれを続けて指定します。 例えば、vanLeerスキームを-2と3の間で厳密に制限するためには、次のように指定します。

default limitedVanLeer -2.0 3.0;

良く使われる0と1の間で限定されるスカラー場のために特化された版もあります。 それらは、スキームの名前に01を付けることで選択できます。 例えば、vanLeerスキームを0と1の間で厳密に限定するためには、以下のように指定します。

default vanLeer01;

厳密に範囲が限定する拡張版は、limitedLinear, vanLeer, Gamma, limitedCubic, MUSCL, SuperBeeのスキームで利用することができます。

[編集] 4.4.1.2 ベクトル場に対するスキーム

ベクトル場に対する制限付きスキームについては、場の方向を考慮にいれて構成された制限を行なう改良版があります。 これらのスキームは、通常のスキームの名前に'V'を加えることで選択することができ、limitedLinearに対してはlimitedLinearVといった具合です。 これら'V'版はlimitedLinearVvanLeerVGammaVlimitedCubicVSFCDVといったスキームで利用することができます。

中心スキーム
linear 線形補間 (中心差分)
cubicCorrection 体積スキーム
midPoint 均等重み付け線形補間
風上対流スキーム
upwind 風上差分
linearUpwind 線形風上差分
skewLinear ひずみ補正付き線形
QUICK 二次風上差分
TVDスキーム
limitedLinear 有限線形差分
vanLeer van Leer リミッター
MUSCL MUSCL リミッター
limitedCubic 体積リミッター
NVDスキーム
SFCD 自動フィルター中心差分
Gamma ψ ガンマ差分

表 4.6: 補間スキーム

[編集] 4.4.2 表面法線方向勾配スキーム

snGradSchemes副辞書は、表面法線方向勾配の項によるものです。 表面法線方向勾配は、格子の界面で評価されますが、それは、界面が接続している2つの格子の中心における値の勾配の、界面の法線方向の成分です。 表面法線方向勾配は、それ自体を使うためにも指定されますが、ガウス積分を使ってラプラス項を評価する際にも必要となります。

利用可能なスキームを表4.7に示しますが、これらは単にキーワードとエントリーを記述することで指定できます。 ただ、limitedは例外で、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): 0 \lt \psi \lt 1 の範囲の係数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi を必要とします。

ここで、

構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \Psi = \left\{\begin{array}{ll} 0 & {\rm corresponds to uncorrected,} \\ 0.333 & {\rm non-orthogonal correction \leq 0.5 \times orthogonal part,} \\ 0.5 & {\rm non-orthogonal correction \leq orthogonal part,} \\ 1 & {\rm corresponds to corrected.} \\ \end{array}\right.

です。

よって、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi=0.5limitedスキームをdefaultとして指定するには次のようにします。

default limited 0.5;
スキーム 説明
corrected 陽的非直交補正
uncorrected 非直交補正なし
limited ψ 有限非直交補正
bounded ポジティブスカラーの有界補正
fourth 四次元

表4.7: 表面法線方向勾配スキーム

[編集] 4.4.3 勾配スキーム

gradSchemes副辞書には勾配項を記述します。 各項の離散化スキームは、表4.8の中から選択することができます。

離散化スキーム説明
Gauss 一次のガウス積分
leastSquares 二次の最小二乗法
fourth 四次の最小二乗法
limited 上記のスキームの制限バージョン

表4.8: gradSchemesにおいて使用できる離散化スキーム

leastSquaresfourthの場合には、離散化スキームの指定は次のようにそのスキーム名を指定するだけで十分です。

grad(p) leastSqueares;

Gaussキーワードは、ガウス積分による標準的な有限体積法の離散化を指定するもので、これは、格子の中心から界面の中心への値の内挿を必要とします。 このため、Gaussエントリーでは、表4.6のような内挿スキームを続けて指定する必要があります。 一般的な内挿スキーム以外を選択することはほとんど無く、ほとんどのケースでは次のようにlinearスキームを選ぶのが効率的です。

grad(p) Gauss linear;

3つの基本的な勾配スキーム(Gauss, leastSquares, fourth)の範囲限定版は、次のlimited Gauss スキームの例のように、離散化スキームの前にlimitedを付けることで選択できます。

grad(p) limited Gauss linear;

[編集] 4.4.4 ラプラシアン スキーム

laplacianSchemes副辞書にはラプラス項を記述します。 流体力学の中で見られる構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\cdot(\nu\nabla\textrm{\bold{U}}) といった典型的なラプラス項をどのようにエントリーに記述するかというと、laplacian(nu, U)といったword識別子で与えます。 離散化手法として選べるのはGaussスキームだけですが、さらに拡散係数(この例では構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nu )の内挿スキームや、構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\textrm{\bold{U}) に対する表面法線方向勾配スキームの両方を選択する必要があります。 つまり、このエントリーは以下のようになります。

Gauss <interpolationScheme> <snGradScheme>

内挿スキームは表4.6から選択しますが、通常は一般的なスキームから選択され、ほとんどの場合linearにします。 表面法線方向勾配スキームは表4.7から選択し、表4.9に書かれているようにスキームの選択は数値的性質を決定します。 先の例でのラプラス項の典型的なエントリーは以下のようになります。

laplacian(nu, U) Gauss linear corrected;
スキーム数値的性質
corrected 無制限、二次、保守的
uncorrected 制限、一次、非保守的
limited ψ 補正と非補正の混合
bounded 制限スカラーの一次
fourth 無制限、四次、保守的

表4.9: laplacianSchemesにおける表面法線方向スキームの性質

[編集] 4.4.5 発散スキーム

divSchemes副辞書には発散項を記述します。 流体力学の中で見られる典型的な対流項構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \nabla\cdot(\rho\textrm{\bold{U}}\textrm{\bold{U}}) はどうように記述するかというと、OpenFOAMのアプリケーションでは通常div(phi, U)という識別子で与えます。 ここでphiはフラックス構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \phi=\rho\textrm{\bold{U}} です。

離散化手法として選べるのはGaussスキームだけですが、さらに対象の場(この例では構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \textrm{\bold{U}} )の内挿スキームを選択する必要があります。 つまり、このエントリーは以下のようになります。

Gauss <interpolationScheme>

内挿スキームは、一般的なもの以外にも対流特有のものも含め、表4.6の中から選択します。 表4.10に示すように、これらスキームにより数値的性質が大きく変わってきます。 対流特有の内挿スキームを指定する場合でも、流束は特定の項として既に値がわかっているものとし、流束の内挿スキームは記述しません。 つまり、例えばdiv(phi, U)の場合では、流束はphiとして既知ですので、さらにその内挿スキームを指定すると矛盾が生じるだけです。 よって、先の例での風上型内挿スキームの指定は次のようになります。

div(phi, U) Gauss upwind;


スキーム数値的性質
linear 二次、無制限
skewLinear 二次、(より) 無制限、ひずみ補正
cubicCorrected 四次、無制限
upwind 四次、制限
linearUpwind 一次/二次、制限
QUICK 一次/二次、制限
TVD schemes 一次/二次、制限
SFCD 二次、制限
NVD schemes 一次/二次、制限

表4.10: divSchemesにおいて使用される補間スキームの性質

[編集] 4.4.6 時間スキーム

一次の時間微分項(構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \partial/\partial t )は、ddtSchemes副辞書で指定します。 各項に対する離散化スキームは表4.11から選ぶことができます。

CrankNicholsonスキームでは、Eularスキームと混合させる割合を決める係数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi を用います。 係数構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi が1の場合には純粋なCrankNicholson構文解析失敗 (texvcプログラムが見つかりません。math/READMEを読んで正しく設定してください。): \psi が0の場合は純粋なEularに対応します。 純粋なCrankNicholsonでは不安定なケースにおいては、混合係数をいじることで計算を安定化させることができることがあります。


スキーム 説明
Euler 一次、制限、陰的
CrankNicholson ψ 二次、制限、陰的
backward 二次、陰的
steadyState 時間導関数について解かない

表4.11: ddtSchemesにおいて使用可能な離散化スキーム

時間スキームを指定するときは、非定常問題用のアプリケーションは定常状態で実行する必要はなく、またその逆も同じであることに注意してください。 例えば、非定常の層流非圧縮流れのコードであるicoFoamを実行するときに、steadyStateを指定したら、おそらく解は収束しないので、定常の非圧縮流れのためにはsimpleFoamを使うべきです。

2次時間微分項は、d2dt2Schemes副辞書の中で指定します。 d2dt2Schemesとしては、Eulerスキームのみが利用可能です。

[編集] 4.4.流束の算出

fluxRequired副辞書には、アプリケーションの中で流束を生成する場を書き出します。 例えば、多くの液体力学アプリケーションでは、圧力の方程式を解くと流束が生成するので、そのようなケースではfluxRequired副辞書には単に圧力のためのword識別子であるpを記載します。

fluxRequired
{
    p;
}

[next] [prev] [up]