@@ -362,7 +362,7 @@ local function track_sbend (elm, m, e1_, e2_)
362
362
363
363
if model == 'DKD' then -- curved thin
364
364
inter, thick, kick = DKD[method], curex_drift , curex_kick
365
- elseif m.nmul == 1 and ksl[1] == 0 then -- curved thick only
365
+ elseif m.nmul == 1 and ksl[1] == 0 and not m.ptcmodel then -- curved thick only
366
366
inter, thick, kick = thickonly , sbend_thick , fnil
367
367
else -- if abs(knl[2]) < minstr then -- curved thick
368
368
inter, thick, kick = TKT[method], sbend_thick , sbend_kick
@@ -374,16 +374,16 @@ local function track_sbend (elm, m, e1_, e2_)
374
374
end
375
375
376
376
local function track_rbend (elm, m)
377
- local angle, e1, e2, true_rbend in elm
377
+ local angle, e1, e2, true_rbend, truerbend, ptcrbend in elm
378
378
379
379
m.mang = 0
380
- if not true_rbend then -- checked
380
+ if not ( true_rbend or truerbend or ptcrbend) then -- checked
381
381
return track_sbend(elm, m, e1+angle/2, e2+angle/2)
382
382
end
383
383
384
384
get_mult(elm, m, 3) -- unchecked
385
385
386
- local ds, tdir, nmul, knl, ksl in m
386
+ local ds, tdir, nmul, knl, ksl, ptcmodel in m
387
387
local k0, k0s, k1, k1s, k2, k2s in elm
388
388
389
389
if abs(ds) < minlen then
@@ -396,15 +396,16 @@ local function track_rbend (elm, m)
396
396
m.eld = ds
397
397
m.elc = arc2cord(ds, angle)
398
398
399
- if e1 and e2 then -- Will require m.ptcmodel
400
- m.e1, m.e2 = e1, e2
399
+ if not ptcmodel and e1 and e2
400
+ or ptcmodel and (e1==0 and e2==0 or e1~=0 and e2~=0) then
401
+ m.e1, m.e2 = e1+angle/2, e2+angle/2
401
402
m.el = m.elc
402
- else -- True parallel situation
403
- if e1 then -- Will require m.ptcmodel
403
+ else -- True parallel
404
+ if not ptcmodel and e1 or ptcmodel and e2==0 then
404
405
m.e1, m.e2, m.etp_dir = e1, angle - e1, -1
405
406
m.el = m.elc * cos(angle/2 - e1)
406
407
else
407
- m.e1, m.e2, m.etp_dir = angle - e2, e2, 1 -- edge true parallel dir decides when patch is performed .
408
+ m.e1, m.e2, m.etp_dir = angle - e2, e2, ptcmodel and -1 or 1 -- dir -> patch side .
408
409
m.el = m.elc * cos(angle/2 - e2)
409
410
end
410
411
m.mang = m.e2
@@ -424,7 +425,7 @@ local function track_rbend (elm, m)
424
425
425
426
if model == 'DKD' then
426
427
inter, thick, kick = DKD[method], strex_drift, strex_kick
427
- elseif m.nmul == 1 and ksl[1] == 0 then
428
+ elseif m.nmul == 1 and ksl[1] == 0 and not ptcmodel then
428
429
inter, thick, kick = thickonly , rbend_thick , fnil
429
430
else
430
431
inter, thick, kick = TKT[method], rbend_thick, rbend_kick
438
439
local function track_quadrupole (elm, m)
439
440
get_mult(elm, m, 2)
440
441
441
- local ds, edir, tdir, nmul, knl, ksl in m
442
+ local ds, edir, tdir, nmul, knl, ksl, ptcmodel in m
442
443
local angle, k0, k0s, k1, k1s in elm
443
444
local l = abs(ds)
444
445
@@ -457,22 +458,22 @@ local function track_quadrupole (elm, m)
457
458
local no_k1 = abs(knl[2]) < minstr
458
459
local no_k1s = abs(ksl[2]) < minstr
459
460
local no_ang = abs(angle) < minang
460
- local no_tlt = m. ptcmodel and not no_k1s and (abs(knl[1]) > minstr or nmul > 2 or elm.fringe > 0)
461
- local inter = m. ptcmodel and KMK[method] or TKT[method]
461
+ local no_tlt = ptcmodel and not no_k1s and (abs(knl[1]) > minstr or nmul > 2 or elm.fringe > 0)
462
+ local inter = ptcmodel and KMK[method] or TKT[method]
462
463
local thick, kick
463
464
464
465
if model == 'DKD' or no_k1 and no_k1s and no_ang then
465
466
inter, thick, kick = DKD[method], strex_drift, strex_kick
466
467
elseif no_k1s and no_ang or no_tlt then -- normal thick
467
468
m.k1 = knl[2]/ds*edir
468
- thick, kick = quad_thick, m. ptcmodel and quad_kick or quad_kick_ysh
469
+ thick, kick = quad_thick, ptcmodel and quad_kick or quad_kick_ysh
469
470
elseif no_ang then -- skew thick
470
471
local a = -0.5*atan2(ksl[2], knl[2])
471
472
m.k1, m.ca, m.sa = sqrt(knl[2]^2 + ksl[2]^2)/ds*edir, cos(a), sin(a)
472
- thick, kick = quad_thicks, m. ptcmodel and quad_kicks or quad_kicks_ysh
473
+ thick, kick = quad_thicks, ptcmodel and quad_kicks or quad_kicks_ysh
473
474
else -- combined thick -- unchecked
474
475
m.eh = angle/ds*tdir
475
- thick, kick = quad_thickh, m. ptcmodel and quad_kickh or quad_kickh_ysh
476
+ thick, kick = quad_thickh, ptcmodel and quad_kickh or quad_kickh_ysh
476
477
end
477
478
478
479
local track = #elm == 0 and trackelm or tracksub
0 commit comments