subroutine step_floor_around_ring(lat,j, nbranch, co_start, vec_init, s_start) use bmad implicit none type (lat_struct) lat type (coord_struct), save :: orb_at_s type (coord_struct) co_start ! type (coord_struct), allocatable :: co(:) type (ele_struct), save::ele_at_s type (ele_struct) ele_end, ele_start type xvec_struct real(rp) vec(2) end type type (xvec_struct) x_in(200),x_out(200) real(rp) s_end, vec_init(3), x(2), vec(2),l,s,xperp(2)/0.,1./, r(3) ! real(rp) ele_s(4)/0.,0.5,1.,0.25/ real(rp) ele_s(4)/0.,0.5,0.85,0.25/ real(rp) offset/0./, a/10./ real(rp) s_start integer, parameter :: quad_ele$=2 integer, parameter :: kicker_ele$=3 integer, parameter :: inf_ele$=4 integer j, nbranch, i,k integer, save :: lun(6) integer ix_element logical first/.true./, injection_channel/.true./ logical err character*25 filename(6) /'floor.dat','QUAD_elements.dat','KICKER_elements.dat', 'INFLECTOR_elements.dat','end_of_turn.dat','decay_positrons.dat'/ real(rp), save :: s0 real(rp) Q(3), Rot(3,3), x_arrow_start(2)/0.,0./, x_arrow_delta(2)/1.,0./ if(first)then do i=1,6 lun(i) = lunget() open(unit = lun(i), file = filename(i), status='REPLACE') end do write(lun(1),'(1x,a13,10a15)')'Element','s','x','y','z','theta','phi','psi','vec(1)', 'x_arrow_start','x_arrow_delta' ! write(lun(1),'(1x,a13,13es15.7)')lat%branch(0)%ele(0)%name, lat%branch(0)%ele(0)%s, & ! lat%branch(0)%ele(0)%floor%r, lat%branch(0)%ele(0)%floor%theta,lat%branch(0)%ele(0)%floor%phi,lat%branch(0)%ele(0)%floor%psi, co(0)%vec(1)*xperp, & ! x_arrow_start, x_arrow_delta do i=1,6 close(unit=lun(i)) end do s0=0. first=.false. endif open(unit = lun(1), file= filename(1), access='append') open(unit = lun(5), file= filename(5), access='append') open(unit = lun(6), file= filename(6), access='append') ! do i=1,6 ! print '(i10,1x,a)',lun(i), filename(i) ! enddo if(index(lat%branch(nbranch)%ele(j)%name,'INJ_TO_RING')/= 0)offset = lat%branch(nbranch)%ele(j)%value(x_offset$)*a i=0 ! s= 1. ele_start = lat%branch(nbranch)%ele(j-1) if(s_start > 0)ele_start = lat%branch(nbranch)%ele(j) ele_start%floor%r=vec_init ix_element=0 if(index(lat%branch(nbranch)%ele(j)%name,'QUAD')/= 0)ix_element = quad_ele$ if(index(lat%branch(nbranch)%ele(j)%name,'KICKER')/= 0)ix_element = kicker_ele$ if(index(lat%branch(nbranch)%ele(j)%name,'INF')/= 0)ix_element = inf_ele$ s_end = co_start%s + 0.05 do while(s_end < lat%branch(nbranch)%ele(j)%s +0.0495 .and. lat%branch(nbranch)%ele(j)%s > 0) !the 0.05 is to make sure we overlap the very end if(s_end > lat%branch(nbranch)%ele(j)%s - 0.025) s_end = lat%branch(nbranch)%ele(j)%s-0.0001 !track to the very end vec = [ele_at_s%floor%r(1),ele_at_s%floor%r(3)] ! call twiss_and_track_at_s(lat, s_end, ele_at_s=ele_at_s, orb=co_start,orb_at_s = orb_at_s, ix_branch = nbranch,compute_floor_coords=.true.) call twiss_and_track_from_s_to_s(lat%branch(nbranch), co_start,s_end,orb_at_s, ele_start = ele_start, ele_end = ele_at_s, err = err, compute_floor_coords = .true.) r = [ele_at_s%floor%r(1)+offset, ele_at_s%floor%r(2), ele_at_s%floor%r(3)] x = [ele_at_s%floor%r(1),ele_at_s%floor%r(3)] - vec if(x(1) /= 0 .or. x(2) /= 0)then xperp = [x(2),-x(1)] xperp = xperp/sqrt(dot_product(xperp,xperp)) Q = orb_at_s%spin if(Q(1) ==0 .and. Q(2) ==0 .and. Q(3)==0)Q = [0,0,-1] Rot(1:3,1:3)=0 Rot(1,1) = x(2)/sqrt(dot_product(x,x)) Rot(1,3) = x(1)/sqrt(dot_product(x,x)) Rot(2,2)=1 Rot(3,1)=-Rot(1,3) Rot(3,3)= Rot(1,1) Q = matmul(Rot,Q) x_arrow_start = orb_at_s%vec(1)*xperp x_arrow_delta = [Q(1),Q(3)] i=i+1 if(abs(ele_at_s%s-s0) > 0.00001 .and. s_start ==0)write(lun(1),'(1x,a13,13es15.7)')ele_at_s%name, ele_at_s%s, & r, ele_at_s%floor%theta,ele_at_s%floor%phi,ele_at_s%floor%psi, orb_at_s%vec(1)*xperp, & x_arrow_start, x_arrow_delta if(s_start /= 0)write(lun(6),'(1x,a13,13es15.7,es12.4)')ele_at_s%name, ele_at_s%s, & r, ele_at_s%floor%theta,ele_at_s%floor%phi,ele_at_s%floor%psi, orb_at_s%vec(1)*xperp, & x_arrow_start, x_arrow_delta, orb_at_s%vec(6) if(ix_element /= 0)then x_in(i)%vec = ele_s(ix_element)*xperp + [r(1),r(3)] ! [ele_at_s%floor%r(1),ele_at_s%floor%r(3)] ! point to inside x_out(i)%vec = ele_s(ix_element)*[-xperp(1),-xperp(2)] + [r(1), r(3)] ![ele_at_s%floor%r(1),ele_at_s%floor%r(3)] !point to outside endif endif print '(a,1x,i10,1x,7es12.4,7es12.4,1x,3es12.4)',ele_at_s%name,i,co_start%vec,co_start%s,orb_at_s%vec,orb_at_s%s,x,ele_at_s%s-s0 ! co_start = orb_at_s s_end = s_end+0.05 s0 = ele_at_s%s end do print '(2i10,1x,2a,4es12.4)',j,lat%branch(nbranch)%n_ele_track,lat%branch(nbranch)%ele(j)%name,' line 109 - step floor around ring ',orb_at_s%vec(1:4) if(j == lat%branch(nbranch)%n_ele_track .and. s_start ==0)write(lun(5),'(1x,a13,11es15.7)')ele_at_s%name, ele_at_s%s, & r, ele_at_s%floor%theta,ele_at_s%floor%phi,ele_at_s%floor%psi, orb_at_s%vec(1:4) close(unit=lun(1)) close(unit=lun(5)) close(unit=lun(6)) if(ix_element == 0) return lun(ix_element) = lunget() open(unit = lun(ix_element), file = filename(ix_element), access='append') do k=1,i write( lun(ix_element),'(i10,1x,2es12.4)')k,x_in(k) end do do k=i,1,-1 write(lun(ix_element) ,'(i10,1x,2es12.4)')k,x_out(k) end do write(lun(ix_element) ,'(i10,1x,2es12.4)')k, x_in(2) write(lun(ix_element),'(/,a1,/)')'#' close(unit=lun(ix_element)) return end