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

--

0 件のコメント: