-- -- Patricia Fasel -- Los Alamos National Laboratory -- 1990 August -- module Compton (compton) where import GamtebType import Consts import Utils -- compton scattering compton :: Particle -> (Particle, Probability, Bool) compton (Part pos dir w e eIndx cell seed) = if (e' <= ergCut) then (Part pos dir w e' eIndx' cell seed', prob', True) else (Part pos dir' w e' eIndx' cell seed', prob', False) where (seed', r2) = genRand seed (r3, r4) = genRand r2 eIn = 1.956917 * e eOut = klein eIn r3 angle = 1 + 1/eIn - 1/eOut e' = 0.511008 * eOut (eIndx', prob') = xsectInterp e' dir' = rotas dir angle r4 -- rotate a point through a polar angle whose cosine is c -- and through an azimuthal angle sampled uniformly rotas :: Point -> Angle -> Random -> Point rotas (u,v,w) a rn = if (r > 1) then rotas (u,v,w) a rn' else (let r' = sqrt ((1 - a*a) / r) t1' = t1*r' t2' = t2*r' wsq = 1 - w*w s = sqrt wsq u' = u*a + (t1'*u*w - t2'*v) / s v' = v*a + (t1'*v*w - t2'*u) / s w' = w*a - t1'*s in if (wsq < small) then (t1',t2',(w*a)) else (u',v',w') ) where (r1, r2) = genRand rn (rn', r3) = genRand r2 t1 = 2*r1 - 1 t2 = 2*r3 - 1 r = t1*t1 + t2*t2 -- sample from klein-nishina using inverse fit -- e = energy in, units of the rest mass of an electron klein :: Energy -> Random -> Energy klein e r = if (e > 1.16666667) then (let a' = 1.65898 + a*(0.62537*a - 1.00796) b' = a'/f in if (r > b') then (let c' = (d-1.20397) / (1-b') x' = 0.3 * exp (c'*(b'- r)) in x'*e) else (let c' = a'/(3.63333 + a*(5.44444*a - 4.66667)) x' = klein1 (r/b') 2.1 c' 1.4 (0.5*a') in x'*e)) else (let x' = klein1 r (3*c') a' (2*c') b' a' = f/(b+c) b' = 0.5*f c' = 1-c in x'*e) where a = 1/e b = 2*e + 1 c = 1/b d = log b f = 2*e*(1+e)*c*c + 4*a + (1-2*a*(1+a))*d klein1 x2 x3 x4 x5 x7 = 1 + x2*(x2*(2*x7 + x4 - x3 + x2*(x5 - x7 - x4)) - x7)