Skip to content
Snippets Groups Projects
Commit e27fb231 authored by Vadim GUBAIDULIN's avatar Vadim GUBAIDULIN
Browse files

Merge branch 'ions' into 'develop'

Ions

See merge request !18
parents 5ef174f2 7e48359c
No related branches found
No related tags found
2 merge requests!280.8.0,!18Ions
...@@ -7,7 +7,7 @@ import numpy as np ...@@ -7,7 +7,7 @@ import numpy as np
from scipy.constants import c, epsilon_0, mu_0 from scipy.constants import c, epsilon_0, mu_0
from mbtrack2.impedance.wakefield import Impedance, WakeField, WakeFunction from mbtrack2.impedance.wakefield import Impedance, WakeField, WakeFunction
from mbtrack2.tracking.particles_electromagnetic_fields import _wofz from mbtrack2.tracking.emfields import _wofz
def skin_depth(frequency, rho, mu_r=1, epsilon_r=1): def skin_depth(frequency, rho, mu_r=1, epsilon_r=1):
......
...@@ -18,12 +18,9 @@ from scipy.constants import c, e ...@@ -18,12 +18,9 @@ from scipy.constants import c, e
from mbtrack2.tracking.aperture import ElipticalAperture from mbtrack2.tracking.aperture import ElipticalAperture
from mbtrack2.tracking.element import Element from mbtrack2.tracking.element import Element
from mbtrack2.tracking.emfields import _efieldn_mit, get_displaced_efield
from mbtrack2.tracking.monitors import Monitor from mbtrack2.tracking.monitors import Monitor
from mbtrack2.tracking.particles import Beam, Bunch from mbtrack2.tracking.particles import Beam, Bunch
from mbtrack2.tracking.particles_electromagnetic_fields import (
_efieldn_mit,
get_displaced_efield,
)
class IonMonitor(Monitor, metaclass=ABCMeta): class IonMonitor(Monitor, metaclass=ABCMeta):
...@@ -356,6 +353,9 @@ class BeamIonElement(Element): ...@@ -356,6 +353,9 @@ class BeamIonElement(Element):
The number of records in the built-in ion beam monitor. Should be number of turns times number of bunches because the monitor records every turn after each bunch passage. The number of records in the built-in ion beam monitor. Should be number of turns times number of bunches because the monitor records every turn after each bunch passage.
n_ion_macroparticles_per_bunch : int, optional n_ion_macroparticles_per_bunch : int, optional
The number of ion macroparticles generated per electron bunch passed. Defaults to 30. The number of ion macroparticles generated per electron bunch passed. Defaults to 30.
ion_beam_monitor_name : str, optional
If provided, the name of the ion monitor output file. It must end with an extension '.hdf5'.
If None, no ion monitor file is generated.
use_ion_phase_space_monitor : bool, optional use_ion_phase_space_monitor : bool, optional
Whether to use the ion phase space monitor. Whether to use the ion phase space monitor.
generate_method : str, optional generate_method : str, optional
...@@ -431,7 +431,7 @@ class BeamIonElement(Element): ...@@ -431,7 +431,7 @@ class BeamIonElement(Element):
if self.ion_beam_monitor_name: if self.ion_beam_monitor_name:
warnings.warn( warnings.warn(
'BeamIonMonitor.ion_beam_monitor_name.close() should be called at the end of tracking', 'BeamIonMonitor.beam_monitor.close() should be called at the end of tracking',
UserWarning, UserWarning,
stacklevel=2) stacklevel=2)
self.beam_monitor = IonMonitor( self.beam_monitor = IonMonitor(
...@@ -467,13 +467,13 @@ class BeamIonElement(Element): ...@@ -467,13 +467,13 @@ class BeamIonElement(Element):
@wraps(track) @wraps(track)
def track_wrapper(*args, **kwargs): def track_wrapper(*args, **kwargs):
if isinstance(args[1], Beam): if isinstance(args[1], Beam):
if Beam.switch_mpi: self = args[0]
beam = args[1]
if beam.mpi_switch:
warnings.warn( warnings.warn(
'Tracking through beam-ion element is performed sequentially. Bunches are not parallelized.', 'Tracking through beam-ion element is performed sequentially. Bunches are not parallelized.',
UserWarning, UserWarning,
stacklevel=2) stacklevel=2)
self = args[0]
beam = args[1]
for bunch in beam.bunch_list: for bunch in beam.bunch_list:
track(self, bunch, *args[2:], **kwargs) track(self, bunch, *args[2:], **kwargs)
else: else:
...@@ -611,7 +611,7 @@ class BeamIonElement(Element): ...@@ -611,7 +611,7 @@ class BeamIonElement(Element):
The new y momentum of the first beam. The new y momentum of the first beam.
""" """
en_x, en_y = BeamIonElement._get_efields(first_beam, en_x, en_y = self._get_efields(first_beam,
second_beam, second_beam,
field_model=field_model) field_model=field_model)
kicks_x = prefactor * en_x kicks_x = prefactor * en_x
......
...@@ -104,8 +104,8 @@ def efieldn_gauss_round(x, y, sig_x, sig_y): ...@@ -104,8 +104,8 @@ def efieldn_gauss_round(x, y, sig_x, sig_y):
""" """
r_squared = x*x + y*y r_squared = x*x + y*y
sig_r = sig_x sig_r = sig_x
amplitude = (1 - np.exp(-r_squared / amplitude = -np.expm1(-r_squared /
(2*sig_r*sig_r))) / (2*pi*epsilon_0*r_squared) (2*sig_r*sig_r)) / (2*pi*epsilon_0*r_squared)
return x * amplitude, y * amplitude return x * amplitude, y * amplitude
......
...@@ -4,10 +4,7 @@ Module for transverse space charge calculations. ...@@ -4,10 +4,7 @@ Module for transverse space charge calculations.
from scipy.constants import c from scipy.constants import c
from mbtrack2.tracking.element import Element from mbtrack2.tracking.element import Element
from mbtrack2.tracking.particles_electromagnetic_fields import ( from mbtrack2.tracking.emfields import _efieldn_mit, get_displaced_efield
_efieldn_mit,
get_displaced_efield,
)
class TransverseSpaceCharge(Element): class TransverseSpaceCharge(Element):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment