! compute trajectory through injection line to inflector exit ! Compute trajectory from inflector exit and once around the ring, with the kicker field on. ! Compute transfer matrix for the trajectory ! Propagate closed ring twiss values backwards to inflector exit ! subroutine MatchToRing(lat,initial_offsets,kicker_params,twiss_match) use bmad use muon_mod use parameters_bmad use muon_interface, dummy => MatchToRing implicit none type(lat_struct), target:: lat type(kicker_params_struct) kicker_params type (g2twiss_struct) twiss_match type (coord_struct), allocatable :: co(:), to_orbit(:) type (initial_offsets_struct) initial_offsets type (branch_struct), pointer :: branch, branch_save ! ring real(rp) mat(6,6),m(6,6), mat_transpose(6,6), m_inv(2,2) real(rp) temp(6,6), twiss_ring(4,4), twiss_inf(4,4) real(rp) det real(rp) eta_vec(2), eta_vec_in(2), t_vec(2) integer i, inj_branch/0/, ring_branch/1/ integer j integer track_state integer lun logical err_flag call reallocate_coord (co, lat%branch(0)%n_ele_max) call reallocate_coord (to_orbit, lat%branch(1)%n_ele_max) branch => lat%branch(ring_branch) branch_save => lat%branch(ring_branch) co(0)%vec = 0 co(0)%t = initial_offsets%tmean co(0)%s = 0 co(0)%vec(1) = initial_offsets%x_mean co(0)%vec(2) = initial_offsets%pxmean co(0)%vec(3) = initial_offsets%y_mean co(0)%vec(4) = initial_offsets%pymean co(0)%vec(5) = initial_offsets%tmean co(0)%vec(6) = initial_offsets%pzmean ! track through injection line to inflector exit call track_all(lat,co, ix_branch = inj_branch, track_state = track_state, err_flag = err_flag) !compute trajectory through injection line to_orbit(0) = co(lat%branch(0)%n_ele_track) call set_kicker_params (lat, kicker_params) ! track from inflector exit once around ring including kicker field ! turn off apertures to no scattering forall( i=1:branch%n_ele_max) branch%ele(i)%aperture_at = exit_end$ call track_all(lat,to_orbit, ix_branch = ring_branch, track_state = track_state, err_flag = err_flag) !compute trajectory around ring ! restore apertures forall( i=1:branch%n_ele_max) branch%ele(i)%aperture_at = branch_save%ele(i)%aperture_at if(err_flag) then print '(a)',' Particle lost in first turn orbit in MatchToRing' return endif lun = lunget() open(unit=lun, file = trim(directory)//'/'//'MatchInfToRing.dat') write(lun,'(/,a1,a10,1x,a12,1x,6a12,/)')'#','Element','s','x','xp','y','yp','l','pz' do i=1,branch%n_ele_track write(lun, '(i10,1x,es12.4,1x,6es12.4)')i,branch%ele(i)%s,to_orbit(i)%vec end do ! create transfer matrices for elements in first turn call lat_make_mat6(lat, -1, to_orbit, ix_branch=ring_branch) ! multipy matrices from inflector exit through kickers around ring temp = 0. forall(i=1:6)temp(i,i) = 1. do i = 1, branch%n_ele_track mat = matmul(branch%ele(i)%mat6, temp) temp= mat end do ! find transpose do i=1,6 do j=1,6 mat_transpose(i,j) = mat(j,i) end do end do twiss_ring = 0. ! transfer twiss parameters for closed ring to 2x2 matrices twiss_ring(1,2) = branch%ele(branch%n_ele_track)%a%alpha twiss_ring(2,1) = branch%ele(branch%n_ele_track)%a%alpha twiss_ring(2,2) = branch%ele(branch%n_ele_track)%a%beta twiss_ring(1,1) = (1.+twiss_ring(1,2)**2)/twiss_ring(2,2) twiss_ring(3,4) = branch%ele(branch%n_ele_track)%b%alpha twiss_ring(4,3) = branch%ele(branch%n_ele_track)%b%alpha twiss_ring(4,4) = branch%ele(branch%n_ele_track)%b%beta twiss_ring(3,3) = (1.+twiss_ring(3,4)**2)/twiss_ring(4,4) ! Twiss parameters at inflector exit that match to ring are twiss-inf where (twiss-inf = mat_transpose * twiss_ring * mat) temp(1:4,1:4) = matmul(mat_transpose(1:4,1:4),twiss_ring) twiss_inf = matmul(temp(1:4,1:4),mat(1:4,1:4)) ! dispersion at inflector to match to ring eta-inf = mat_inv(eta-ring-t_vec) eta_vec(1) = branch%ele(branch%n_ele_track)%x%eta eta_vec(2) = branch%ele(branch%n_ele_track)%x%etap t_vec(1) = mat(1,6) t_vec(2) = mat(2,6) det = mat(1,1)*mat(2,2)-mat(1,2)*mat(2,1) m_inv(1,1) = mat(2,2)/det m_inv(1,2) = -mat(1,2)/det m_inv(2,1) = -mat(2,1)/det m_inv(2,2) = mat(1,1)/det eta_vec_in = matmul(m_inv,eta_vec-t_vec) ! transfer twiss_inf from 2x2 matrices to g2_twiss structure twiss_match%betax = twiss_inf(2,2) twiss_match%alphax = twiss_inf(1,2) twiss_match%betay = twiss_inf(4,4) twiss_match%alphay = twiss_inf(3,4) twiss_match%etax = eta_vec_in(1) twiss_match%etapx = eta_vec_in(2) print '(/,a)',' Twiss parameters at inflector exit that match into ring' print '(6(a11,es12.4))', ' beta_x = ',twiss_match%betax, ' beta_y = ', twiss_match%betay, ' alpha_x = ',twiss_match%alphax, ' alpha_y = ',twiss_match%alphay, & ' eta = ',twiss_match%etax, ' etap = ',twiss_match%etapx write(lun, '(/,a)')'# Twiss parameters at inflector exit: ' write(lun, '(6(a11,es12.4))') '# beta_x = ',twiss_match%betax, ' beta_y = ', twiss_match%betay, ' alpha_x = ',twiss_match%alphax, ' alpha_y = ',twiss_match%alphay, & ' eta = ',twiss_match%etax, ' etap = ',twiss_match%etapx write(lun, '(/,a)')' match to twiss parameters for closed ring at end of first turn: ' write(lun, '(6(a11,es12.4))') '# beta_x = ',twiss_ring(2,2), ' beta_y = ', twiss_ring(4,4), ' alpha_x = ',twiss_ring(1,2), ' alpha_y = ',twiss_ring(3,4), & ' eta = ',eta_vec(1), ' etap = ', eta_vec(2) branch%ele(0)%a%beta = twiss_match%betax branch%ele(0)%a%alpha = twiss_match%alphax branch%ele(0)%b%beta = twiss_match%betay branch%ele(0)%b%alpha = twiss_match%alphay branch%ele(0)%x%eta = twiss_match%etax branch%ele(0)%x%etap = twiss_match%etapx call twiss_propagate_all(lat, ix_branch=ring_branch) write(lun,'(/,a10,1x,a12,1x,6a12,/)')'# Element','s','betax','betay','alphax','alphay','etax','etapx' do i=1,branch%n_ele_track write(lun, '(i10,1x,es12.4,1x,6es12.4)')i,branch%ele(i)%s,branch%ele(i)%a%beta,branch%ele(i)%b%beta,branch%ele(i)%a%alpha,branch%ele(i)%b%alpha, & branch%ele(i)%x%eta,branch%ele(i)%x%etap end do close(unit=lun) return end