粒子法
参考文献
- 後藤仁志 ,粒子法 連続体・混相流・粒状体のための計算科学,森北出版(2018)
- 越塚誠一,柴田和也,室谷浩平,粒子法入門 流体シミュレーションの基礎から並列計算と可視化まで,丸善出版(2014)
粒子法とは
流体を粒子の軍団として離散化して数値計算したもの.
移流の効果を粒子の移動として表現するので,非線形項を陽に離散化して計算する必要がない.
そのため,非線形項を離散化したときに現れる数値誤差(高波数の振動とか)が抑えられる.
また,格子点によって離散化する方法と比べて,自由境界が激しく変形する場合にも簡単に適応できる.
例えば非線形波動の突っ立ちのように,格子点の方法では計算が破綻してしまう状況でも,粒子法では特に問題なく計算が続けられる.
流体の粒子の集団としての離散化
粒子方では,流体を仮想的な粒子の集団として離散化する.
この点は,Lagrange的な描像を採用していると表現できる.Lagrange的な描像での粒子(流体粒子またはLagrange粒子)は互いに相互作用しないが,粒子法では,粒子同士が相互作用する.
相互作用の具体系は,粒子法のバリエーション(SPH, MPS, ...)によって異なる.
SPH
SPH法では,まず,任意の物理量
このようになますと,離散化ができる.さらに,この物理量は粒子によって運ばれていると表現する.
重み
MPS
MPS法での相互作用,および,離散化は,なかなか発見的なようである.
MPS法では,まず初めに粒子間の相互作用を定義する.
最近では,高精度化の試みに伴って,より論理的に導出されてきているらしい.
MPS法
まずは,MPS法を調べる.
とりあえず,お気持ち的な導出だけをして,とっとと実装までしてしまいたい.
MPS法では,物理量は粒子の上で定義される.
したがって,ある物理量
また,物理量の空間微分に関する量を計算するには,他の地点の粒子との差分を取る必要があるが,近傍粒子との差分だけでなく,影響範囲を定義しておいて,この影響範囲内にある粒子全てとの重み付きの差分をとる.
このような意図で,MPS法で登場する粒子には,カーネルによって定義される他粒子への影響範囲が存在する.
重み関数
この影響範囲は重み関数
MPS法では,重み関数
ここで,
粒子数密度
MPS法では,粒子数密度
前にも述べた通り,全ての物理量は,粒子上でのみ定義される.
粒子を適当に番号づけて,
粒子
と定義される.
流体の質量密度
(この気持ちはまだよくわかっていない...)
つまり,非圧縮流体では,この粒子数密度は時間によらず一定であるとする.
n_0
粒子数密度の基準値 密度が均一な非圧縮性流体の場合,粒子数密度
したがって実用上では,初期時刻において,どこか一点だけ計算しておけば十分である.
このような粒子数密度を基準値と呼び,
を計算する.ここで,
MPS法での微分演算子
Navier-Stokes方程式を解くために,微分演算子を離散化する必要がある.
格子がないので,粒子同士の差分として,微分を離散化する.
MPS法の離散化には2ステップある.
- 粒子
と粒子i との間での微分演算子の離散化を導入する.j - 1の離散化を全粒子にわたって重み付き平均をとる.
1による離散化を
勾配
勾配
影響範囲とは,
これは,
この仮定を満たす関数
まず,ステップ1では,
とする.ただし,
ステップ2では,これを重み付き平均する.
発散
同じようにして,発散は,
となる.
ラプラシアン
ラプラシアン
この仮定のもとでは,粒子
となる.これを離散化する.
これまでと同様にステップ1で,粒子
を構成する.
粒子
となる.ただし,ここでも
このテイラー展開を2次までで打ち切って,
すなわち,
ここで,
ステップ2によって,粒子
ここでも
MPS法では,さらに,
と置き換える. 非圧縮流体であれば,
がMPS法でのラプラシアンの離散化である.
Navier-Stokes方程式の時間発展
Navier-Stokes方程式の時間発展は,射影法を用いて,2段階で行われる.
ここで,Navier-Stokes方程式は,
である.ここで,
ここで,粒子法における時間発展する変数は,速度場
Navier-Stokes方程式の離散化
Navier-Stokes方程式の物質微分を,
と時間方向に離散化すると,粒子法での時間発展は,
となる.
粒子法の特徴として,物質微分をそのまま差分で表し,移流の効果を粒子位置の更新で表す.
非圧縮性を保つために,射影法によって時間発展を2段階で行う.
ここで,上記の離散化したNavier-Stokes方程式の圧力勾配項が
第1ステップ
まず,圧力勾配項を除いた項による時間発展を行う.すなわち,
として,さらに,粒子位置の更新も行う.
第2ステップ
第2ステップでは,残りの圧力勾配項による時間発展を行うのであるが,このとき,非圧縮性
今,離散化したNavier-Stokes方程式は,
と書ける.非圧縮性を保つためには,この両辺の発散をとって,
を満たす必要がある.これは,圧力場
ちなみに,このような性質を持つ圧力勾配
と表すことができる.ここで,
圧力場の計算
圧力場
を満たす.したがって,
を満たす.これを同じように離散化すると,
となって,結局,
となる.今,質量密度
となる.したがって,圧力場
となる.ここで,
と計算する.
Poisson方程式の数値解法
以上で,MPS法の計算方法は全て説明したが,最後に,圧力場の計算で必要となるPoisson方程式の数値計算方法を書いておく.MPS法では,ラプラシアンを独自に離散化しているので,格子法によるものとは違うことに注意.
MPS法でのラプラシアンの離散化によって,圧力場のPoisson方程式は,
となる.
とすると,
と表すことができる.
したがって,
線形連立方程式の数値解法には,不完全Cholesky分解前処理付き共役勾配法を用いるのが一般的のようである.
k+1 ステップ目の速度場
以上で圧力場
これを用いて粒子位置を更新して,MPS法の1サイクルが完了する.
MPS法アルゴリズム
以上をまとめると,MPS法のアルゴリズムは以下のようになる
for
-
for\Delta \boldsymbol{u}^k_i = \frac{2d}{\lambda n_0} \sum_{j\not=i} (\boldsymbol{u}^{k+1}_j - \boldsymbol{u}^{k+1}_i) w(|\boldsymbol{r}^*_j - \boldsymbol{r}^*_i|) toi=1 N -
for\boldsymbol{u}^*_i = \boldsymbol{u}^k_i + (\nu\Delta \boldsymbol{u}^k_i )\Delta t + \boldsymbol{g} \Delta t, \quad \boldsymbol{r}^*_i = \boldsymbol{r}^k_i + \boldsymbol{u}^*_i \Delta t\quad toi = 1 N -
forn^* = \sum_{i=1}^N w(|\boldsymbol{r}^*_j - \boldsymbol{r}^*_i|)\quad toi = 1 N - Solve
in terms of\frac{2d}{\lambda n_0} \sum_{j\not=i} (p^{k+1}_j - p^{k+1}_i) w(|\boldsymbol{r}^*_j - \boldsymbol{r}^*_i|) = -\frac{\rho^0}{\Delta t^2} \frac{n^*_i - n^0}{n^0} \quad forp^{k+1}_i toi=1 N \nabla p^{k+1}_i = \frac{d}{n_i} \sum_{j\not=i} \frac{(p^{k+1}_j - p^{k+1}_i) (\boldsymbol{r}_j - \boldsymbol{r}_i) }{|\boldsymbol{r}_j - \boldsymbol{r}_i|^2} w(|\boldsymbol{r}_j - \boldsymbol{r}_i|) -
for\boldsymbol{u}^{k+1} = \boldsymbol{u}^* - \frac{1}{\rho} \nabla p^{k+1} \Delta t, \quad \boldsymbol{r}^{k+1} = \boldsymbol{r}^k + \boldsymbol{u}^{k+1} \Delta t\quad toi = 1 N
end for
実際の計算には,これに加えて境界条件が必要である.
境界条件
以上に加えて,境界条件を粒子ごとに与えれば,MPS法の実装ができるようになる.
ここでは,基本的な境界条件である,固定壁境界条件・自由表面境界条件・流入・流出について書いておく.
境界条件の設定はなんだかよくわからないことが多い
固定壁
- 粒子法では壁も粒子で構成する.
- 流体粒子と接する面を構成する粒子を壁面表層粒子と呼び,
- 壁面表層粒子の内側で,流体粒子とは接することのない粒子のことをダミー粒子と呼ぶ.
- 2つを合わせて壁粒子と呼ぶ.
壁面表層粒子とダミー粒子の位置の更新は行われない.
ダミー粒子の必要性について
ダミー粒子が必要な理由は以下.
- ダミー粒子がないと壁近傍の粒子の粒子数密度が小さくなってしまい,非圧縮性を保つことができない.
- 自由表面との違いが判定できなくなる.
壁粒子の圧力
- 壁表面粒子の圧力は,流体粒子と同様に更新する
- ダミー粒子の圧力は更新しない.ダミー粒子の圧力は常に
としておく.0 - 圧力を決めるPoisson方程式はダミー粒子を含まないものとする.詳細は以下.
圧力を決める連立方程式の行列
圧力を決める連立方程式の行列
と修正する.これによって,非対角成分と体格成分の関係
を保つ.
以上は結局,ダミー粒子に関する量は圧力には関与しないことを意味する.Poisson方程式から完全にダミー粒子の影響は削除しておくのである.
これによって,壁面での圧力勾配は0になる(???).したがって,固定壁において,圧力場にNeumann境界条件を課したことになる.
壁粒子の速度
- no-slip条件を課すときは,壁面表層粒子の速度をすべて0にしておく.
- free-slip条件を課すときは,粘性項の計算のときに,壁粒子と流体粒子の相互作用の部分を0に設定する.これは,流体粒子と壁粒子の速度が等しいとしていることと同値である.
自由表面
まだ
流入・流出
まだ
とりあえずMPS法を実装してみる
- 言語はC++
- dam break問題を解く
dam break問題
とは?
初期に設定する定数 (思いついた順)
物理名 | 記号 | プログラム変数名 |
---|---|---|
動粘性係数 | VISCOSITY |
|
重力加速度 | GRAVITATIONAL_ACCELERATION |
|
流体の質量密度 | FLUID_DENSITY |
|
時間刻み | dt |
|
粒子数 | N |
|
計算するタイムステップ | END_OF_TIME |
|
初期の粒子間距離 | l_0 |
このうち,粒子数
また,粒子の影響半径
としたとき,
無次元化?
まずは,方程式を無次元化するとともに,特徴的なスケールを決める.
計算に関与する次元を持つ量は,
- 粒子の初期速度
U - 重力加速度の大きさ
g - 粘性係数
\nu - 質量密度
\rho - 境界の大きさ
L - 初期の粒子間距離
l_0 - 影響範囲
r_e - 時間刻み幅
\Delta t
また,粒子数
ダム決壊問題に絞る
ダム決壊問題に絞って考えよう
この場合,
この場合,重力加速度
これらは,ほとんど決まった値である.
つまり,実質,変化するパラメータは,境界の大きさ
言い換えると,無次元量
を定義するのと,
そこで今回は,水に対する値,
を用いる.
また,
計算領域
計算領域を設定し,その中に(壁粒子・ダミー粒子もふくめて)粒子を置く.
計算領域は,2次元の場合は長方形,3次元の場合は直方体にする.
ダクトのような周囲が壁で囲まれている場合は,ダミー粒子を全て覆えるくらいの計算領域があればよい.
壁で覆われていない場合は,計算時間の間,粒子が領域からはみ出ない程度の計算領域が必要である.
ここで,初期条件や重力定数,粘性係数から見積もってみよう.
-> 見積もれる???
- 流体が破砕する場合の水飛沫の飛距離はかなり自明でなさそう.
- 次元解析で見積もる方法を探す
当面は,十分に大きな領域をとっておく.
例えば,
- ダム崩壊問題だと,ダムの壁の2倍程度
- 球体流体が落ちてくる問題だと,球体流体の初期位置の2倍程度の高さ,
- あるいは,固定壁粒子(およびダミー粒子)で計算領域を囲む
など.
近傍粒子探索の方法
探索範囲を均等な格子に区切る方法
- 計算領域を均等な格子に分割し番号を振る.格子の大きさは粒子の影響範囲程度にする.
- ある格子の近傍格子の番号を計算する関数を用意する.
- 粒子が属する格子の番号を求め,記憶しておく.
- 粒子の属する格子の近傍格子を求める.
- 自分の格子及び近傍格子の中にある粒子についてだけ近傍粒子探索をする.
初期条件
計算領域は初期の状態を決めてから,決定するほうがよさそうなので,まずは初期条件を決める.
近傍粒子探索の方法
探索範囲を均等な格子に区切る方法
- 計算領域を均等な格子に分割し番号を振る.格子の大きさは粒子の影響範囲程度にする.
- ある格子の近傍格子の番号を計算する関数を用意する.
- 粒子が属する格子の番号を求め,記憶しておく.
- 粒子の属する格子の近傍格子を求める.
- 自分の格子及び近傍格子の中にある粒子についてだけ近傍粒子探索をする.
粒子間の距離が近すぎるときの対処方法
粒子間の距離が近くなりすぎると,カーネルの値が大きくなったり,圧力勾配の値が大きくなったりして,計算が不安定になりやすい.
そこで,粒子間の距離が近すぎるときは,人工的に何らかの処理をおこなって計算を安定化させるようである.
今回は,粒子同士がある一定の距離より近づいた時は,非弾性衝突したと考える.
衝突の反発係数を
粒子
で 静止した粒子
非弾性衝突時の速度変化
運動量変化と反発係数の定義から,粒子
であるから,衝突後の粒子
これは,衝突方向,
となる.
したがって,粒子
衝突した粒子全部による寄与は,
ここで,
衝突判定距離
衝突と判定する距離はどのように選ぶか.
これはよくわからない.初期粒子間距離
反発係数の値
これもよくわからないけど,あまり大きくないほうが良さそうである. ~ 0.2 ?