!+ ! Subroutine bmad_auto_scale_amp (ix_lat, ix_ele, KE_start, dE, c_err) ! ! Routine to compute the RF amplitude scale neede for a certain energy change. ! Call this routine for each lcavity element and then call bmad_auto_scale_phase ! ! Input: ! ix_lat -- Integer: Index of lattice. ! ix_ele -- Integer: Index of RF element. ! KE_start -- Real(rp): Starting kinetic energy. ! dE -- Energy change wanted. ! ! Output: ! field_scale -- Real(rp): Field scale ! c_err -- logical(c_bool): Error flag. !- subroutine bmad_auto_scale_amp (ix_lat, ix_ele, KE_start, dE, c_err) use bmad_common_mod implicit none type (ele_struct), pointer :: ele type (lat_struct), pointer :: lat real(rp) KE_start, dE, field_scale, e_tot_start, p0c_start real(rp), pointer :: field_ptr, phase_ptr integer ix_lat, ix_ele, i logical(c_bool) c_err logical err_flag, err character(16), parameter :: r_name = 'bmad_auto_scale_amp' ! c_err = c_logic(.true.) call bmad_set_lat_pointer (err, r_name, ix_lat, lat, ix_ele, ele, can_be_in_init = .true.) if (err) return do i = 1, lat%n_ele_max if (lat%ele(i)%key /= lcavity$ .and. lat%ele(i)%key /= rfcavity$) cycle lat%ele(i)%value(autoscale_amplitude$) = true$ enddo ele%value(voltage$) = dE if (ele%value(l$) /= 0) ele%value(gradient$) = dE / ele%value(l$) ele%value(e_tot_start$) = ke_start + mass_of(lat%param%particle) call convert_total_energy_to (ele%value(e_tot_start$), lat%param%particle, pc = ele%value(p0c_start$)) ele%value(e_tot$) = ele%value(e_tot_start$) ele%value(p0c$) = ele%value(p0c_start$) call autoscale_phase_and_amp (ele, lat%param, err) if (err) return do i = 1, lat%n_ele_max if (lat%ele(i)%key /= lcavity$ .and. lat%ele(i)%key /= rfcavity$) cycle lat%ele(i)%value(autoscale_amplitude$) = false$ enddo c_err = c_logic(.false.) end subroutine