Paraisoでシミュレーションを始める
シミュレーションを始めるには、まず初期条件を設定できる必要があります。初期条件の場を計算する仕事は、Paraiso式づくりのとっかかりとしても優れています。やってみましょう。サンプルを見てください。
table :: Named (StaticValue TArray Double) table = "table" `isNameOf` StaticValue TArray undefined createBuilder :: Builder Vec2 Int Annotation () createBuilder = do x01 <- bind $ (cast $ loadIndex (Axis 0)) / (cast $ broadcast $ loadSize (Axis 0)) y01 <- bind $ (cast $ loadIndex (Axis 1)) / (cast $ broadcast $ loadSize (Axis 1)) x <- bind $ 4 * (x01-0.5) y <- bind $ 5 * (y01-0.5) z <- bind $ atan((1- x^2 - (y-(x^2)**(1/3))^2)*10) store table z
Generator.hs
では、少々煩雑ですが、cast
とbroadcast
を使って配列変数の添字とサイズから、x座標とy座標を0から1までの範囲の実数として求めています。cast
やbroadcast
の引数や返値は、うまいこと型推論してもらえてるみたいですね。実際、配列変数の添字とサイズはcreateBuilder
の型注釈からしてInt
型なのに対し、table
はDouble
型で、そこから明示的なcast
を挟まずに繋がっているx01
,y01
,x
,y
,z
などの型もみなDouble
(のBuilder)になります。経験のある読者は、1/3
が一見整数どうしの除算として0
に切り捨てられることなく、ちゃんとDouble
同士の除算として扱われていることにも気づいたかもしれません。
それでは、これがParaisoと筆者から読者への気持ちです!