! independent variable data for use in optimization module constraints_mod use bmad_struct type an_indep_var character*40 ele_name character*16 val_name real(rp) min_val, max_val real*8 delta integer rindex, val_id endtype integer indep_var_maxx parameter(indep_var_maxx=200) type indep_var_struct type (an_indep_var) :: v(indep_var_maxx) integer n_var end type ! array sizes integer n_con_maxx parameter (n_con_maxx = 200) ! sub structures ! structure for the constraints ! If where1 (or where2) is the name of a lord element then ! where1_ix corresponds to the end slave element and where1_ix_lord ! corresponds to the lord. Otherwise where1_ix = where1_ix_lord type con_struct character*40 where1, where2 real(rp) target_value ! value we want variable to have real(rp) target_sigma ! Allowable sigma in target for norm'ing real(rp) weight ! weight for merit function real(rp) actual_value ! actual value of the variable real(rp) contribution ! contribution to figure of merit integer where1_ix, where2_ix ! Slave index corresponding to "where1/2" integer where1_ix_lord ! Lord index corresponding to "where1" integer where2_ix_lord integer location ! where variable actual_value is determined integer constraint ! constraint (min, max, target) integer plane ! plane (see below for a list) integer variable ! variable (see below for a list) logical use_amplitude ! use absolute value? logical use_relative ! normalize by target_value? logical set_target_to_initial_value ! use initial value for target? endtype ! for tracking type tracking_struct type (coord_struct) start integer n_turn integer n_particle end type ! main spec structure type constraint_struct real(rp) figure_of_merit real(rp) figure_of_merit_minop ! figure_of_merit*1.e-4 real(rp) beta_x_init, beta_y_init, eta_x_init ! for unstable lattices real(rp) energy_offset(3) ! eg. -0.006 0. 0.006 real(rp) Jz_Ja_BetaZ_ratio ! Action ratio real(rp) del_Q_res_min ! min tune seperation to a resonance real(rp) Q_z ! synch tune (in units of 1) real(rp) current(54) ! current in each bunch real(rp) delta_e ! energy offset character*40 exclude_lrbbi(2) ! single vars character*16 optimizer ! minop or minidel character*40 ele_names(20) character*120 disp_file ! displacements for nonlinearity calc character*120 lat_file ! lattice file character*120 initial_lat_file ! for getting initial values character*120 post_init_set_file ! for post-initial setup character*120 pre_init_set_file ! for pre-initial setup character*120 new_bmad_file ! new bmad file from optimization character*80 special_output ! for special_output subroutine type (coord_struct) orbit_offset ! offset for sextupole moment calc character*64 define_special_variables !groups or overlays used as variables character*40 compensating_ele(4) !elements used for solenoid compensation character*64 BunchPattern !file with positron and electron bunch pattern type (con_struct) c(n_con_maxx) type (tracking_struct) track integer n_gang ! number of ganged element groups integer n_constraint ! number of constraints integer n_loops, n_cycles ! single vars integer n_print, n_trains ! single vars, n_trains in strong beam integer n_cars, n_14ns_space ! single vars, n_cars in strong beam integer j_car ! car in weak beam. integer electron_offset ! offset of electron bunches in (1-19) units of 14n with respect to positrons with 9 trains integer symmetry ! lat symmetry (e.g. mobius, etc.) integer n_det_calc ! number of iterations for nonlin det calc integer sol_com ! -1 do not do, 0 global, 1 ip integer qs_2qx_turns ! number of turns to track on 2Qx-Qs resonance integer fom_power ! fom: (constraint_contrib * weight) ** fom_power logical sextupole_symmetry ! sext symmetry (e.g. ew, etc.) logical dbeta_exact ! exact dBeta_dE calc? logical use_sextupole_fom ! use sextupole stuff in figure-of-merit logical compensate_natural ! for sextupoles logical plot ! for plotting betas etc. logical plot_orbit ! for plotting betas and orbits etc. logical circular_machine ! single var logical nonlinearity ! single var logical pretzel ! single var logical minimize_moments ! single var logical emitt_calc logical fully_coupled logical calculate_moments ! true to calculate sextupole moments logical linearize_custom ! do tracking through custom wig with matrix logical hybridize ! true to hybridize lat logical use_sigma_norm ! use sigma norm'ing in the fom calc endtype ! constraint variable list integer beta$, alpha$, eta$, etap$, phase$, beam_aperture$ integer momentum_comp$, cross_angle$, sep_volt$, lrbbi_del_q$ integer q$, chrom$, i_bunch$, inj_pos_aperture$ integer inj_ele_aperture$, inj_ep_offset$, inj_ele_offset$ integer emittance$, pretz_aperture$, wig_emittance$, w_t$ integer displacement_$, co_angle$, c11$, c12$, c21$, c22$ integer V15$, V25$, V16$, V26$, V35$ integer pretz_efficiency$, variable_limit$, mobius_beta$ integer mobius_eta$, unstable_ring$ integer delta_beta$, delta_alpha$, delta_phi$, delta_beta_quad$ integer det_2by2_ul$, det_2by2_lr$, det_4by4$ integer dbeta_dpretz$, d_path_length$, dchrom$, nonlin_q$, tonality$ integer sext_moments$, dbeta_dcos$, dbeta_dsin$, sext_symmetry$ integer coupling_a_real$, coupling_a_image$, coupling_b_real$ integer coupling_b_image$, sign_symmetry$, chi2$, betax_betay$ integer alphax_alphay$, phix_phiy$, sext_resonances$ integer sex_k2_4$, particle_tracking$, lrbbi_del_q_x$, lrbbi_del_q_y$ integer sext_antisymmetry$, q_tot$ integer cbar11$, cbar12$, cbar21$, cbar22$, sigma_sep$ integer sum_cbar11_cbar22$, dif_cbar11_cbar22$, sum_cbar12_cbar21$ integer dif_cbar12_cbar21$, lrbbi_max_spread$, curly_d$, c_mat_chrom12$ integer energy_spread$, b_param_i$, dx_vcros5$, dx_vcros7$, dx_pretz1$ integer dx_pretz13$, d_beta_beam$, d_alpha_beam$, d_xemit$, d_curly_D$ integer d_eta_beam$, pos_feedbk_phase$, ele_feedbk_phase$, avg_eta_beam$ integer b_efficiency$, beta_electrons$, eta_electrons$, vert_efficiency$ integer elec_displace$, diff_displace$, curly_H$, etap_electrons$, elec_emitt$ integer sync_beta_path$, sync_beta_volt$, alpha_xx$, alpha_xy$, alpha_yy$ integer dcbar11$, dcbar12$, dcbar21$, dcbar22$ integer Qs_2Qx$, Qs_2Qx_cos$, Qs_2Qx_sin$, Qs_2Qx_track$ integer Qs_2Qx_ele$, Qs_2Qx_cos_ele$, Qs_2Qx_sin_ele$, q_ele$ integer elec_co_angle$ integer h11001r$, h00111r$, h20001r$,h00201r$, h10002r$,h21000r$,h30000r$,h10110r$ integer h10020r$, h10200r$ integer h11001i$, h00111i$, h20001i$,h00201i$, h10002i$,h21000i$,h30000i$,h10110i$ integer h10020i$, h10200i$ integer dnux_dp2$, dnuy_dp2$, trace$ integer eta_x2$, beta_x1$, beta_y1$, osc_emit_max$, osc_dp_max$, osc_m56$, osc_delta_s$, osc_wavelength$, osc_tilde_m56$ integer osc_m51$, osc_m52$ integer osc_m511$, osc_m512$, osc_m516$, osc_m522$,osc_m526$, osc_m566$, osc_int_theta_x2$, osc_int_theta_y2$ integer osc_m533$, osc_m534$, osc_m536$, osc_m544$,osc_m546$, osc_sec_ord_x$, osc_sec_ord_y$ integer h31000a$, h11200a$, h20020a$, h20110a$, h20200a$, h00310a$, h00400a$, h40000r$, h40000i$ integer jx_var$, jy_var$,ptc_axx$, ptc_g_real$, ptc_g_imag$ parameter (beta$ = 1, alpha$ = 2, eta$ = 3, etap$ = 4, phase$ = 5) parameter (beam_aperture$ = 6, momentum_comp$ = 7, cross_angle$ = 8) parameter (sep_volt$ = 9, lrbbi_del_q$ = 10, q$ = 11, chrom$ = 12) parameter (i_bunch$ = 13, inj_pos_aperture$ = 14, inj_ele_aperture$ = 15) parameter (inj_ep_offset$ = 16, inj_ele_offset$ = 17) parameter (emittance$ = 18, pretz_aperture$ = 19, wig_emittance$ =20) parameter (w_t$ = 21, displacement_$ = 22, co_angle$ = 23) parameter (c11$ = 24, c12$ = 25, c21$ = 26, c22$ = 27) parameter (pretz_efficiency$ = 28, variable_limit$ = 29) parameter (mobius_beta$ = 30, mobius_eta$ = 31, unstable_ring$ = 32) parameter (delta_beta$ = 33, delta_alpha$ = 34, delta_phi$ = 35) parameter (det_2by2_ul$ = 36, det_2by2_lr$ =37, det_4by4$ =38) parameter (dbeta_dpretz$ = 39, d_path_length$ = 40, dchrom$ = 41) parameter (nonlin_q$ = 42, tonality$ = 43, sext_moments$ = 44) parameter (dbeta_dcos$ = 45, dbeta_dsin$ = 46, sext_symmetry$ = 47) parameter (coupling_a_real$ = 48, coupling_a_image$ = 49) parameter (coupling_b_real$ = 50, coupling_b_image$ = 51) parameter (sign_symmetry$ = 52, chi2$ = 53) parameter (betax_betay$ = 54, alphax_alphay$ = 55, phix_phiy$ = 56) parameter (sext_resonances$ = 57, sex_k2_4$ = 58, particle_tracking$ = 59) parameter (lrbbi_del_q_x$ = 60, lrbbi_del_q_y$ = 61) parameter (sext_antisymmetry$ = 62, q_tot$ = 63) parameter (cbar11$ = 64, cbar12$ = 65, cbar21$ = 66, cbar22$ = 67) parameter (sigma_sep$ = 68, sum_cbar11_cbar22$ = 69, dif_cbar11_cbar22$ = 70) parameter (sum_cbar12_cbar21$ = 71, dif_cbar12_cbar21$ = 72) parameter (lrbbi_max_spread$ = 73, curly_d$ = 74, delta_beta_quad$ = 75) parameter (c_mat_chrom12$ = 76, energy_spread$ = 77, b_param_i$ = 78 ) parameter (dx_vcros5$ = 79, dx_vcros7$ = 80, dx_pretz1$ = 81 ) parameter (dx_pretz13$ = 82, d_beta_beam$ = 83, d_alpha_beam$ = 84) parameter (d_xemit$ = 85, d_curly_D$ = 86, d_eta_beam$ = 87) parameter (pos_feedbk_phase$ = 88, ele_feedbk_phase$ = 89, avg_eta_beam$ = 90) parameter (b_efficiency$ = 91, beta_electrons$ = 92, eta_electrons$ = 93) parameter (vert_efficiency$ = 94, elec_displace$ = 95, diff_displace$ = 96) parameter (curly_H$ = 97, etap_electrons$ = 98, elec_emitt$ = 99) parameter (sync_beta_path$ = 100, sync_beta_volt$ = 101, alpha_xx$ = 102) parameter (alpha_xy$ = 103, alpha_yy$ = 104) parameter (dcbar11$ = 105, dcbar12$ = 106, dcbar21$ = 107, dcbar22$ = 108) parameter (Qs_2Qx$ = 109, Qs_2Qx_cos$=110, Qs_2Qx_sin$=111,Qs_2Qx_track$ = 112) parameter (Qs_2Qx_ele$ = 113, Qs_2Qx_cos_ele$=114, Qs_2Qx_sin_ele$=115) parameter (q_ele$=116, elec_co_angle$=117) parameter (h11001r$=118, h00111r$=119, h20001r$=120,h00201r$=121, h10002r$=122,h21000r$=123,h30000r$=124,h10110r$=125) parameter (h10020r$=126, h10200r$=127) parameter (h11001i$=128, h00111i$=129, h20001i$=130,h00201i$=131, h10002i$=132,h21000i$=133,h30000i$=134,h10110i$=135) parameter (h10020i$=136, h10200i$=137) parameter (dnux_dp2$=138, dnuy_dp2$=139) parameter (V15$=140, V25$=141, V16$=142, V26$=143, V35$=144) parameter (trace$=145) parameter (eta_x2$=146,beta_x1$=147,beta_y1$=148) parameter (osc_emit_max$=149, osc_dp_max$=150, osc_m56$=151, osc_delta_s$=152, osc_wavelength$=153, osc_tilde_m56$=154) parameter (osc_m51$=155, osc_m52$=156) parameter (osc_m511$ = 157, osc_m512$ = 158, osc_m516$ = 159, osc_m522$ = 160, osc_m526$ = 161, osc_m566$ = 162) parameter (osc_m533$ = 163, osc_m534$ = 164, osc_m536$ = 165, osc_m544$ = 166, osc_m546$ = 167) parameter (osc_int_theta_x2$ = 168, osc_int_theta_y2$ = 169, osc_sec_ord_x$=170, osc_sec_ord_y$ = 171) parameter (h31000a$=172, h11200a$=173, h00400a$=174, h20020a$=175, h20110a$=176, h20200a$=177, h00310a$=178, h40000r$=179, h40000i$=180) parameter (jx_var$=181, jy_var$=182, ptc_axx$=183, ptc_g_real$=184, ptc_g_imag$=185) character(16) :: var_name(185) = (/ & 'BETA ', 'ALPHA ', 'ETA ', 'ETAP ', & 'PHASE ', 'APERTURE ', 'MOMENTUM_COMP ', 'CROSS_ANGLE ', & 'SEP_VOLT ', 'LRBBI_DEL_Q ', 'Q ', 'CHROM ', & 'I_BUNCH ', 'INJ_POS_APERTURE', 'INJ_ELE_APERTURE', 'INJ_EP_OFFSET ', & 'INJ_ELE_OFFSET ', 'EMITTANCE ', 'PRETZ_APERTURE ', 'WIG_EMITTANCE ', & 'WELCH_TEMNYKH ', 'DISPLACEMENT ', 'CO_ANGLE ', 'C11 ', & 'C12 ', 'C21 ', 'C22 ', 'PRETZ_EFFICIENCY', & 'VARIABLE_LIMIT ', 'MOBIUS_BETA ', 'MOBIUS_ETA ', & 'UNSTABLE_RING ', 'DELTA_BETA ', 'DELTA_ALPHA ', 'DELTA_PHI ', & 'DET_2BY2_UL ', 'DET_2BY2_LR ', 'DET_4BY4 ', 'DBETA_DPRETZ ', & 'D_PATH_LENGTH ', 'DELTA_CHROM ', 'NONLIN_Q ', 'TONALITY ', & 'SEXT_MOMENTS ', 'DBETA_DCOS ', 'DBETA_DSIN ', 'SEXT_SYMMETRY ', & 'COUPLING_A_REAL ', 'COUPLING_A_IMAGE', 'COUPLING_B_REAL ', & 'COUPLING_B_IMAGE', 'SIGN_SYMMETRY ', 'CHI2 ', & 'BETAX_BETAY ', 'ALPHAX_ALPHAY ', 'PHIX_PHIY ', 'SEXT_RESONANCES ', & 'SEX_K2^4 ', 'TRACKING ', 'LRBBI_DEL_Q_X ', 'LRBBI_DEL_Q_Y ', & 'SXT_ANTISYMMETRY', 'Q_TOT ', 'CBAR11 ', 'CBAR12 ', & 'CBAR21 ', 'CBAR22 ', 'SIGMA_SEP ', 'SM_CBAR11_CBAR22', & 'DF_CBAR11_CBAR22', 'SM_CBAR12_CBAR21', 'DF_CBAR12_CBAR21', 'LRBBI_MAX_SPREAD', & 'CURLY_D ', 'DELTA_BETA_QUAD ', 'C_MAT_CHROM12 ', 'ENERGY_SPREAD ', & 'B_PARAM_I ', 'DX_VCROS5 ', 'DX_VCROS7 ', 'DX_PRETZ1 ', & 'DX_PRETZ13 ', 'D_BETA_BEAM ', 'D_ALPHA_BEAM ', 'D_XEMIT ', & 'D_CURLY_D ', 'D_ETA_BEAM ', 'POS_FEEDBK_PHASE', 'ELE_FEEDBK_PHASE', & 'AVG_ETA_BEAM ', 'B_EFFICIENCY ', 'BETA_ELECTRONS ', 'ETA_ELECTRONS ', & 'VERT_EFFICIENCY ', 'ELEC_DISPLACE ', 'DIFF_DISPLACE ', 'CURLY_H ', & 'ETAP_ELECTRONS ', 'ELEC_EMITT ', 'SYNC_BETA_PATH ', 'SYNC_BETA_VOLT ', & 'ALPHA_XX ', 'ALPHA_XY ', 'ALPHA_YY ', 'DCBAR11 ', & 'DCBAR12 ', 'DCBAR21 ', 'DCBAR22 ', 'QS_2QX ', & 'QS_2QX_COS ', 'QS_2QX_SIN ', 'QS_2QX_TRACK ', 'QS_2QX_ELE ', & 'QS_2QX_COS_ELE ', 'QS_2QX_SIN_ELE ', 'Q_ELE ', 'ELEC_CO_ANGLE ', & 'H11001r ', 'H00111r ', 'H20001r ', 'H00201r ', & 'H10002r ', 'H21000r ', 'H30000r ', 'H10110r ', & 'H10020r ', 'H10200r ', & 'H11001i ', 'H00111i ', 'H20001i ', 'H00201i ', & 'H10002i ', 'H21000i ', 'H30000i ', 'H10110i ', & 'H10020i ', 'H10200i ', & 'dnux_dp2 ', 'dnuy_dp2 ', 'V15 ', 'V25 ', & 'V16 ', 'V26 ', 'V35 ', 'TRACE ', & 'eta_x2 ', 'beta_x1 ', 'beta_y1 ', & 'OSC_EMIT_MAX ', 'OSC_DP_MAX ', 'OSC_M56 ', 'OSC_DELTA_S ', & 'OSC_WAVELENGTH ', 'OSC_TILDE_M56 ', 'OSC_M51 ', 'OSC_M52 ', & 'OSC_M511 ','OSC_M512 ','OSC_M516 ','OSC_M522 ','OSC_M526 ','OSC_M566 ', & 'OSC_M533 ','OSC_M534 ','OSC_M536 ','OSC_M544 ','OSC_M546 ', & 'OSC_INT_THETA_X2','OSC_INT_THETA_Y2','OSC_SEC_ORD_X ','OSC_SEC_ORD_Y ',& 'H31000a ','H11200a ','H00400a ','H20020a ',& 'H20110a ','H20200a ','H00310a ','H40000r ','H40000i ',& 'jx_var ','jy_var ','ptc_axx ','ptc_g_real ','ptc_g_imag '/) ! constraint type list ! Use minz$, maxz$ to avoid conflict with min$, max$ defined by Bmad. integer minz$, maxz$, target$ parameter (minz$ = 1, maxz$ = 2, target$ = 3) character(16) :: con_name(4) = (/ 'MIN ', 'MAX ', 'TARGET', ' ' /) !---------------------------------------------------------------------------------- contains function var_attribute(lat, v) result (r_ptr) use attribute_mod implicit none type (lat_struct) lat type (an_indep_var) v type (all_pointer_struct) a_ptr real(rp), pointer :: r_ptr logical err_flag ! call pointer_to_indexed_attribute(lat%ele(v%rindex), v%val_id, .true., a_ptr, err_flag) r_ptr => a_ptr%r end function var_attribute end module constraints_mod