Skip to content

Commit

Permalink
Merge pull request #737 from tpersson/tiltedSolenoid
Browse files Browse the repository at this point in the history
Tilted solenoid
  • Loading branch information
tpersson committed Apr 2, 2019
2 parents 3160181 + 86c53b0 commit 7cfd60b
Show file tree
Hide file tree
Showing 2 changed files with 116 additions and 52 deletions.
3 changes: 3 additions & 0 deletions src/mad_dict.c
Original file line number Diff line number Diff line change
Expand Up @@ -1786,6 +1786,7 @@ const char *const_element_def =
"ksl = [r, {0}], "
"slice = [i, 1], "
"thick = [l, false, true], " /*hbu */

"apertype = [s, circle, circle], "
"aperture = [r, {0}], "
"aper_offset = [r, {0}], "
Expand All @@ -1797,6 +1798,8 @@ const char *const_element_def =
"v_pos = [r, 0], "
"model = [i, -1], "
"method = [i, -1], "
"xtilt = [r, 0], "
"rot_start = [r, 0], "
"exact = [i, -1, 1], "
"nst = [i, -1], "
"from = [s, none], "
Expand Down
165 changes: 113 additions & 52 deletions src/twiss.f90
Original file line number Diff line number Diff line change
Expand Up @@ -1776,7 +1776,7 @@ subroutine track_one_element(el, fexit, contrib_rms)

n_align = node_al_errors(al_errors)
if (n_align .ne. 0) then
!print*, "coupl1: Element = ", el_name
!print*, "coupl1: Element = "
ele_body = .false.
orbit2 = orbit
call tmali1(orbit2,al_errors,beta,gamma,orbit,re)
Expand Down Expand Up @@ -5560,6 +5560,7 @@ end SUBROUTINE tmsol
SUBROUTINE tmsol0(fsec,ftrk,orbit,fmap,el,ek,re,te)
use twissbeamfi, only : deltap, beta, gamma, dtbyds
use math_constfi, only : zero, one, two, three, six
use matrices, only : EYE
implicit none
!----------------------------------------------------------------------*
! Purpose: *
Expand All @@ -5578,21 +5579,36 @@ SUBROUTINE tmsol0(fsec,ftrk,orbit,fmap,el,ek,re,te)
!----------------------------------------------------------------------*
logical :: fsec, ftrk, fmap
double precision :: el
double precision :: orbit(6), ek(6), re(6,6), te(6,6,6)

double precision :: orbit(6), ek(6), re(6,6), ek_t1(6), ek_t2(6), re_t1(6,6)
double precision :: re_t2(6,6), te(6,6,6), te_t1(6,6,6), ek2(6)
double precision :: ek_s(6), re_s(6,6), te_s(6,6,6)
logical :: cplxy
double precision :: sks, sk, skl, bvk
double precision :: co, si, sibk, temp
double precision :: sks, sk, skl, bvk, pxbeta, beta0, startrot
double precision :: co, si, sibk, temp, xtilt,xtilt_rad, dl

double precision, external :: node_value
double precision, external :: node_value, get_value
double precision, parameter :: ten5m=1d-5

beta0 = get_value('probe ','beta ')

!---- Initialize.
fmap = el .ne. zero
if (.not. fmap) return

EK = zero
RE = EYE
ek_s = zero
re_s = EYE
!---- Strength.
sks = node_value('ks ')
xtilt_rad = node_value('xtilt ')
startrot =node_value('rot_start ')

re_t1 = EYE
re_t2 = EYE
ek_t1 = zero
ek_t2 = zero
te_s = zero

if (sks .ne. zero) cplxy = .true.

!---- BV flag
Expand All @@ -5611,62 +5627,106 @@ SUBROUTINE tmsol0(fsec,ftrk,orbit,fmap,el,ek,re,te)
endif

!---- First-order terms.
re(1,1) = co**2
re(2,2) = re(1,1)
re(3,3) = re(1,1)
re(4,4) = re(1,1)

re(1,2) = co * sibk
re(3,4) = re(1,2)
re(1,3) = co * si
re(2,4) = re(1,3)
re(3,1) = - re(1,3)
re(4,2) = re(3,1)
re(2,1) = sk * re(3,1)
re(4,3) = re(2,1)
re(1,4) = si * sibk
re(3,2) = - re(1,4)
re(4,1) = sk * si**2
re(2,3) = - re(4,1)
re(5,6) = el/(beta*gamma)**2

ek(5) = el*dtbyds
re_s(1,1) = co**2
re_s(2,2) = re_s(1,1)
re_s(3,3) = re_s(1,1)
re_s(4,4) = re_s(1,1)

re_s(1,2) = co * sibk
re_s(3,4) = re_s(1,2)
re_s(1,3) = co * si
re_s(2,4) = re_s(1,3)
re_s(3,1) = - re_s(1,3)
re_s(4,2) = re_s(3,1)
re_s(2,1) = sk * re_s(3,1)
re_s(4,3) = re_s(2,1)
re_s(1,4) = si * sibk
re_s(3,2) = - re_s(1,4)
re_s(4,1) = sk * si**2
re_s(2,3) = - re_s(4,1)
re_s(5,6) = el/(beta*gamma)**2

ek_s(5) = el*dtbyds

!---- Second-order terms.
if (fsec) then
temp = el * co * si / beta
te(1,4,6) = - temp
te(3,2,6) = temp
te(1,1,6) = temp * sk
te(2,2,6) = temp * sk
te(3,3,6) = temp * sk
te(4,4,6) = temp * sk
te(2,3,6) = temp * sk**2
te(4,1,6) = - temp * sk**2
te_s(1,4,6) = - temp
te_s(3,2,6) = temp
te_s(1,1,6) = temp * sk
te_s(2,2,6) = temp * sk
te_s(3,3,6) = temp * sk
te_s(4,4,6) = temp * sk
te_s(2,3,6) = temp * sk**2
te_s(4,1,6) = - temp * sk**2

temp = el * (co**2 - si**2) / (two * beta)
te(1,2,6) = - temp
te(3,4,6) = - temp
te(1,3,6) = - temp * sk
te(2,4,6) = - temp * sk
te(3,1,6) = temp * sk
te(4,2,6) = temp * sk
te(2,1,6) = temp * sk**2
te(4,3,6) = temp * sk**2
te_s(1,2,6) = - temp
te_s(3,4,6) = - temp
te_s(1,3,6) = - temp * sk
te_s(2,4,6) = - temp * sk
te_s(3,1,6) = temp * sk
te_s(4,2,6) = temp * sk
te_s(2,1,6) = temp * sk**2
te_s(4,3,6) = temp * sk**2

temp = el / (two * beta)
te(5,2,2) = - temp
te(5,4,4) = - temp
te(5,1,4) = temp * sk
te(5,2,3) = - temp * sk
te(5,1,1) = - temp * sk**2
te(5,3,3) = - temp * sk**2
te(5,6,6) = - three * re(5,6) / (two * beta)
call tmsymm(te)
te_s(5,2,2) = - temp
te_s(5,4,4) = - temp
te_s(5,1,4) = temp * sk
te_s(5,2,3) = - temp * sk
te_s(5,1,1) = - temp * sk**2
te_s(5,3,3) = - temp * sk**2
te_s(5,6,6) = - three * re_s(5,6) / (two * beta)
call tmsymm(te_s)
endif


!---- Track orbit.
if (ftrk) call tmtrak(ek,re,te,orbit,orbit)

if (ftrk) then

if(abs(xtilt_rad) > ten5m) then
te_t1 = zero
xtilt = -sin(xtilt_rad)

pxbeta = xtilt*startrot/beta
ek_t1(1) = startrot*xtilt
ek_t1(2) = xtilt
ek_t1(5) = -0.5d0*pxbeta*xtilt
re_t1(1,6) = -pxbeta
re_t1(5,2) = -pxbeta
call tmtrak(ek_t1,re_t1,te_t1,orbit,orbit)
call tmcat(.true.,re_t1,te_t1,re,te,re,te)


call tmtrak(ek_s,re_s,te_s,orbit,orbit) ! Calls the normal solenoid
call tmcat(.true.,re_s,te_s,re,te,re,te)

!To tilt it back
xtilt=-xtilt
pxbeta = xtilt*(el+startrot)/beta
ek_t2(1) = (el+startrot)*xtilt
ek_t2(2) = xtilt
ek_t2(5) = -0.5d0*pxbeta*xtilt
re_t2(1,6) = -pxbeta
re_t2(5,2) = -pxbeta

call tmtrak(ek_t2,re_t2,te_t1 ,orbit,orbit)
call tmcat(.true.,re_t2,te_t1,re,te,re,te)

else
ek=ek_s
re=re_s
te=te_s
call tmtrak(ek,re,te,orbit,orbit)
endif
else
ek=ek_s
re=re_s
te=te_s
endif


end SUBROUTINE tmsol0

Expand Down Expand Up @@ -6426,6 +6486,7 @@ SUBROUTINE tmali1(orb1, errors, beta, gamma, orb2, rm)
orb2(5) = orbt(5) - s2 / beta
orb2(6) = orbt(6)


end SUBROUTINE tmali1

SUBROUTINE tmali2(el, orb1, errors, beta, gamma, orb2, rm)
Expand Down

0 comments on commit 7cfd60b

Please sign in to comment.