subroutine ecloud_ele(start_orb,ele,end_orb) use bmad use ecloud_mod use ecloud_interface use nr implicit none type (coord_struct) :: start_orb type (coord_struct) :: end_orb type (ele_struct) :: ele type (ecloud_bunch_struct), allocatable, save ::ecloud_bunch(:) real(rp) t_center_bunch/0.228885/ real(rp) x,y,z,t real(rp) times(11), Ex(11), Ey(11), dEx(11), dEy(11), Exx, Eyy, dExx, dEyy real(rp) x1a(-9:17), x2a(-9:17),ya(-9:17,-9:17) real(rp) Energy, Length, dpx, dpy real(rp) factor/5.7e-12/ integer bunch, spacing logical first_time/.true./ integer, save :: nx,ny integer j,i integer nzero/0/ if(first_time)then call read_beamfield(ecloud_bunch, ele, spacing) nx=ecloud_bunch(1)%nsteps_x+nzero ny=ecloud_bunch(1)%nsteps_y+nzero first_time=.false. if(test)stop endif end_orb = start_orb bunch = ele%value(bunch$) energy = ele%value(e_tot$) length = ele%value(length_eff$) times(1:11) = ecloud_bunch(bunch)%slice(1:11)%time t_center_bunch = ecloud_bunch(bunch)%slice(6)%time ! subtract this time from slice maps to align with particle times in bunch x= start_orb%vec(1) + ecloud_bunch(1)%x_offset y= start_orb%vec(3) + ecloud_bunch(1)%y_offset z=start_orb%vec(5) t = z/c_light * 1.e9 +t_center_bunch ! time in ns ! which slices ? ! between slices ilow and ihigh !print '(a,4es12.4)',' Interpolate next: x,y,z,t ',x,y,z,t !print '(a,es12.4)',' Reference: t_center_bunch ', t_center_bunch Ex(1:11) = 0. Ey(1:11) = 0. do i=1,11 if(x < ecloud_bunch(bunch)%slice(i)%x(-(nzero-1)) .or. x > ecloud_bunch(bunch)%slice(i)%x(nx) .or. & y < ecloud_bunch(bunch)%slice(i)%y(-(nzero-1)) .or. y > ecloud_bunch(bunch)%slice(i)%y(ny))exit x1a(-(nzero-1):nx) = ecloud_bunch(bunch)%slice(i)%x(-(nzero-1):nx) x2a(-(nzero-1):ny) = ecloud_bunch(bunch)%slice(i)%y(-(nzero-1):ny) ya(-(nzero-1):nx,-(nzero-1):ny) = ecloud_bunch(bunch)%slice(i)%Ex(-(nzero-1):nx,-(nzero-1):ny) call polin2(x1a(-(nzero-1):nx),x2a(-(nzero-1):ny),ya(-(nzero-1):nx,-(nzero-1):ny),x,y,Ex(i),dEx(i)) ya(-(nzero-1):nx,-(nzero-1):ny) = ecloud_bunch(bunch)%slice(i)%Ey(-(nzero-1):nx,-(nzero-1):ny) call polin2(x1a(-(nzero-1):nx),x2a(-(nzero-1):ny),ya(-(nzero-1):nx,-(nzero-1):ny),x,y,Ey(i),dEy(i)) end do !print '(a,11es12.4)','times:',times !write(16, '(a,2es12.4,11es12.4)')'x,y,Ey', x,y, Ey(1:11) !print '(a,es12.4)','time = ',t call polint(times(1:11), Ex(1:11), t, Exx, dExx) call polint(times(1:11), Ey(1:11), t, Eyy, dEyy) !print '(a,2es12.4)','Exx,Eyy ',Exx,Eyy dpx=(Exx*factor)*Length/Energy dpy =(Eyy*factor)*Length/Energy !print '(a,2es12.4)','dpx,dpy ',dpx,dpy !write(14,'(6es12.4,1x,2es12.4)')start_orb%vec,Exx*factor,Eyy*factor end_orb%vec(2) = start_orb%vec(2) + dpx end_orb%vec(4) = start_orb%vec(4) + dpy return end subroutine read_beamfield(ecloud_bunch, ele, spacing) use bmad use ecloud_mod implicit none type (ele_struct) :: ele type (ecloud_bunch_struct), allocatable::ecloud_bunch(:) integer number_bunches real(rp) x_offset,y_offset, xhalf, yhalf, xstep, ystep, beam_sigmax, beam_sigmay real(rp) x,y,Ex,Ey integer spacing, nbins, nsteps_x, nsteps_y integer lun integer i, j integer k integer l integer ix,iy integer nb, slice integer jx, jy integer nzeros/0/ character*120 string, word lun=lunget() print '(2a)',' READ_BEAMFIELD: ele%alias = ', ele%alias open(unit=lun,file= ele%alias) ! read(lun,'(a)')string ! call string_trim(string,word,ix) ! read(word(1:ix),'(i2)')number_bunches read(lun,*)number_bunches,x_offset,y_offset, nbins, xhalf, yhalf, beam_sigmax, beam_sigmay xstep = xhalf/nbins ystep = yhalf/nbins allocate(ecloud_bunch(number_bunches)) ecloud_bunch(1)%number_bunches = number_bunches ecloud_bunch(1)%x_offset = x_offset ecloud_bunch(1)%y_offset = y_offset ecloud_bunch(1)%nbins = nbins ecloud_bunch(1)%xhalf = xhalf ecloud_bunch(1)%yhalf = yhalf ecloud_bunch(1)%xstep = xstep ecloud_bunch(1)%ystep = ystep nsteps_x = 2*nbins+1 nsteps_y = 2*nbins+1 ecloud_bunch(1)%nsteps_x = nsteps_x ecloud_bunch(1)%nsteps_y = nsteps_y print '(a,i3)',' Number bunches = ',number_bunches print '(a,i3,a,i3)','nsteps_x = ',nsteps_x,' nsteps_y=',nsteps_y print '(a,$)',' which bunch ?' read(5, *) nb ! print '(a,$)',' which slice (9-99) ?' ! read(5, *) slice print '(a,i3,a)',' Write data for bunch ',nb,' to unit 15' do i=1,number_bunches do k=1,11 read(lun,*)ecloud_bunch(i)%slice(k)%bunch,ecloud_bunch(i)%slice(k)%time_slice,ecloud_bunch(i)%slice(k)%time,ecloud_bunch(i)%slice(k)%charge_weight(1:2) ! print '(4i10,3es12.4)',i,k,ecloud_bunch(i)%slice(k)%bunch,ecloud_bunch(i)%slice(k)%time_slice, ecloud_bunch(i)%slice(k)%time, ecloud_bunch(i)%slice(k)%charge_weight(1:2) ! if(slice/9 == k .and. i == nb)write(11,'(a,i3,a,i3,a,es16.10)')'bunch=',nb,' slice=',slice,' time=',ecloud_bunch(i)%slice(k)%time if(i == nb)write(15,'(/,a,a,1x,i10,1x,a,1x,i10,/)')'#', 'bunch =',nb,' slice =',k do ix=1,nsteps_x do iy=1,nsteps_y read(lun,*)x,y,Ex,Ey ecloud_bunch(i)%slice(k)%x(ix) = x ecloud_bunch(i)%slice(k)%y(iy) = y ecloud_bunch(i)%slice(k)%Ex(ix,iy) = Ex ecloud_bunch(i)%slice(k)%Ey(ix,iy) = Ey if(nb == i)write(26, '(2i10,4es12.4)')ix,iy, ecloud_bunch(i)%slice(k)%x(ix),ecloud_bunch(i)%slice(k)%y(iy),ecloud_bunch(i)%slice(k)%Ex(ix,iy),ecloud_bunch(i)%slice(k)%Ey(ix,iy) ! if(i == nb .and. k == slice/9)write(11,'(4es12.4)') ecloud_bunch(i)%slice(k)%x(ix),ecloud_bunch(i)%slice(k)%y(iy),ecloud_bunch(i)%slice(k)%Ex(ix,iy),ecloud_bunch(i)%slice(k)%Ey(ix,iy) end do end do if(nzeros /= 0)then do l=1,nzeros ecloud_bunch(i)%slice(k)%x(1-l) = ecloud_bunch(i)%slice(k)%x(1) -l*xstep ecloud_bunch(i)%slice(k)%y(1-l) = ecloud_bunch(i)%slice(k)%y(1) - l * ystep ecloud_bunch(i)%slice(k)%x(nsteps_x+l) = ecloud_bunch(i)%slice(k)%x(nsteps_x) + l * xstep ecloud_bunch(i)%slice(k)%y(nsteps_y+l) = ecloud_bunch(i)%slice(k)%y(nsteps_y) + l * ystep end do ecloud_bunch(i)%slice(k)%Ex(-nzeros+1:0,-(nzeros-1):nsteps_y+nzeros) = 0 ecloud_bunch(i)%slice(k)%Ex(nsteps_x+1:nsteps_x+nzeros,-(nzeros-1):nsteps_y+nzeros) = 0 ecloud_bunch(i)%slice(k)%Ey(-(nzeros-1):0,-(nzeros-1):nsteps_y+nzeros) = 0 ecloud_bunch(i)%slice(k)%Ey(nsteps_x+1:nsteps_x+nzeros,-(nzeros-1):nsteps_y+nzeros) = 0 ecloud_bunch(i)%slice(k)%Ex(-(nzeros-1):nsteps_x+nzeros,-(nzeros-1):0) = 0 ecloud_bunch(i)%slice(k)%Ex(-(nzeros-1):nsteps_x+nzeros,nsteps_y+1:nsteps_y+nzeros) = 0 ecloud_bunch(i)%slice(k)%Ey(-(nzeros-1):nsteps_x+nzeros,-(nzeros-1):0) = 0 ecloud_bunch(i)%slice(k)%Ey(-(nzeros-1):nsteps_x+nzeros,nsteps_y+1:nsteps_y+nzeros) = 0 endif if(i == nb)then do jx=-(nzeros-1),nsteps_x+nzeros do jy = -(nzeros-1),nsteps_y+nzeros write(15,'(2i10,1x,4es12.4)')jx,jy, ecloud_bunch(i)%slice(k)%x(jx), ecloud_bunch(i)%slice(k)%y(jy), & ecloud_bunch(i)%slice(k)%Ex(jx,jy),ecloud_bunch(i)%slice(k)%Ey(jx,jy) end do end do endif end do end do spacing=14 return end