Skip to content

Commit 5ce3665

Browse files
authored
Merge pull request #294 from jgray-19/rbend_fixes
RBend: Revert bad changes, add true parallel rbend
2 parents 24247b9 + 29d5cb6 commit 5ce3665

File tree

2 files changed

+37
-32
lines changed

2 files changed

+37
-32
lines changed

src/madl_dynmap.mad

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -784,9 +784,7 @@ local function rbend_thick_new (elm, m, lw) -- [SPAR] --
784784
m.atdebug(elm, m, lw, 'rbend_thick:0')
785785

786786
local el, eld, knl, beam, T in m
787-
-- local ld, k0 = (eld or el)*lw, knl[1]/abs(el)
788-
local l, ld, k0 = el*lw, (eld or el)*lw, knl[1]/abs(eld)
789-
local lw = (el/eld)*lw
787+
local l, ld, k0 = el*lw, (eld or el)*lw, knl[1]/abs(el)
790788
local beta, k0q, k0lq = beam.beta, k0*beam.charge, knl[1]*lw*beam.charge
791789

792790
for i=1,m.npar do
@@ -811,7 +809,6 @@ local function rbend_thick_new (elm, m, lw) -- [SPAR] --
811809
local xt = l*(2*px - k0lq)*_ptt^2 / xtd
812810
local dxs = asinc(xt*k0q)*xt
813811

814-
-- MAD.dbg()
815812
-- eq. 129 in Forest06 with modif. from Sagan
816813
m[i].x = x + l*(2*px - k0lq) / (pz+pzs)
817814
m[i].px = npx
@@ -828,8 +825,7 @@ local function rbend_thick_old (elm, m, lw) -- [SPAR] --
828825
m.atdebug(elm, m, lw, 'rbend_thick:0')
829826

830827
local el, eld, knl, beam, T in m
831-
local l, ld, k0 = el*lw, (eld or el)*lw, knl[1]/abs(eld)
832-
local lw = (el/eld)*lw
828+
local l, ld, k0 = el*lw, (eld or el)*lw, knl[1]/abs(el)
833829
local beta, k0q, k0lq = beam.beta, k0*beam.charge, knl[1]*lw*beam.charge
834830

835831
for i=1,m.npar do
@@ -863,7 +859,6 @@ local function rbend_thick_old (elm, m, lw) -- [SPAR] --
863859
end
864860

865861
M.rbend_thick = new_bend_thick and rbend_thick_new or rbend_thick_old
866-
M.rbend_strex = \el,m,lw -> M.strex_kick(el,m,(m.el/m.eld)*lw)
867862
M.rbend_kick = \el,m,lw -> M.strex_kick(el,m,lw,true) -- checked
868863

869864
-- TKT [INTER_TKTF] -----------------------------------------------------------o
@@ -1616,30 +1611,30 @@ function M.strex_fringe (elm, m, lw_) -- [FRINGE_STREX] --
16161611
local e1, e2 = (m.e1 or elm.e1)*tdir, (m.e2 or elm.e2)*tdir
16171612
local h1, h2 = elm.h1 *tdir, elm.h2 *tdir
16181613

1619-
if lw == -1 then e1, e2, h1, h2 = e2, e1, h2, h1 end -- swap
1614+
if sdir == -1 then e1, e2, h1, h2 = e2, e1, h2, h1 end -- swap
16201615

16211616
if sdir*lw == 1 then
16221617
! print(lw == 1 and 'forward entry' or 'backward exit')
1623-
local w = true
16241618
yrotation(-e1, m, 1)
1625-
if lw == -1 and m.elc ~= nil then
1626-
m.x, w = m.x+m.elc*sin((e2-e1)/2), false -- EDGE_TRUE_PARALLEL
1619+
if m.etp_dir and m.etp_dir == lw then -- Exiting magnet
1620+
for i=1,m.npar do
1621+
m[i].x = m[i].x+m.elc*sin((e2-e1)/2) -- EDGE_TRUE_PARALLEL
1622+
end
16271623
end
16281624
bend_face(h1, m, 1)
16291625
if m.frng ~= 0 then
16301626
if ftst(m.frng, fringe.bend) then bend_fringe(elm, m, 1) end
16311627
if ftst(m.frng, fringe.mult) then mult_fringe(elm, m, 1) end
16321628
if ftst(m.frng, fringe.qsad) then qsad_fringe(elm, m, 1) end
16331629
end
1634-
if w then -- ! EDGE_TRUE_PARALLEL
1630+
if not m.etp_dir then -- ! EDGE_TRUE_PARALLEL
16351631
local a = 0.5*m.eh*(m.eld or m.el) - e1
16361632
bend_wedge(a, m, 1)
16371633
end
16381634
else
16391635
! print(lw == -1 and 'forward exit' or 'backward entry')
1640-
local w = false
1641-
if lw == 1 and m.elc == nil then -- ! EDGE_TRUE_PARALLEL
1642-
local a, w = 0.5*m.eh*(m.eld or m.el) - e2, true
1636+
if not m.etp_dir then -- ! EDGE_TRUE_PARALLEL
1637+
local a = 0.5*m.eh*(m.eld or m.el) - e2
16431638
bend_wedge(a, m, -1)
16441639
end
16451640
if m.frng ~= 0 then
@@ -1648,8 +1643,10 @@ function M.strex_fringe (elm, m, lw_) -- [FRINGE_STREX] --
16481643
if ftst(m.frng, fringe.bend) then bend_fringe(elm, m, -1) end
16491644
end
16501645
bend_face(h2, m, -1)
1651-
if w then
1652-
m.x, w = m.x+m.elc*sin((e2-e1)/2) -- EDGE_TRUE_PARALLEL
1646+
if m.etp_dir and m.etp_dir == lw then -- Exiting magnet
1647+
for i=1,m.npar do
1648+
m[i].x = m[i].x+m.elc*sin((e2-e1)/2) -- EDGE_TRUE_PARALLEL
1649+
end
16531650
end
16541651
yrotation(e2, m, -1)
16551652
end
@@ -1878,7 +1875,7 @@ function bend_fringe (elm, m, lw) -- [FRINGE_DIPOLE] --
18781875
local el, eld, sdir, tdir, beam in m
18791876
local fh = elm.hgap*(sdir*lw == -1 and elm.fintx or elm.fint)
18801877
local fsad = fh ~= 0 and 1/(72*fh) or 0
1881-
local k0w = m.knl[1]/abs(eld or el)*tdir*lw
1878+
local k0w = m.knl[1]/abs(el)*tdir*lw
18821879
local b0 = k0w*beam.charge
18831880
local _beta = 1/beam.beta
18841881

src/madl_etrck.mad

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -337,43 +337,51 @@ end
337337
local function track_rbend (elm, m)
338338
local angle, e1, e2, true_rbend in elm
339339

340-
e1, e2 = e1+angle/2, e2+angle/2
340+
e1, e2 = e1 and e1+angle/2, e2 and e2+angle/2 -- Could potentially be false.
341341

342342
if not true_rbend then return track_sbend(elm, m, e1, e2) end -- checked
343343

344344
get_mult(elm, m, 3) -- unchecked
345345

346346
local ds, tdir, nmul, knl, ksl in m
347347
local k0, k0s, k1, k1s, k2, k2s in elm
348-
local l = abs(ds)
349348

350-
if l < minlen then
351-
errorf("invalid rbend '%s' length=%.4e [m] (>0 expected)", elm.name, l)
349+
if abs(ds) < minlen then
350+
errorf("invalid rbend '%s' length=%.4e [m] (>0 expected)", elm.name, ds)
352351
end
353352
if abs(angle) < minang then
354353
errorf("invalid rbend '%s' angle=%.4e [rad] (~=0 expected)", elm.name, angle)
355354
end
355+
if e1 and e2 then -- Will require m.ptcmodel
356+
m.e1, m.e2 = e1, e2
357+
m.el, m.eld = arc2cord(ds,angle), ds
358+
m.elc = m.el
359+
else -- True parallel situation
360+
local e1, e2 in elm
361+
if not e1 then -- Will require m.ptcmodel
362+
m.e1, m.e2, m.etp_dir = angle - e2, e2, 1 -- edge true parallel dir decides when patch is performed.
363+
else
364+
m.e1, m.e2, m.etp_dir = e1, angle - e1, -1
365+
end
366+
m.eld = ds
367+
m.elc = arc2cord(ds, angle)
368+
m.el = m.elc * math.cos(angle/2 - m.e1)
369+
end
370+
local l = abs(m.el)
371+
m.eh = angle/ds*tdir
356372

357373
knl[1], ksl[1] = knl[1]+k0*l , ksl[1]+k0s*l
358374
knl[2], ksl[2] = knl[2]+k1*l , ksl[2]+k1s*l
359375
knl[3], ksl[3] = knl[3]+k2*l/2, ksl[3]+k2s*l/2
360376

361-
-- m.el = ds
362-
-- m.elc = len2cord(ds, angle)
363-
-- m.eld = len2arc (ds, angle)
364-
m.el, m.eld, m.eh = arc2cord(ds,angle), ds, angle/ds*tdir
365-
m.e1, m.e2, m.elc = e1, e2, m.el
366-
367377
adj_mult(m)
368378

369-
-- io.write("eh=", m.eh, ", el=", m.el, ", eld=", m.eld, ", elc=", m.elc, ", e1=", m.e1, ", e2=", m.e2, "\n")
370-
371379
local model = elm.model or m.model
372380
local method = elm.method or m.method
373381
local inter, thick, kick
374382

375383
if model == 'DKD' then
376-
inter, thick, kick = DKD[method], strex_drift, rbend_strex
384+
inter, thick, kick = DKD[method], strex_drift, strex_kick
377385
elseif m.nmul == 1 and ksl[1] == 0 then
378386
inter, thick, kick = thickonly , rbend_thick , fnil
379387
else
@@ -382,7 +390,7 @@ local function track_rbend (elm, m)
382390

383391
local track = #elm == 0 and trackelm or tracksub
384392
track(elm, m, inter, thick, kick, strex_fringe)
385-
m.e1, m.e2, m.eld, m.elc = nil, nil, nil, nil
393+
m.e1, m.e2, m.eld, m.elc, m.etp_dir = nil, nil, nil, nil, nil
386394
end
387395

388396
local function track_quadrupole (elm, m)

0 commit comments

Comments
 (0)