2011年10月25日火曜日

粒子法シミュレーションを記述するための言語を設計中


粒子法シミュレーションを記述するための言語を考えている。

最初のステップとして、質点の自由落下を表現できるようになったので、紹介する。

いま考えている言語を使うと、自由落下は以下のような記述で表現できる。Haskell上のEDSLとして実装されており、質点の座標の時間変化を出力する。

import Simulation

main = print $ take 100
             $ map (flip machineRegisterValue "x")
             $ runMachine (freeFall 0 0)

freeFall x0 v0 = do
  define "x" (constant x0 + integral (var "v" * constant dt))
  define "v" (constant v0 + integral (var "a" * constant dt))
  define "a" (constant g)

g  = -9.8
dt = 0.01

上でインポートしているSimulationモジュールはこちらからダウンロードできる。まだまだ作りかけのプロトタイプである。

言語の設計にあたって狙いとしているのは、「数式を記述すると、それがそのままシミュレーションとして動く」ことである。freeFallの定義において、数式に近い形で宣言的にシミュレーションを記述できていることに注目して欲しい。

位置x, 速度v, 加速度aの定義の順番は任意である。プログラマは、計算の順番ではなく、数式の意味に従って定義を記述できる。計算の順番は、モジュールが自動的に判断する。このような「表現と計算の分離」がこの言語の基本となるコンセプトである。

数式を記述するという点では、Mathematicaに代表されるようなシンボル計算と似ているが、そういったソフトウェアはナンバークランチングな数値計算のためというよりは、数式を正確に解くためのものである。その意味で、ここで考えている言語はMathematicaのようなものとは異なる。

現時点では、記述したシミュレーションはHaskellプログラムとしてインタプリタ的に実行されるが、将来的にコンパイラを作ることも可能である。コンパイラを作れば、たとえば、記述したシミュレーションをCUDAを使って実行するといったことができる。

いったん、上記では質点1つのシミュレーションとなっているが、直近の拡張として、物理量を集合として扱うことで、多粒子のシミュレーションを記述できるようにする予定である。多粒子のシミュレーションを記述できるようになれば、このブログでこれまで行ってきたようなシミュレーションを、この言語で改めて記述し直すことができる。

--

2011年10月19日水曜日

シミュレーション動画一覧


シミュレーションの結果をレンダリングして作った動画です。流体シミュレーションや剛体シミュレーションの動画を見ることができます。動画は随時追加されていきます。


Falling Rigid Bunnies
たくさんのスタンフォードバニーを落下させる剛体シミュレーションを行い、結果をレンダリングしました。

動画を見る


Bunny-shaped fluid simulation
スタンフォードバニーの形をした流体を落下させて、結果をレンダリングしました。

動画を見る



粒子法による固液連成シミュレーション
粒子法で固体と液体の連成シミュレーションをおこない、結果をレンダリングしました。

動画を見る



固液連成シミュレーション
粒子法で固体と液体の連成シミュレーションをおこない、結果を粒子でレンダリングしました。

動画を見る



傾斜平面への剛体落下シミュレーション
傾斜平面への立方体の落下を、粒子ベースの剛体シミュレーションとして計算しました。

動画を見る



引き続き、粒子ベース剛体シミュレーション
粒子ベースの剛体シミュレーションとして、平面への立方体の落下を計算しました。

動画を見る



粒子ベース多体衝突シミュレーション
粒子ベースのアプローチで多体衝突の剛体シミュレーションをしました。

動画を見る



SPHによる巻き波のシミュレーション第3回
粒子法シミュレーション(SPH)によって、巻き波のシミュレーションをしてみました。砕波の様子が見られます。

動画を見る


粒子法のシーンを2倍のサイズにしてみた
3次元の粒子法シミュレーションを、スケールを2倍にして実施し、結果をレンダリングしました。

動画を見る


3次元の粒子法シミュレーション
粒子法シミュレーションを3次元で行い、結果をレンダリングしました。

動画を見る



【粒子法】粒子を流体としてレンダリング
2次元の粒子法シミュレーションの結果を、流体としてレンダリングしました。

動画を見る





粒子法(SPH)のプログラム
粒子法(SPH)のプログラムを解説したシリーズです。ソースコードも公開しています。

粒子法(SPH)のプログラム一覧



論文まとめ



--

2011年10月8日土曜日