Skip to content
Snippets Groups Projects

Faster CircularResistiveWall

Merged Keon Hee KIM requested to merge faster_circular_resistive_wall into develop
1 unresolved thread
1 file
+ 27
17
Compare changes
  • Side-by-side
  • Inline
@@ -79,7 +79,6 @@ class CircularResistiveWall(WakeField):
[4] : Zotter, Bruno W., and Semyon A. Kheifets (1998). Impedances and wakes
in high-energy particle accelerators. World Scientific.
"""
def __init__(self,
@@ -168,7 +167,8 @@ class CircularResistiveWall(WakeField):
if exact == True:
idx2 = time == 0
idx3 = np.logical_not(np.logical_or(idx1, idx2))
factor = self.Z0 * c / (3 * np.pi * self.radius**2) * self.length
factor = ( self.Z0 * c / (3 * np.pi * self.radius**2) *
self.length )
if np.any(idx2):
# fundamental theorem of beam loading
wl[idx2] = 3 * factor / 2
@@ -217,8 +217,9 @@ class CircularResistiveWall(WakeField):
if exact == True:
idx2 = time == 0
idx3 = np.logical_not(np.logical_or(idx1, idx2))
factor = ( (self.Z0 * c**2 * self.t0) / (3 * np.pi * self.radius**4) *
self.length )
factor = ( (self.Z0 * c**2 * self.t0) /
(3 * np.pi * self.radius**4) *
self.length )
wt[idx3] = self.__TransWakeExact(time[idx3], factor)
else:
idx2 = np.logical_not(idx1)
@@ -226,22 +227,31 @@ class CircularResistiveWall(WakeField):
return wt
def __LongWakeExact(self, t, factor):
wl = np.real( factor * ( 4 * np.exp(-1 * t / self.t0)
* np.cos(np.sqrt(3) * t / self.t0)
+ wofz(1j * np.sqrt(2 * t / self.t0))
- wofz(np.exp(1j * np.pi / 6) * np.sqrt(2 * t / self.t0))
- wofz(-1 * np.exp(-1j * np.pi / 6) * np.sqrt(2 * t / self.t0)) ) )
wl = np.real( factor *
( 4 * np.exp(-1 * t / self.t0) *
np.cos(np.sqrt(3) * t / self.t0)
+ wofz( 1j *
np.sqrt(2 * t / self.t0) )
- wofz( np.exp(1j * np.pi / 6) *
np.sqrt(2 * t / self.t0) )
- wofz( -1 * np.exp(-1j * np.pi / 6) *
np.sqrt(2 * t / self.t0)) ) )
return wl
def __TransWakeExact(self, t, factor):
wt = np.real( factor * ( 2 * np.exp(-1 * t / self.t0)
* ( np.sqrt(3) * np.sin(np.sqrt(3) * t / self.t0)
- np.cos(np.sqrt(3) * t / self.t0) )
+ wofz(1j * np.sqrt(2 * t / self.t0))
+ np.exp(-1j * np.pi / 3) * wofz( np.exp(1j * np.pi / 6)
* np.sqrt(2 * t / self.t0) )
+ np.exp(1j * np.pi / 3) * wofz( -1 * np.exp(-1j * np.pi / 6)
* np.sqrt(2 * t / self.t0) ) ) )
wt = np.real( factor *
( 2 * np.exp(-1 * t / self.t0) *
( np.sqrt(3) *
np.sin(np.sqrt(3) * t / self.t0) -
np.cos(np.sqrt(3) * t / self.t0) )
+ wofz( 1j *
np.sqrt(2 * t / self.t0) )
+ np.exp(-1j * np.pi / 3) *
wofz( np.exp(1j * np.pi / 6) *
np.sqrt(2 * t / self.t0) )
+ np.exp(1j * np.pi / 3) *
wofz( -1 * np.exp(-1j * np.pi / 6) *
np.sqrt(2 * t / self.t0) ) ) )
return wt
def __LongWakeApprox(self, t):
Loading