Skip to content

Commit fdb49c5

Browse files
committed
Merge branch 'hotfix/transverse-spacecharge' into develop
2 parents 493d017 + 534445f commit fdb49c5

File tree

1 file changed

+31
-32
lines changed

1 file changed

+31
-32
lines changed

spacecharge/transverse_spacecharge.py

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
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

Comments
 (0)