Optimizing beam parameters¶
Optimizing an injector using ASTRA¶
In this section, we will be optimizing the performance of the injector introduced in Building an injector using ASTRA.
from liso import NelderMead
# Instantiate an Optimization object
opt = LinacOptimization(linac)
# Add the objective (the horizontal emittance at the end of the 'gun' beamline)
opt.add_obj('emitx_um', expr='gun.out.emitx', scale=1e6)
# Add variables with lower boundary (lb) and upper boundary (ub)
opt.add_var('laser_spot', value=0.10, lb=0.04, ub=0.3)
opt.add_var('main_sole_b', value=0.20, lb=0.00, ub=0.4)
# Instantiate an optimizer
optimizer = NelderMead()
# Run the optimization
opt.solve(optimizer)
For more details, check the examples.
The optimizer liso.optimizers.NelderMead
used above is for
local optimization.
Besides local optimizers, LISO also provides more powerful optimizers, such
as liso.optimizers.ALPSO
,
for global optimization.
from liso import ALPSO
opt = LinacOptimization(linac)
opt.add_obj('St', expr='gun.out.St', scale=1e15)
opt.add_econ('n_pars', expr='gun.out.n', eq=2000)
opt.add_icon('emitx', expr='gun.out.emitx', scale=1e6, ub=0.3)
opt.add_icon('gamma', func=lambda a: a['gun'].out.gamma, lb=20.0)
opt.add_icon('max_Sx', func=lambda a: a['gun'].max.Sx*1e3, ub=3.0)
opt.add_var('laser_spot', value=0.1, lb=0.04, ub=0.5)
opt.add_var('main_sole_b', value=0.2, lb=0.00, ub=0.4)
opt.add_var('gun_phase', value=0.0, lb=-10, ub=10)
opt.add_var('tws_phase', value=0.0, lb=-90, ub=0)
optimizer = ALPSO()
optimizer.swarm_size = 40
opt.solve(optimizer)
For more details, check the examples.