1- import numpy as np
2- from scipy .constants import c
1+ from __future__ import division
32
4- class TransverseSpaceCharge (object ):
5- def __init__ (self , L_interaction , slicer , pyPICsolver , flag_clean_slices = False ):
3+ from . import Element
64
5+ import numpy as np
6+ from scipy .constants import c
77
8+ class TransverseSpaceCharge (Element ):
9+ def __init__ (self , L_interaction , slicer , pyPICsolver ,
10+ flag_clean_slices = False , * args , ** kwargs ):
811 self .slicer = slicer
912 self .L_interaction = L_interaction
1013 self .pyPICsolver = pyPICsolver
@@ -20,10 +23,7 @@ def get_beam_x(self, beam):
2023 def get_beam_y (self , beam ):
2124 return beam .y
2225
23- # @profile
2426 def track (self , beam ):
25-
26-
2727 if self .save_distributions_last_track :
2828 self .rho_last_track = []
2929
@@ -33,54 +33,53 @@ def track(self, beam):
3333 self .Ey_last_track = []
3434
3535 if hasattr (beam .particlenumber_per_mp , '__iter__' ):
36- raise ValueError ('spacecharge module assumes same size for all beam MPs' )
36+ raise ValueError ('spacecharge module assumes same number of charges'
37+ ' for all beam macroparticles!' )
3738
3839 if self .flag_clean_slices :
3940 beam .clean_slices ()
4041
4142 slices = beam .get_slices (self .slicer )
4243
43- for i in xrange (slices .n_slices - 1 , - 1 , - 1 ):
44+ for sid in xrange (slices .n_slices - 1 , - 1 , - 1 ):
4445
4546 # select particles in the slice
46- ix = slices .particle_indices_of_slice (i )
47+ pid = slices .particle_indices_of_slice (sid )
4748
48- # slice size and time step
49- dz = (slices .z_bins [i + 1 ] - slices .z_bins [i ])
50- dt = dz / (beam .beta * c )
49+ # slice size
50+ dz = slices .slice_width [sid ]
5151
52- # beam field
53- x_mp = self .get_beam_x (beam )[ix ]
54- y_mp = self .get_beam_y (beam )[ix ]
55- n_mp = x_mp * 0. + beam .particlenumber_per_mp / dz #they have to become cylinders
56- N_mp = slices .n_macroparticles_per_slice [i ]
52+ x = self .get_beam_x (beam )[pid ]
53+ y = self .get_beam_y (beam )[pid ]
5754
58- #compute beam field (it assumes electrons!)
59- self . pyPICsolver . scatter_and_solve ( x_mp , y_mp , n_mp , beam .charge )
55+ # the particles have to become cylinders:
56+ n_mp = np . zeros_like ( x ) + beam .particlenumber_per_mp / dz
6057
61- #gather to beam particles
62- Ex_n_beam , Ey_n_beam = self .pyPICsolver .gather ( x_mp , y_mp )
58+ # compute beam field (it assumes electrons!)
59+ self .pyPICsolver .scatter_and_solve ( x , y , n_mp , beam . charge )
6360
61+ # interpolate beam field to particles
62+ Ex_n_beam , Ey_n_beam = self .pyPICsolver .gather (x , y )
6463
6564 # go to actual beam particles and add relativistic (B field) factor
66- Ex_n_beam = Ex_n_beam / beam .gamma / beam .gamma
67- Ey_n_beam = Ey_n_beam / beam .gamma / beam .gamma
65+ Ex_n_beam = Ex_n_beam / beam .gamma / beam .gamma
66+ Ey_n_beam = Ey_n_beam / beam .gamma / beam .gamma
6867
69-
70- ## kick beam particles
71- fact_kick = beam .charge / (beam .mass * beam .beta * beam .beta * beam .gamma * c * c )* self .L_interaction
72- beam .xp [ix ]+= fact_kick * Ex_n_beam
73- beam .yp [ix ]+= fact_kick * Ex_n_beam
68+ # kick beam particles
69+ fact_kick = beam .charge / (beam .p0 * beam .beta * c ) * self .L_interaction
70+ beam .xp [pid ] += fact_kick * Ex_n_beam
71+ beam .yp [pid ] += fact_kick * Ey_n_beam
7472
7573 if self .save_distributions_last_track :
7674 self .rho_last_track .append (self .pyPICsolver .rho .copy ())
7775 #print 'Here'
7876
7977 if self .save_potential_and_field :
8078 self .phi_last_track .append (self .pyPICsolver .phi .copy ())
81- self .Ex_last_track .append (self .pyPICsolver .efx .copy ()/ beam .gamma / beam .gamma )
82- self .Ey_last_track .append (self .pyPICsolver .efy .copy ()/ beam .gamma / beam .gamma )
83-
79+ self .Ex_last_track .append (
80+ self .pyPICsolver .efx .copy ()/ beam .gamma / beam .gamma )
81+ self .Ey_last_track .append (
82+ self .pyPICsolver .efy .copy ()/ beam .gamma / beam .gamma )
8483
8584 if self .save_distributions_last_track :
8685 self .rho_last_track = np .array (self .rho_last_track [::- 1 ])
0 commit comments