Source code for at.collective.wake_functions

"""
Analytical wake functions
"""
import numpy
from at.constants import clight
from scipy.interpolate import interp1d


[docs] def convolve_wakefun(srange, w, sigs, gauss_sigma=10): """Convolution of a wake function with a pulse of rms length sigs, this is use to generate a wake potential that can be added to the output of EM code like GDFIDL""" def _gauss(s): ampl = 1 / (numpy.sqrt(2 * numpy.pi) * sigs) expon = numpy.exp(-s**2 / (2 * sigs**2)) return ampl * expon ds = numpy.diff(srange)[-1] s_gauss = numpy.arange(-gauss_sigma*sigs, gauss_sigma*sigs+1e-15, ds) gauss = _gauss(s_gauss) conv = numpy.convolve(gauss, w, mode='full') * ds s_offset = gauss_sigma * sigs - numpy.amin(srange) s_conv = numpy.arange(len(conv)) * ds - s_offset ifun = interp1d(s_conv, conv, bounds_error=False, fill_value=0) conv_wf = ifun(srange) return conv_wf
[docs] def long_resonator_wf(srange, frequency, qfactor, rshunt, beta): """ Define the wake function (longitudinal) of a resonator with the given parameters according to Alex Chao's resonator model (Eq. 2.82) and definitions of the resonator in HEADTAIL. """ omega = 2 * numpy.pi * frequency alpha = omega / (2 * qfactor) omegabar = numpy.sqrt(numpy.abs(omega**2 - alpha**2)) dt = -srange/(beta * clight) if qfactor > 0.5: wake = (-(numpy.sign(dt) - 1) * rshunt * alpha * numpy.exp(alpha * dt) * (numpy.cos(omegabar * dt) + alpha / omegabar * numpy.sin(omegabar*dt))) elif qfactor == 0.5: wake = (-(numpy.sign(dt) - 1) * rshunt * alpha * numpy.exp(alpha * dt) * (1. + alpha * dt)) elif qfactor < 0.5: wake = (-(numpy.sign(dt) - 1) * rshunt * alpha * numpy.exp(alpha * dt) * (numpy.cosh(omegabar * dt) + alpha / omegabar * numpy.sinh(omegabar * dt))) return wake
[docs] def transverse_resonator_wf(srange, frequency, qfactor, rshunt, yokoya_factor, beta): """ Define the wake function (transverse) of a resonator with the given parameters according to Alex Chao's resonator model (Eq. 2.82) and definitions of the resonator in HEADTAIL. """ omega = 2 * numpy.pi * frequency alpha = omega / (2 * qfactor) omegabar = numpy.sqrt(numpy.abs(omega**2 - alpha**2)) dt = -srange/(beta * clight) if qfactor > 0.5: wake = (-(numpy.sign(dt) - 1) * yokoya_factor * rshunt * omega**2 / (qfactor * omegabar) * numpy.exp(alpha*dt) * numpy.sin(omegabar*dt)) elif qfactor == 0.5: wake = (-(numpy.sign(dt) - 1) * yokoya_factor * rshunt * omega**2 / qfactor * numpy.exp(alpha * dt) * dt) else: wake = (-(numpy.sign(dt) - 1) * yokoya_factor * rshunt * omega**2 / (qfactor * omegabar) * numpy.exp(alpha*dt) * numpy.sinh(omegabar*dt)) return wake
[docs] def transverse_reswall_wf(srange, yokoya_factor, length, rvac, conduct, beta): """ Define the wake function (transverse) of a resistive wall with the given parameters according to Alex Chao's RW model (2.53) and definitions used in HEADTAIL """ z0 = 119.9169832 * numpy.pi dt = -srange/(beta * clight) wake = (yokoya_factor * (numpy.sign(dt) - 1) / 2. * beta * length / numpy.pi / rvac**3 * numpy.sqrt(-z0 * clight / conduct / numpy.pi / dt)) wake[srange <= 0] = 0.0 return wake