packages feed

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)) #-}