subroutine floor_plan(lat) use bmad use ramp_parameters implicit none type(lat_struct), target :: lat type (ele_struct) ele type (branch_struct), pointer :: branch integer nbranch integer i, j, ix, ix_bend/2/,ix_quad/3/,ix_sept/4/, ix_hkicker/5/,ix_vkicker/6/ integer lun(6) real(rp) r(1:3),r0(1:3),v(1:3),v_perp(1:3), v_perp_last(1:3) real(rp) vmag ! real w(1:10)/0,1.,1.5,1.5,1.4,1.4,4*0./ real w(1:10)/0,0.1,0.15,0.15,6*0.15/ character*(20) name(6)/'reference.dat','bends.dat','quadrupoles.dat','septum.dat','hkicker.dat','vkicker.dat'/ do i=1,6 lun(i) = lunget() open (unit = lun(i), file = trim(directory)//'/'//name(i)) end do do nbranch=0,1 write(lun(1),'(/,a1,a10,i10,/)')'#',' branch = ',nbranch branch => lat%branch(nbranch) do j= 1, branch%n_ele_track ele = branch%ele(j) if(nbranch==1)print '(a16,1x,i10,1x,es12.4)',ele%name,ele%key,ele%value(l$) r = [ele%floor%r(1), ele%floor%r(2), ele%floor%r(3)] !vector pointing to end of element write(lun(1),'(1x,a16,7es15.7)')ele%name, ele%s, r, ele%floor%theta,ele%floor%phi,ele%floor%psi r0 = [branch%ele(j-1)%floor%r(1), branch%ele(j-1)%floor%r(2), branch%ele(j-1)%floor%r(3)] !vector pointing to start of element v = r-r0 !vector pointing from start to end of element vmag = sqrt(dot_product(v,v)) if(vmag == 0.)then !if element has zero length v_perp=v_perp_last else v_perp = ([v(3),v(2),-v(1)])/vmag !vector perpendicular to end of element in xz plane v_perp_last = v_perp endif ix=0 if(ele%key == sbend$ .or. ele%key == rbend$)ix=ix_bend if(ele%key == quadrupole$) ix=ix_quad if(ele%key == hkicker$) ix=ix_hkicker if(ele%key == vkicker$) ix=ix_vkicker if(index(ele%name,'SEPT')/= 0) ix=ix_sept if(ele%name == 'MAGSEPT1') ix=ix_sept if(ix /= 0)then write(lun(ix),'(/,a1,a10,i10,1x,a16,/)')'#',' element=',j,ele%name write(lun(ix),'(/,a3,3es12.4,i10,es12.4,1x,a16,/)')'999', r-v_perp*w(ix),j,ele%s-ele%value(l$)/2,ele%name write(lun(ix),'(/,a1,a10,i10,1x,a16,/)')'#',' element=',j,ele%name write(lun(ix),'(3es12.4)') r0 + v_perp *w(ix) write(lun(ix),'(3es12.4)') r0 - v_perp *w(ix) write(lun(ix),'(3es12.4)') r - v_perp * w(ix) write(lun(ix),'(3es12.4)') r + v_perp * w(ix) write(lun(ix),'(3es12.4)') r0 + v_perp *w(ix) endif end do !loop over elements end do !loop over branches do i=1,4 close(unit=lun(i)) end do return end