ユーザーガイド 1.5系 - 4.4 数値スキーム
出典: OFWikiJa
[編集] 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は上書きすることができるのですから、defaultにnoneを設定することはやりすぎかもしれません。 しかしながら、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'版はlimitedLinearV、vanLeerV、 GammaV、 limitedCubicV、 SFCDVといったスキームで利用することができます。
| 中心スキーム | |
| 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.5 のlimitedスキームを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において使用できる離散化スキーム
leastSquaresとfourthの場合には、離散化スキームの指定は次のようにそのスキーム名を指定するだけで十分です。
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;
}
