module DSMC.Particles
(
Particle
, move
, Ensemble
, emptyEnsemble
, ensembleSize
, filterEnsemble
, printEnsemble
, Flow(..)
, modelConcentration
)
where
import qualified Data.Array.Repa as R
import qualified Data.Vector.Unboxed as VU
import DSMC.Util
import DSMC.Util.Vector
type Particle = (Point, Vec3)
move :: Time -> Particle -> Particle
move !dt !(pos, v) = (pos <+> (v .^ dt), v)
data Flow = Flow { concentration :: !Double
, temperature :: !Double
, mass :: !Double
, velocity :: !Vec3
, statWeight :: !Double
}
deriving (Show)
modelConcentration :: Flow -> Double
modelConcentration flow = (concentration flow) / (statWeight flow)
type Ensemble = R.Array R.U R.DIM1 Particle
emptyEnsemble :: Ensemble
emptyEnsemble = fromUnboxed1 $ VU.empty
ensembleSize :: Ensemble -> Int
ensembleSize ens = n where (R.Z R.:. n) = R.extent ens
printEnsemble :: Ensemble -> IO ()
printEnsemble particles = do
VU.forM_ (R.toUnboxed particles)
(\((x, y, z), (u, v, w)) -> putStrLn $ unwords (map show [x, y, z, u, v, w]))
filterEnsemble :: (Particle -> Bool) -> Ensemble -> Ensemble
filterEnsemble pred' ens =
let
(R.Z R.:. size) = R.extent ens
getter :: Int -> Particle
getter !i = (R.!) ens (R.ix1 i)
predI :: Int -> Bool
predI !i = pred' $ getter i
in
R.selectP predI getter size ens