Skip to content

Commit e0fc6c2

Browse files
authored
Merge pull request #285 from jgray-19/combined_sol
Combine curvature and solenoid multipole maps
2 parents 6d9edbd + 958d0b0 commit e0fc6c2

File tree

2 files changed

+57
-66
lines changed

2 files changed

+57
-66
lines changed

src/madl_dynmap.mad

Lines changed: 38 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -499,75 +499,64 @@ function M.strex_kick (elm, m, lw, no_k0l) -- [KICKEX] --
499499
m.atdebug(elm, m, lw, 'strex_kick:1', no_k0l)
500500
end
501501

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
504505

505-
m.atdebug(elm, m, lw, 'strex_kickh:0')
506+
m.atdebug(elm, m, lw, 'strex_kickhs:0')
506507

507-
local el, tdir, nmul, knl, ksl, beam in m
508+
local tdir, knl, ksl, beam in m
508509
local wchg = lw*tdir*beam.charge
509510
local _beta = 1/beam.beta
511+
local hss = (ksi^2/lrad) -- 4 H(s_0)^2/ds
510512

511513
for i=1,m.npar do
512514
local x, px, y, py, t, pt, beam in m[i]
513515
local wchg = beam and lw*tdir*beam.charge or wchg
514516
local _beta = beam and 1/beam.beta or _beta
515517
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
547518

548519
-- multipole
549520
local bx,by = bxby(nmul, knl, ksl, x, y)
550521

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
552523
m[i].py = py + wchg*bx
553524

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
558529

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
564536

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
568557
end
569558

570-
m.atdebug(elm, m, lw, 'strex_kicks:1', no_k0l)
559+
m.atdebug(elm, m, lw, 'strex_kickhs:1')
571560
end
572561

573562
-- DKD [INTER_TEAPOT] ---------------------------------------------------------o

src/madl_etrck.mad

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ local thinonly, thickonly, driftonly, DKD, MKM in MAD.symint
5757

5858
-- straight elements (DKD)
5959
local strex_drift, strex_kick , strex_fringe in MAD.dynmap
60-
local strex_kickh --[[ h ]] in MAD.dynmap
61-
local strex_kicks --[[ ksi ]] in MAD.dynmap
60+
!local strex_kickh --[[ h ]] in MAD.dynmap
61+
local strex_kickhs --[[ h, ksi ]] in MAD.dynmap
6262

6363
-- curved elements (DKD)
6464
local curex_drift, curex_kick , curex_fringe in MAD.dynmap
@@ -247,20 +247,18 @@ local function track_multipole (elm, m)
247247
if m.nmul == 0 then return track_marker(elm, m) end
248248

249249
local angle, ksi, lrad in elm
250-
local knl, ksl, edir in m
250+
local knl, ksl in m
251251

252-
m.el = lrad
252+
m.lrad = lrad
253253

254254
local kick = strex_kick
255-
if abs(knl[1]) + abs(ksl[1]) >= minang then
256-
kick = strex_kickh
257-
elseif abs(ksi) >= minstr then
255+
if abs(knl[1]) + abs(ksl[1]) + abs(ksi) >= minang then
258256
m.ksi = ksi
259-
kick = strex_kicks
257+
kick = strex_kickhs
260258
end
261259

262260
trackelm(elm, m, thinonly, nil, kick, fnil)
263-
m.ksi = nil
261+
m.ksi, m.lrad = nil, nil
264262
end
265263

266264
local function track_bbeam (elm, m)
@@ -548,34 +546,38 @@ local function track_solenoid (elm, m)
548546
get_mult(elm, m)
549547

550548
local ds, tdir, edir in m
551-
local ks, ksi in elm
549+
local ks, ksi, lrad in elm
552550
local l = abs(ds)
551+
local model = elm.model or m.model
553552

554553
if l < minlen then
555-
errorf("invalid solenoid '%s' length=%.4e [m] (>0 expected)", elm.name, l)
554+
if (model == "DKD" and lrad ~=0 ) then
555+
return track_multipole(elm, m)
556+
else
557+
errorf("invalid solenoid '%s' length=%.4e [m] (>0 expected)", elm.name, l)
558+
end
556559
end
557560

558561
m.el, m.eh = ds, 0
559562

560563
local ksi = ksi + ks*l
561564
local no_ksi = abs(ksi) < minstr
562-
local model = elm.model or m.model
563565
local method = elm.method or m.method
564566
local thick, kick, fringe
565567

566568
if model == 'DKD' and no_ksi then
567569
thick, kick, fringe = strex_drift, strex_kick , strex_fringe
568570
elseif model == 'DKD' then
569-
m.ksi = ksi
570-
thick, kick, fringe = strex_drift, strex_kicks, strex_fringe
571+
m.ksi, m.lrad = ksi, lrad
572+
thick, kick, fringe = strex_drift, strex_kickhs, strex_fringe
571573
else
572574
m.ks = ksi/l*edir
573-
thick, kick, fringe = solen_thick, strex_kick , solen_fringe
575+
thick, kick, fringe = solen_thick, strex_kick , m.ptcmodel and curex_fringe or solen_fringe
574576
end
575577

576578
local track = #elm == 0 and trackelm or tracksub
577-
track(elm, m, DKD[method], thick, strex_kick, fringe)
578-
m.ks, m.ksi = nil, nil
579+
track(elm, m, DKD[method], thick, kick, fringe)
580+
m.ks, m.ksi, m.lrad = nil, nil, nil
579581
end
580582

581583
-- eseptum

0 commit comments

Comments
 (0)