Skip to content

RBend: Revert bad changes, add true parallel rbend #294

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
May 4, 2023
33 changes: 15 additions & 18 deletions src/madl_dynmap.mad
Original file line number Diff line number Diff line change
Expand Up @@ -784,9 +784,7 @@ local function rbend_thick_new (elm, m, lw) -- [SPAR] --
m.atdebug(elm, m, lw, 'rbend_thick:0')

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

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

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

local el, eld, knl, beam, T in m
local l, ld, k0 = el*lw, (eld or el)*lw, knl[1]/abs(eld)
local lw = (el/eld)*lw
local l, ld, k0 = el*lw, (eld or el)*lw, knl[1]/abs(el)
local beta, k0q, k0lq = beam.beta, k0*beam.charge, knl[1]*lw*beam.charge

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

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

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

if lw == -1 then e1, e2, h1, h2 = e2, e1, h2, h1 end -- swap
if sdir == -1 then e1, e2, h1, h2 = e2, e1, h2, h1 end -- swap

if sdir*lw == 1 then
! print(lw == 1 and 'forward entry' or 'backward exit')
local w = true
yrotation(-e1, m, 1)
if lw == -1 and m.elc ~= nil then
m.x, w = m.x+m.elc*sin((e2-e1)/2), false -- EDGE_TRUE_PARALLEL
if m.etp_dir and m.etp_dir == lw then -- Exiting magnet
for i=1,m.npar do
m[i].x = m[i].x+m.elc*sin((e2-e1)/2) -- EDGE_TRUE_PARALLEL
end
end
bend_face(h1, m, 1)
if m.frng ~= 0 then
if ftst(m.frng, fringe.bend) then bend_fringe(elm, m, 1) end
if ftst(m.frng, fringe.mult) then mult_fringe(elm, m, 1) end
if ftst(m.frng, fringe.qsad) then qsad_fringe(elm, m, 1) end
end
if w then -- ! EDGE_TRUE_PARALLEL
if not m.etp_dir then -- ! EDGE_TRUE_PARALLEL
local a = 0.5*m.eh*(m.eld or m.el) - e1
bend_wedge(a, m, 1)
end
else
! print(lw == -1 and 'forward exit' or 'backward entry')
local w = false
if lw == 1 and m.elc == nil then -- ! EDGE_TRUE_PARALLEL
local a, w = 0.5*m.eh*(m.eld or m.el) - e2, true
if not m.etp_dir then -- ! EDGE_TRUE_PARALLEL
local a = 0.5*m.eh*(m.eld or m.el) - e2
bend_wedge(a, m, -1)
end
if m.frng ~= 0 then
Expand All @@ -1648,8 +1643,10 @@ function M.strex_fringe (elm, m, lw_) -- [FRINGE_STREX] --
if ftst(m.frng, fringe.bend) then bend_fringe(elm, m, -1) end
end
bend_face(h2, m, -1)
if w then
m.x, w = m.x+m.elc*sin((e2-e1)/2) -- EDGE_TRUE_PARALLEL
if m.etp_dir and m.etp_dir == lw then -- Exiting magnet
for i=1,m.npar do
m[i].x = m[i].x+m.elc*sin((e2-e1)/2) -- EDGE_TRUE_PARALLEL
end
end
yrotation(e2, m, -1)
end
Expand Down Expand Up @@ -1876,7 +1873,7 @@ function bend_fringe (elm, m, lw) -- [FRINGE_DIPOLE] --
local el, eld, sdir, tdir, beam in m
local fh = elm.hgap*(sdir*lw == -1 and elm.fintx or elm.fint)
local fsad = fh ~= 0 and 1/(72*fh) or 0
local k0w = m.knl[1]/abs(eld or el)*tdir*lw
local k0w = m.knl[1]/abs(el)*tdir*lw
local b0 = k0w*beam.charge
local _beta = 1/beam.beta

Expand Down
36 changes: 22 additions & 14 deletions src/madl_etrck.mad
Original file line number Diff line number Diff line change
Expand Up @@ -337,43 +337,51 @@ end
local function track_rbend (elm, m)
local angle, e1, e2, true_rbend in elm

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

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

get_mult(elm, m, 3) -- unchecked

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

if l < minlen then
errorf("invalid rbend '%s' length=%.4e [m] (>0 expected)", elm.name, l)
if abs(ds) < minlen then
errorf("invalid rbend '%s' length=%.4e [m] (>0 expected)", elm.name, ds)
end
if abs(angle) < minang then
errorf("invalid rbend '%s' angle=%.4e [rad] (~=0 expected)", elm.name, angle)
end
if e1 and e2 then -- Will require m.ptcmodel
m.e1, m.e2 = e1, e2
m.el, m.eld = arc2cord(ds,angle), ds
m.elc = m.el
else -- True parallel situation
local e1, e2 in elm
if not e1 then -- Will require m.ptcmodel
m.e1, m.e2, m.etp_dir = angle - e2, e2, 1 -- edge true parallel dir decides when patch is performed.
else
m.e1, m.e2, m.etp_dir = e1, angle - e1, -1
end
m.eld = ds
m.elc = arc2cord(ds, angle)
m.el = m.elc * math.cos(angle/2 - m.e1)
end
local l = abs(m.el)
m.eh = angle/ds*tdir

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

-- m.el = ds
-- m.elc = len2cord(ds, angle)
-- m.eld = len2arc (ds, angle)
m.el, m.eld, m.eh = arc2cord(ds,angle), ds, angle/ds*tdir
m.e1, m.e2, m.elc = e1, e2, m.el

adj_mult(m)

-- io.write("eh=", m.eh, ", el=", m.el, ", eld=", m.eld, ", elc=", m.elc, ", e1=", m.e1, ", e2=", m.e2, "\n")

local model = elm.model or m.model
local method = elm.method or m.method
local inter, thick, kick

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

local track = #elm == 0 and trackelm or tracksub
track(elm, m, inter, thick, kick, strex_fringe)
m.e1, m.e2, m.eld, m.elc = nil, nil, nil, nil
m.e1, m.e2, m.eld, m.elc, m.etp_dir = nil, nil, nil, nil, nil
end

local function track_quadrupole (elm, m)
Expand Down