subroutine time_dep_quad_field (start_orb, ele, quad_number, err_flag) use bmad use quad_scrape_parameters use parameters_bmad use muon_mod use muon_interface, except_dummy => time_dep_quad_field implicit none type (coord_struct) :: start_orb, orb type (ele_struct), target :: ele type (ele_struct), pointer :: ele_init type (ele_struct), pointer :: lord logical err_flag, err logical grid logical local_ref_frame/.true./ !real(rp) scrape_scale, omega, init_scrape/0.70937/, quad_ramp_start_time/7.e-6/, quad_ramp_end_time/30.e-6/ real(rp) focus_scrape_scale, omega, steer_scrape_scale, tau real(rp) scale real(rp) t real(rp) voltage real(rp) q1ltop, q1lbottom real(rp) f_index, v_value real(rp) rf_v_field_scale, rf_h_field_scale real(rp) t0/1.e-6/ real(rp) temp real(rp) dx/0.001/ integer i, igrid/1/ integer state integer quad_number integer, save :: lun integer, save :: save_number logical first/.true./ rf_v_field_scale=0 rf_h_field_scale=0 if((associated(ele%grid_field)))then grid = .true. lord => ele elseif(ele%field_calc == refer_to_lords$)then do i=1,ele%n_lord lord => pointer_to_lord(ele,i) if(associated(lord%grid_field))exit end do endif igrid = size(lord%grid_field)-6 if(allocated(ele_ref))then do i=1,size(ele_ref) !find reference if(ele_ref(i)%name == ele%name)then ele_init => ele_ref(i) exit endif end do else print '(a,a)','time_dep_quad_field: ele_ref(i)%name /= ele%name = ', ele%name endif t = start_orb%t + t0 !start time is ~1us earlier than the beam injection (IBMS3 trigger) if(.not. fixed_quad_time)quad_time = start_orb%t !if positive, then use the orbit time. If negative use abs quad_time i=abs(quad_number) save_number = quad_number rf_v_field_scale = rf_quad(i)%amp_v * (0.3/0.2)/27.2 * 100 * sin(twopi*rf_quad(i)% freq_v* (t - t0_v_min(i))) !see below for scaling rule if(quad_number < 0 .or. t < t0_v_min(i) .or. t > t0_v_max(i)) rf_v_field_scale=0 if(t > t0_h_min(i) .and. t < t0_h_max(i))then rf_h_field_scale = rf_quad(i)%amp_h * (1.0/0.2)/27.2 * 100 * sin(twopi*rf_quad(i)% freq_h * (t-t0_h_min(i))) else rf_h_field_scale=0 endif ! if(t < t0_h_min(i) .or. t > t0_h_max(i)) rf_h_field_scale = 0 if(scraping_on)then if(quad_time < quad_ramp_start_time)then focus_scrape_scale = init_quad_focus steer_scrape_scale = init_quad_steer ! elseif(quad_time > quad_ramp_start_time .and. quad_time < quad_ramp_end_time)then elseif(quad_time > quad_ramp_start_time)then ! omega = twopi/4./(quad_ramp_end_time - quad_ramp_start_time) ! focus_scrape_scale = init_quad_focus * (1 - sin(omega * (quad_time-quad_ramp_start_time))) ! steer_scrape_scale = init_quad_steer * (1 - sin(omega * (quad_time-quad_ramp_start_time))) tau= 7.e-6 focus_scrape_scale = init_quad_focus * exp(- (quad_time-quad_ramp_start_time)/tau) steer_scrape_scale = init_quad_steer * exp(- (quad_time-quad_ramp_start_time)/tau) else focus_scrape_scale = 0 steer_scrape_scale = 0 endif scale = value_of_attribute(lord, 'QUAD_VOLTAGE', err) * value_of_attribute(lord, 'FIELD_INDEX', err) / 0.185 ! v_value = value_of_attribute(lord, 'QUAD_VOLTAGE', err) ! f_index= value_of_attribute(lord, 'FIELD_INDEX', err) ! initialize lord%grid_field()%field_scale lord%grid_field(igrid+3)%field_scale = ele_init%grid_field(igrid+3)%field_scale !inner lord%grid_field(igrid+4)%field_scale = ele_init%grid_field(igrid+4)%field_scale !bottom lord%grid_field(igrid+5)%field_scale = ele_init%grid_field(igrid+5)%field_scale !outer lord%grid_field(igrid+6)%field_scale = ele_init%grid_field(igrid+6)%field_scale !top if(index(lord%name,'QUAD1') /= 0)then if(bad_resistors.and. index(lord%name,'QUAD1_LONG')/=0)then! field_scale * 27.2 = plate voltage, -> field_scale = plate_voltage/27.2 call bad_resistor_voltages(quad_time, q1lbottom, q1ltop) !seconds, kV lord%grid_field(igrid+6)%field_scale = q1ltop/27.2 * 100 lord%grid_field(igrid+4)%field_scale = q1lbottom/27.2 * 100 else lord%grid_field(igrid+6)%field_scale = (1 + focus_scrape_scale - steer_scrape_scale) * ele_init%grid_field(igrid+6)%field_scale !top - in 821, focus_scrape_scale +steer_scrape_scale = 0. lord%grid_field(igrid+4)%field_scale = (1 + focus_scrape_scale + steer_scrape_scale) * ele_init%grid_field(igrid+4)%field_scale !bottom - 821, focus_scrape_scale - steer_scrape_ scale = 22.7/32. (at t=0) endif elseif(index(lord%name,'QUAD2') /= 0)then lord%grid_field(igrid+6)%field_scale = (1 + focus_scrape_scale - steer_scrape_scale) * ele_init%grid_field(igrid+6)%field_scale !top lord%grid_field(igrid+4)%field_scale = (1 + focus_scrape_scale + steer_scrape_scale) * ele_init%grid_field(igrid+4)%field_scale !bottom if(horizontal_scrape)then lord%grid_field(igrid+3)%field_scale = (1 + focus_scrape_scale + steer_scrape_scale) * ele_init%grid_field(igrid+3)%field_scale !inner lord%grid_field(igrid+5)%field_scale = (1 + focus_scrape_scale - steer_scrape_scale) * ele_init%grid_field(igrid+5)%field_scale !outer else lord%grid_field(igrid+3)%field_scale = ele_init%grid_field(igrid+3)%field_scale !inner lord%grid_field(igrid+5)%field_scale = ele_init%grid_field(igrid+5)%field_scale !outer endif elseif(index(lord%name,'QUAD3') /= 0)then lord%grid_field(igrid+6)%field_scale = (1 + focus_scrape_scale - steer_scrape_scale) * ele_init%grid_field(igrid+6)%field_scale ! top lord%grid_field(igrid+4)%field_scale = (1 + focus_scrape_scale + steer_scrape_scale) * ele_init%grid_field(igrid+4)%field_scale ! bottom elseif(index(lord%name,'QUAD4') /= 0)then lord%grid_field(igrid+6)%field_scale = (1 + focus_scrape_scale - steer_scrape_scale) * ele_init%grid_field(igrid+6)%field_scale !top lord%grid_field(igrid+4)%field_scale = (1 + focus_scrape_scale + steer_scrape_scale) * ele_init%grid_field(igrid+4)%field_scale !bottom if(horizontal_scrape)then lord%grid_field(igrid+5)%field_scale = (1 + focus_scrape_scale + steer_scrape_scale) * ele_init%grid_field(igrid+5)%field_scale !outer lord%grid_field(igrid+3)%field_scale = (1 + focus_scrape_scale - steer_scrape_scale) * ele_init%grid_field(igrid+3)%field_scale !inner else lord%grid_field(igrid+5)%field_scale = ele_init%grid_field(igrid+5)%field_scale !outer lord%grid_field(igrid+3)%field_scale = ele_init%grid_field(igrid+3)%field_scale !inner endif endif endif ! scraping on, set quad voltages if(rf_h_field_scale /= 0)then lord%grid_field(igrid+5)%field_scale = lord%grid_field(igrid+5)%field_scale + rf_h_field_scale lord%grid_field(igrid+3)%field_scale =lord%grid_field(igrid+3)%field_scale - rf_h_field_scale endif if(rf_v_field_scale /= 0 )then lord%grid_field(igrid+6)%field_scale = lord%grid_field(igrid+6)%field_scale + rf_v_field_scale lord%grid_field(igrid+4)%field_scale = lord%grid_field(igrid+4)%field_scale - rf_v_field_scale endif return end subroutine time_dep_quad_field