dph-examples-0.6.0.1: examples/real/NBody/Common/World.hs
{-# LANGUAGE BangPatterns #-}
module Common.World
( World(..)
, advanceWorld)
where
import Common.Body
import qualified Data.Vector.Unboxed as V
data World
= World
{ -- | Bodies in the simulation.
worldBodies :: !(V.Vector Body)
-- | Number of steps taken in the simulation so far.
, worldSteps :: !Int }
-- | Advance the world forward in time.
advanceWorld
:: (V.Vector MassPoint -> V.Vector Accel)
-- ^ Fn to compute accelerations of each point.
-> Double -- ^ Time step.
-> World
-> World
advanceWorld calcAccels timeStep world
= let
-- Calculate the accelerations on each body.
accels = calcAccels
$ V.map massPointOfBody
$ worldBodies world
-- Apply the accelerations to the bodies and advance them.
bodies' = V.zipWith
(\body (ax, ay)
-> advanceBody timeStep
(setAccelOfBody (-ax, -ay) body))
(worldBodies world)
accels
-- Update the world.
steps' = worldSteps world + 1
in world { worldBodies = bodies'
, worldSteps = steps' }