learn-physics-0.3: src/examples/LorentzForceSimulation.hs
{-# OPTIONS_GHC -Wall #-}
module Main where
import Physics.Learn
import Vis
import SpatialMath
( Euler(..)
)
drawFunction :: SimpleState -> VisObject Double
drawFunction (_t,r,_v)
= RotEulerDeg (Euler 270 0 0) $ RotEulerDeg (Euler 0 180 0) $
VisObjects [ Axes (0.5, 15)
, Trans (xyzFromPos r) (Sphere 0.1 Solid red)
]
statePropagationFunction :: Float -> SimpleState -> SimpleState
statePropagationFunction t' (t,r,v) = rungeKutta4 newton2 (realToFrac t' - t) (t,r,v)
-- Newton's Second Law
newton2 :: SimpleState -> Diff SimpleState
newton2 (t,r,v) = (1,v,force (t,r,v) ^/ m)
-- Lorentz Force Law
force :: SimpleState -> Vec
force (_t,r,v) = q *^ (electricField r ^+^ v >< magneticField r)
main :: IO ()
main = simulate
Nothing
"Particle Experiencing Electromagnetic Force"
0.01
(0,initialPosition,initialVelocity)
drawFunction
statePropagationFunction
-- particle mass
m :: Double
m = 1
-- particle charge
q :: Double
q = 1
-- Electric Field
electricField :: VectorField
electricField r = vec 0 2 0
where
(x,y,z) = cartesianCoordinates r
-- Magnetic Field
magneticField :: VectorField
magneticField r = vec 0 0 4
where
(x,y,z) = cartesianCoordinates r
-- Initial displacement
initialPosition :: Position
initialPosition = cart 0 0 0
-- Initial velocity
initialVelocity :: Vec
initialVelocity = vec 0 0 0