AngelFP / Wake-T

A fast tracking code for plasma accelerators
https://wake-t.readthedocs.io
GNU General Public License v3.0
34 stars 14 forks source link

solenoid refocusing #100

Closed berceanu closed 1 year ago

berceanu commented 2 years ago

As I understand it, Wake-T includes space-charge effects. In principle it can be used to model beamlines that include plasma lenses, quadrupoles, etc. We were considering to use it for modelling electron bunch refocusing in a solenoid, would this work? Is there a particular example to start from? Particularly for defining the solenoid.

AngelFP commented 2 years ago

Hi @berceanu, Thanks for the interest! Space-charge forces are currently not included (they are implicitly taken into account in some plasma wakefield models, but not in general for all beamline elements). It's something I have in the radar, but so far other things have had higher priority.

While there is no solenoid element in Wake-T, it is in principle possible to track a beam in any arbitrary 3D field. Would this still be interesting for you if there are no space-charge effects? If so, I could give you a simple example to start from.

berceanu commented 1 year ago

Hi Angel, thanks for the quick reply!

Yes indeed, that would still be interesting, at least for the high-energy electrons where space charge effects are smaller, so a starting example would be much appreciated.

AngelFP commented 1 year ago

Hi @berceanu, sorry for the late follow up, busy times before the holidays :)

I had a look at the possibility of tracking particle bunches in any arbitrary fields and in the end I implemented a new base class for this. I believe it should work well for what you want to do.

If you want to try it out, you need to install the field_element branch (e.g., by doing pip install -U git+https://github.com/AngelFP/Wake-T.git@field_element).

I made a quick example below where a bunch is tracked through an azimuthal magnetic field, which is probably close to what you will need.

Let me know if you have any questions!

import numpy as np
import scipy.constants as ct

from wake_t.utilities.bunch_generation import get_gaussian_bunch_from_twiss
from wake_t.fields.analytical_field import AnalyticalField
from wake_t.beamline_elements import FieldElement

def b_x(x, y, z, t, bx, constants):
    """B_x component."""
    k = constants[0]
    bx -= k * y

def b_y(x, y, z, t, by, constants):
    """B_y component."""
    k = constants[0]
    by += k * x

# Define field (azimuthal magnetic field with a linear gradient of 100 T/m).
b_theta = AnalyticalField(b_x=b_x, b_y=b_y, constants=[-100])

# Create bunch.
emitt_nx = emitt_ny = 1e-6  # m
beta_x = beta_y = 1.  # m
s_t = 100.  # fs
gamma_avg = 1000
ene_spread = 0.1  # %
q_bunch = 30  # pC
xi_avg = 0.  # m
n_part = 1e4
bunch = get_gaussian_bunch_from_twiss(
    en_x=emitt_nx, en_y=emitt_ny, a_x=0, a_y=0, b_x=beta_x, b_y=beta_y,
    ene=gamma_avg, ene_sp=ene_spread, s_t=s_t, xi_c=xi_avg,
    q_tot=q_bunch, n_part=n_part, name='elec_bunch')

# Create field element.
element = FieldElement(
    length=1,  # in meters
    dt_bunch=1e-3/ct.c,  # time step for the particle pusher, in seconds
    n_out=10,  # number of output diagnostics
    fields=[b_theta]  # list of fields to apply
)

# Do tracking.
element.track(bunch, opmd_diag=True)
berceanu commented 1 year ago

Thanks, much appreciated!

Hypothetically, if one would like to include space charge effects for the case of low-energy electrons, would Wake-T be compatible with a, say, Green-function based Poisson solver for example?

AngelFP commented 1 year ago

I'm no expert in that method in particular, but I believe it should be possible. If all you need is the particle distribution at a time t to compute E and B at that time it should be straightforward to implement this by using the NumericalField class.

Is that something you would be interested in having a look at?

berceanu commented 1 year ago

Possibly yes. Do you think implementing such a method in Wake-T could lead to publishable results, ie could we find a good physics case? Perhaps combined with ML?

AngelFP commented 1 year ago

There could be some case (e.g., a start-to-end modeling of a plasma accelerator where space charge is relevant in the beam transport). Do you have anything in mind related to ML?

By the way, did you have any chance to try out the solenoid case?

Sorry for the late follow-up, I'm just now back from vacation.

berceanu commented 1 year ago

Short update for anyone following this, field_element was merged into dev via https://github.com/AngelFP/Wake-T/pull/102 and the code above was incorporated into tests/test_field_element.py.

AngelFP commented 1 year ago

Hi @berceanu, thanks for taking care of this. I assume that the new FieldElement worked well for your case?

berceanu commented 1 year ago

Hi @AngelFP , yes indeed, thank you. Still thinking about the space charge, will probably create a new issue if/when I get the time.

AngelFP commented 1 year ago

Sounds great, thanks!