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と筆者から読者への気持ちです!