--
-- Patricia Fasel
-- Los Alamos National Laboratory
-- 1990 August
--
module PushParticle (pushParticle) where
import PicType
import Consts
import Array--1.3
-- Phase IV: Particle push
-- Each particle has an initial velocity determined by its motion during the
-- previous timestep and is accelerated by the field induced by the
-- collection of particles
--
-- Compute the acceleration of each particle
-- Find the maximum acceleration in x and y directions
-- Determine a safe delta t, such that no particle will move a
-- distance greater than the cell
-- Compute new position and velocity of each particle
pushParticle :: ParticleHeap -> Electric -> Value -> Value -> Value -> (Value, Value, ParticleHeap)
pushParticle ([], []) xyElec dt maxAcc maxVel = (maxAcc, maxVel, ([], []))
pushParticle (((xPos,yPos):xyPos), ((xVel,yVel):xyVel))
(xElec, yElec) dt maxAcc maxVel =
(maxAcc'', maxVel'',
(((xPos',yPos'):xyPos'), ((xVel',yVel'):xyVel')))
where
i = truncate xPos
j = truncate yPos
i1 = (i+1) `rem` nCell
j1 = (j+1) `rem` nCell
dx = xPos - fromIntegral i
dy = yPos - fromIntegral j
xAcc = (charge/mass) * (xElec!(i,j)*(1-dy) + xElec!(i,j1)*dy)
yAcc = (charge/mass) * (yElec!(i,j)*(1-dx) + yElec!(i1,j)*dx)
xTV = xAcc*dt + xVel
yTV = yAcc*dt + yVel
xT = xTV*dt + xPos
yT = yTV*dt + yPos
maxAcc' = max maxAcc (max (abs xAcc) (abs yAcc))
maxVel' = max maxVel (max (abs xTV) (abs yTV))
(xVel',yVel') = (xTV, yTV)
xPos' = if (xT >= fromIntegral nCell)
then xT - fromIntegral nCell
else if (xT < 0.0)
then xT + fromIntegral nCell
else xT
yPos' = if (yT >= fromIntegral nCell)
then yT - fromIntegral nCell
else if (yT < 0.0)
then yT + fromIntegral nCell
else yT
(maxAcc'', maxVel'', (xyPos', xyVel')) =
pushParticle (xyPos, xyVel) (xElec, yElec) dt maxAcc' maxVel'
|