@@ -499,75 +499,64 @@ function M.strex_kick (elm, m, lw, no_k0l) -- [KICKEX] --
499
499
m.atdebug(elm, m, lw, 'strex_kick:1', no_k0l)
500
500
end
501
501
502
- function M.strex_kickh (elm, m, lw) -- [KICKT] -- checked
503
- if m.nmul == 0 then return end
502
+ function M.strex_kickhs (elm, m, lw) -- [KICKT] -- unchecked
503
+ local lrad, el, nmul, ksi in m
504
+ if lrad == 0 or nmul == 0 and ksi == 0 then return end
504
505
505
- m.atdebug(elm, m, lw, 'strex_kickh :0')
506
+ m.atdebug(elm, m, lw, 'strex_kickhs :0')
506
507
507
- local el, tdir, nmul , knl, ksl, beam in m
508
+ local tdir, knl, ksl, beam in m
508
509
local wchg = lw*tdir*beam.charge
509
510
local _beta = 1/beam.beta
511
+ local hss = (ksi^2/lrad) -- 4 H(s_0)^2/ds
510
512
511
513
for i=1,m.npar do
512
514
local x, px, y, py, t, pt, beam in m[i]
513
515
local wchg = beam and lw*tdir*beam.charge or wchg
514
516
local _beta = beam and 1/beam.beta or _beta
515
517
local pz = sqrt(1 + (2*_beta)*pt + pt^2)
516
- local bx,by = bxby(nmul, knl, ksl, x, y)
517
-
518
- m[i].px = px - wchg*(by - knl[1]*pz)
519
- m[i].py = py + wchg*(bx - ksl[1]*pz)
520
- m[i].t = t - wchg*(knl[1]*x - ksl[1]*y)*(_beta+pt)/pz
521
-
522
- -- field curvature
523
- if el ~= 0 then
524
- m[i].px = m[i].px - wchg*(knl[1]^2/el)*x
525
- m[i].py = m[i].py - wchg*(ksl[1]^2/el)*y
526
- end
527
- end
528
-
529
- m.atdebug(elm, m, lw, 'strex_kickh:1')
530
- end
531
-
532
- function M.strex_kicks (elm, m, lw) -- [KICKT] -- unchecked
533
- local lrad, nmul, ksi in m
534
- if lrad == 0 or nmul == 0 and ksi == 0 then return end
535
-
536
- m.atdebug(elm, m, lw, 'strex_kicks:0')
537
-
538
- local tdir, knl, ksl, beam in m
539
- local wchg = lw*lrad*tdir*beam.charge
540
- local _beta = 1/beam.beta
541
- local bsol = 0.5*ksi
542
-
543
- for i=1,m.npar do
544
- local x, px, y, py, t, pt, beam in m[i]
545
- local wchg = beam and lw*lrad*tdir*beam.charge or wchg
546
- local _beta = beam and 1/beam.beta or _beta
547
518
548
519
-- multipole
549
520
local bx,by = bxby(nmul, knl, ksl, x, y)
550
521
551
- m[i].px = px - wchg*by
522
+ m[i].px = px - wchg*by -- With 0 el and ksi ~= 0, we get problems with the multipole
552
523
m[i].py = py + wchg*bx
553
524
554
- -- solenoid
555
- local _dpp = 1/sqrt(1 + (2*_beta)*pt + pt^2)
556
- local ang = bsol*_dpp
557
- local ca, sa = cos(ang), sin(ang)
525
+ if abs(knl[1]) + abs(ksl[1]) > 0 then
526
+ m[i].px = m[i].px + (wchg*knl[1])*pz
527
+ m[i].py = m[i].py - (wchg*ksl[1])*pz
528
+ m[i].t = t - wchg*(knl[1]*x - ksl[1]*y)*(_beta+pt)/pz
558
529
559
- local nx = ca* x + sa* y
560
- local npx = ca*px + sa*py
561
- local ny = ca* y - sa* x
562
- local npy = ca*py - sa*px
563
- local nt = t + ang*(_beta+pt)*(y*px - x*py)*_dp
530
+ -- field curvature
531
+ if lrad ~= 0 then
532
+ m[i].px = m[i].px - wchg*(knl[1]^2/lrad)*x
533
+ m[i].py = m[i].py - wchg*(ksl[1]^2/lrad)*y
534
+ end
535
+ end
564
536
565
- m[i].px = npx - 0.25*wchg*nx*_dpp
566
- m[i].py = npy - 0.25*wchg*ny*_dpp
567
- m[i].t = nt + 0.125*(_beta+pt)*wchg*(nx^2+ny^2)*_dpp^3
537
+ -- solenoid
538
+ if ksi ~= 0 and lrad ~= 0 then
539
+ local x, px, y, py, t, pt, beam in m[i]
540
+ local _dp = 1/(1 + (2*_beta)*pt + pt^2)
541
+ local _dpp = 1/pz
542
+ local ang = (0.5*ksi*lw)*_dpp
543
+ local ca, sa = cos(ang), sin(ang)
544
+
545
+ local nx = ca* x + sa* y
546
+ local npx = ca*px + sa*py
547
+ local ny = ca* y - sa* x
548
+ local npy = ca*py - sa*px
549
+ local nt = t - ang*(_beta+pt)*(y*px - x*py)*_dp
550
+
551
+ m[i].x = nx
552
+ m[i].px = npx - 0.25*(wchg*hss)*nx*_dpp
553
+ m[i].y = ny
554
+ m[i].py = npy - 0.25*(wchg*hss)*ny*_dpp
555
+ m[i].t = nt - 0.125*(_beta+pt)*(wchg*hss)*(nx^2+ny^2)*_dpp^3
556
+ end
568
557
end
569
558
570
- m.atdebug(elm, m, lw, 'strex_kicks :1', no_k0l )
559
+ m.atdebug(elm, m, lw, 'strex_kickhs :1')
571
560
end
572
561
573
562
-- DKD [INTER_TEAPOT] ---------------------------------------------------------o
0 commit comments