mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-21 04:13:46 +00:00
This was a seperate repository in CVS and so it missed the conversion.
benchmarks/
As above.
57 lines
1.9 KiB
Haskell
57 lines
1.9 KiB
Haskell
--
|
|
-- Patricia Fasel
|
|
-- Los Alamos National Laboratory
|
|
-- 1990 August
|
|
--
|
|
module PushParticle (pushParticle) where
|
|
|
|
import PicType
|
|
import Consts
|
|
import Data.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'
|