gloss-examples-1.7.4.4: raster/Fluid/src-repa/Stage/Diffusion.hs
{-# LANGUAGE BangPatterns #-}
module Stage.Diffusion
(diffusion)
where
import Model
import FieldElt
import Stage.Linear
import Data.Array.Repa as R
import Data.Array.Repa.Eval as R
import Data.Vector.Unboxed
-- | Diffuse a field at a certain rate.
diffusion
:: (FieldElt a, Num a, Elt a, Unbox a)
=> Int
-> Delta
-> Rate
-> Field a
-> IO (Field a)
diffusion !iters !delta !rate field
= {-# SCC diffusion #-}
field `deepSeqArray`
let _ :. _ :. width' = R.extent field
!width = fromIntegral width'
!a = delta * rate * width * width
!c = 1 + 4 * a
in do
linearSolver field field a c iters
{-# SPECIALIZE diffusion
:: Int -> Delta -> Rate
-> Field Float
-> IO (Field Float) #-}
{-# SPECIALIZE diffusion
:: Int -> Delta -> Rate
-> Field (Float, Float)
-> IO (Field (Float, Float)) #-}