subroutine rotate_ring(lat,ring_theta) use bmad use bookkeeper_mod implicit none real(rp) ring_theta real(rp) l1, l2, radius integer n_ele type (lat_struct) lat n_ele = lat%n_ele_track-1 if(index(lat%ele(1)%name,'AFREE') == 0 .or. index(lat%ele(n_ele)%name,'FFREE') == 0)then print '(a,a)',' Element 1 = ', lat%ele(1)%name print '(a,1x,i10,1x,a)',' Element',n_ele,' = ', lat%ele(n_ele)%name print *,' Not possible to rotate ring because first and last elements are not both drifts ' stop return endif radius = lat%ele(1)%value(rho$) l1 = lat%ele(1)%value(l$) + ring_theta * radius l2 = lat%ele(n_ele)%value(l$) - ring_theta * radius if(l1 < 0 .or.l2 < 0. )then if(l1<0)print '(a,1x,es12.4,a,1x,es12.4)',' Cannot rotate by', l1,' because length of first is ',lat%ele(1)%value(l$) if(l2<0)print '(a,1x,es12.4,a,1x,es12.4)',' Cannot rotate by', l2,' because length of last element is ',lat%ele(n_ele)%value(l$) stop return endif lat%ele(1)%value(l$) = l1 call set_flags_for_changed_attribute(lat%ele(1),lat%ele(1)%value(l$)) lat%ele(n_ele)%value(l$) = l2 call set_flags_for_changed_attribute(lat%ele(n_ele),lat%ele(n_ele)%value(l$)) call lattice_bookkeeper(lat) print '(a,1x,es12.4,1x,a)',' Ring elements rotated so that kicker is centered at 90+ ',ring_theta*360/twopi,' degrees' print '(a,1x,a,1x,a,es12.4,a)','Length of', trim(lat%ele(1)%name), 'changed by', ring_theta*radius,'m' print '(a,1x,a,1x,a,es12.4,a)','Length of', trim(lat%ele(n_ele)%name), 'changed by', -ring_theta*radius,'m' return end