このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
アルバイトの大友です.
2019年6月にフィックスターズで開催されました第76会オープンCAE勉強会@関東(流体など)【大崎】で「DualSPHysicsで静⽔圧問題」(大友広幸,吉藤尚生)と題して発表をしてきました.
フィックスターズはOpenMPSというMPS法(粒子法の一種)を用いた数値流体ソルバーの開発に参加しています.
私は昨年よりOpenMPSとの比較対象としてDualSPHysicsというSPH法(同じく粒子法の一種)を用いたFLOSSの流体シミュレータの調査を行っています.
その過程でDualSPHysicsでは静水圧問題が正しく解けていないことを発見し,その原因の調査結果を発表しました.
ざっくり言うとコップに水を入れて放置する問題です.
期待される結果は放置前と放置後で水位などが変わらないことです.
しかしDualSPHysicsでは水位が上昇します.
静水圧問題で水位が上昇する問題を調査するにあたって,壁面境界を除去し問題を単純化するために中心重力問題を用いました.
中心重力問題ではすべての粒子は空間のある点(中心)に向かって一定の力がかかります.
万有引力のように中心からの距離に応じて力の大きさが変わることはありません.
式で書くと
$$
\mathbf{F}_i = -m_i g\frac{\mathbf{r}_i-\mathbf{r}_{\mathrm{center}}}{|\mathbf{r}_i-\mathbf{r}_{\mathrm{center}}|}
$$
となります($\mathbf{F}_i$:粒子$i$に対する中心重力,$g$:重力加速度,$\mathbf{r}_i$:粒子$i$の位置,$\mathbf{r}_{\mathrm{center}}$:中心の位置).
中心重力問題では十分時間が経つと円盤に収束することが期待されます.
実際にOpenMPSでは円盤に収束することが確認されています[中心重力による静水圧問題の妥当性確認 – OpenMps].
DualSPHysicsで中心重力問題を解くと下図のように中心付近が密,中心から離れるにつれ疎となっていきました.
これはコップでの静水圧問題の問題点が中心重力問題でも現れているということになります.
DualSPHysicsのソースコードをいじるのは大変だったので,自分でWCSPH(Weakly Compressible SPH)のシミュレータを実装し,DualSPHysicsと同じ問題が起こるかを調査しました.
その結果,自分で実装したシミュレータではこの問題は起こりませんでした.
自分の実装では粒子$i$の密度$\rho_i$を
$$
\rho_i = \sum_j m_j W_{ij}
$$
と計算していました($m_j$:粒子$j$の質量,$W_{ij}$:カーネル関数).
こちらを以降「カーネル和による密度計算」と呼びます.
一方DualSPHysicsでは
$$
\frac{D\rho_j}{Dt} = – \sum_j m_j (\mathbf{u}_j – \mathbf{u}_i) \cdot \nabla \mathbf{W}_{i,j}
$$
と,密度の時間微分を計算し,時間発展させる形で密度を計算しています($\mathbf{u}_j$:粒子$i$の速度).
こちらを以降「時間発展による密度計算」と呼びます.
なんとなくこの密度計算が怪しそうだったので,自分の実装でも時間発展による密度計算でシミュレーションを行いました.
シミュレーション結果を評価するため,
を計算しました.
時間がたつに連れ円盤に収束していっているのがわかります.
今回の問題設定では収束半径の理論値が$$\sqrt{\frac{4}{\pi}}\sim 1.128$$なので若干小さくなっている気はしますが,半径変化も0となり収束していると言えます.
明らかに大きくなっています.
時間が経つと自由表面がデコボコして真円率が下がっているようです.
比較的時間が経っていない場合でも半径は大きくなっていき,600秒を過ぎたあたりで大きく増加しているのがわかります.
DualSPHysicsで静水圧問題が解けない問題は時間発展型の密度計算が関わっていそうです.
コンピュータビジョンセミナーvol.2 開催のお知らせ - ニュース一覧 - 株式会社フィックスターズ in Realizing Self-Driving Cars with General-Purpose Processors 日本語版
[…] バージョンアップに伴い、オンラインセミナーを開催します。 本セミナーでは、...
【Docker】NVIDIA SDK Managerでエラー無く環境構築する【Jetson】 | マサキノート in NVIDIA SDK Manager on Dockerで快適なJetsonライフ
[…] 参考:https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/ […]...
Windowsカーネルドライバを自作してWinDbgで解析してみる① - かえるのほんだな in Windowsデバイスドライバの基本動作を確認する (1)
[…] 参考:Windowsデバイスドライバの基本動作を確認する (1) - Fixstars Tech Blog /proc/cpuinfo ...
2021年版G検定チートシート | エビワークス in ニューラルネットの共通フォーマット対決! NNEF vs ONNX
[…] ONNX(オニキス):Open Neural Network Exchange formatフレームワーク間のモデル変換ツー...
YOSHIFUJI Naoki in CUDAデバイスメモリもスマートポインタで管理したい
ありがとうございます。別に型にこだわる必要がないので、ユニバーサル参照を受けるよ...