subroutine osc_pcalc(lat, osc_start, osc_end, osc_kicker, wavelength, co, mode) use bmad use mode3_mod use input_mod use da_interface use da_mod implicit none type (lat_struct) lat type (coord_struct), allocatable :: co(:) type (normal_modes_struct) mode type(ele_struct), pointer :: ele2 type(ele_struct), target :: ele type (osc_param_struct) osc_param character*16, osc_start, osc_end, osc_kicker character*16 wiggler_period_ch, wig_b_ch, ph integer ix_start/0/, ix_end/0/, ix_kick/0/ integer i real(rp) beam_energy, wiggler_period, wig_k, gamma_e real(rp) r_xz real(rp) wavelength real(rp) wig_b ! locate start and end elements and compute matrix from start to end do i=1,lat%n_ele_track if(index(lat%ele(i)%name,osc_start) /= 0)then ix_start = i endif if(index(lat%ele(i)%name,osc_end) /= 0)then ix_end = i endif if(index(osc_kicker(1:10),lat%ele(i)%name(1:10)) /= 0)then ix_kick = i ele = lat%ele(i) ele2 => ele if(ele%slave_status == super_slave$ .or. ele%slave_status == slice_slave$)ele2 =>pointer_to_lord(lat%ele(i),1) endif end do if(ix_start == 0)print *,osc_start,' not found' if(ix_end == 0)print *,osc_end,' not found' if(ix_kick == 0)then print *,'OSC_KICKER',' not found' else print '(a, es12.4,a,es12.4)',' OSC_KICKER: length = ', ele2%value(l$),' Nperiods = ', ele2%value(n_period$) endif beam_energy = lat%ele(ix_kick)%value(e_tot$) if(ix_kick <= 0)then print *, 'OSC_PCALC: OSC_KICKER not found' ! stop endif osc_param%wavelength = wavelength gamma_e = beam_energy / mass_of(positron$) ! wiggler_period = 2.*gamma_e**2/(1+wig_k**2) *osc_param%wavelength !helical undulator ! if(associated(ele2%value(n_pole$)))then if(ix_kick /= 0 .and. ele2%value(n_period$)/= 0)then wiggler_period = ele2%value(n_period$) wig_k = 93.36 *ele2%value(b_max$) * wiggler_period else call read_a_line(' wiggler period ?',wiggler_period_ch) read(wiggler_period_ch,*)wiggler_period call read_a_line(' wiggler peak field ?',wig_b_ch) read(wig_b_ch,*)wig_b wig_k = 93.36*wig_b*wiggler_period endif call read_a_line('planar or helical (p/h) ?',ph) print '(a,es12.4,a,es12.4,a16,a16)', 'wiggler period = ',wiggler_period,' wig_B = ', wig_b,' wiggler type = ', ph if(index(ph, 'p') /= 0)osc_param%wavelength = wiggler_period/2./gamma_e**2 * (1+wig_k**2/2.)!planar undulator if(index(ph,'h') /= 0)osc_param%wavelength = wiggler_period/2./gamma_e**2 * (1+wig_k**2) !helical undulator osc_param%linear=.true. osc_param%t2mat=.true. osc_param%theta2 = .true. osc_param%det = .false. call osc_parameters(lat,ix_start, ix_end, co, osc_param, .true.) r_xz = (osc_param%Tmat(5,6)-osc_param%tilde_m56)/osc_param%tilde_m56 print * print *, 'Optical stochastic cooling insert parameters' print '(2(a,es12.4,10x))',' Beam Energy = ', beam_energy,'gamma_e = ', gamma_e print '(a,4(a,es12.4,10x))',' Wiggler:','B_max = ', lat%ele(ix_kick)%value(b_max$), ' wiggler_period = ', wiggler_period,' K_param = ',wig_k,' Optical wavelength = ',osc_param%wavelength ele = lat%ele(ix_end) print '(a,3es12.4)',' Pickup: beta/alpha/gamma = ', ele%a%beta,ele%a%alpha,ele%a%gamma print '(a,2es12.4)',' kicker: eta/etap = ', lat%ele(ix_end)%x%eta,lat%ele(ix_end)%x%etap ele = lat%ele(ix_end) print '(a,es12.4)',' kicker: Curly H = ', (ele%x%eta**2*ele%a%gamma + ele%a%beta *(ele%x%etap)**2 + 2* ele%a%alpha*ele%x%etap*ele%x%eta)**.5 print '(a,es12.4,a,es12.4)',' Horizontal emittance = ', mode%a%emittance, ' emit_max = ', osc_param%osc_emit_max print '(a,es12.4,a,es12.4)',' Fractional energy spread = ', mode%sige_e,' dp/p_max = ', osc_param%osc_dp_max print '(a,es12.4)',' Ratio transverse/longitudinal rate = ', r_xz call check_bypass_linearity(lat,co,mode, ix_start, ix_end, osc_param) return end