粒子法シミュレーションを記述するための言語を考えている。
最初のステップとして、質点の自由落下を表現できるようになったので、紹介する。
いま考えている言語を使うと、自由落下は以下のような記述で表現できる。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つのシミュレーションとなっているが、直近の拡張として、物理量を集合として扱うことで、多粒子のシミュレーションを記述できるようにする予定である。多粒子のシミュレーションを記述できるようになれば、このブログでこれまで行ってきたようなシミュレーションを、この言語で改めて記述し直すことができる。
--