xtrack 0.84.7__tar.gz → 0.85.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. {xtrack-0.84.7/xtrack.egg-info → xtrack-0.85.0}/PKG-INFO +1 -1
  2. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_elements_classflags.py +5 -0
  3. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_elements_thick.py +186 -21
  4. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_fcc_ee_solenoid_correction.py +7 -5
  5. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +8 -5
  6. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_line.py +26 -11
  7. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_mad_writer.py +2 -1
  8. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_magnet.py +1 -1
  9. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_native_madloader.py +5 -5
  10. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_radiation_equilibrium_emittances_thick.py +2 -2
  11. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_slice_elements.py +3 -3
  12. xtrack-0.85.0/tests/test_solenoid_bz_map_vs_boris.py +272 -0
  13. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_spin.py +63 -19
  14. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_thick_lhc.py +1 -0
  15. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_trajectory_correcton.py +49 -0
  16. xtrack-0.85.0/xtrack/_version.py +1 -0
  17. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/__init__.py +5 -2
  18. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements.py +240 -5
  19. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/bend.h +2 -0
  20. xtrack-0.84.7/xtrack/beam_elements/elements_src/solenoid.h → xtrack-0.85.0/xtrack/beam_elements/elements_src/legacy_solenoid.h +4 -4
  21. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/magnet.h +2 -0
  22. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/magnet_edge.h +6 -4
  23. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/multipole.h +2 -0
  24. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/octupole.h +2 -0
  25. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/quadrupole.h +2 -0
  26. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/rbend.h +2 -0
  27. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/sextupole.h +2 -0
  28. xtrack-0.85.0/xtrack/beam_elements/elements_src/slnd.h +68 -0
  29. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thick_slice_bend.h +2 -0
  30. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +2 -0
  31. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +2 -0
  32. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +2 -0
  33. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +2 -0
  34. xtrack-0.85.0/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +83 -0
  35. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_bend.h +2 -0
  36. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +2 -0
  37. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +2 -0
  38. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +2 -0
  39. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +2 -0
  40. xtrack-0.85.0/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +51 -0
  41. xtrack-0.85.0/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +51 -0
  42. xtrack-0.84.7/xtrack/beam_elements/elements_src/track_solenoid.h → xtrack-0.85.0/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +2 -1
  43. xtrack-0.84.7/xtrack/beam_elements/elements_src/track_magnet_radiation.h → xtrack-0.85.0/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +3 -3
  44. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_magnet.h +122 -31
  45. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_magnet_drift.h +75 -0
  46. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_magnet_edge.h +25 -7
  47. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_magnet_kick.h +130 -9
  48. xtrack-0.85.0/xtrack/beam_elements/elements_src/track_magnet_radiation.h +336 -0
  49. xtrack-0.85.0/xtrack/beam_elements/elements_src/variable_solenoid.h +102 -0
  50. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/slice_elements.py +68 -1
  51. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/slice_elements_thick.py +33 -1
  52. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/environment.py +8 -3
  53. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/line.py +4 -15
  54. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/mad_loader.py +1 -2
  55. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/mad_parser/loader.py +1 -1
  56. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/mad_writer.py +1 -2
  57. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/madng_interface.py +28 -23
  58. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/trajectory_correction.py +5 -5
  59. {xtrack-0.84.7 → xtrack-0.85.0/xtrack.egg-info}/PKG-INFO +1 -1
  60. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack.egg-info/SOURCES.txt +10 -4
  61. xtrack-0.84.7/xtrack/_version.py +0 -1
  62. xtrack-0.84.7/xtrack/beam_elements/elements_src/thick_slice_solenoid.h +0 -39
  63. {xtrack-0.84.7 → xtrack-0.85.0}/LICENSE +0 -0
  64. {xtrack-0.84.7 → xtrack-0.85.0}/MANIFEST.in +0 -0
  65. {xtrack-0.84.7 → xtrack-0.85.0}/README.md +0 -0
  66. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/__init__.py +0 -0
  67. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/base_classes.py +0 -0
  68. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/BB6D.py +0 -0
  69. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  70. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/__init__.py +0 -0
  71. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/beambeam.py +0 -0
  72. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/boost.py +0 -0
  73. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  74. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  75. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/qgauss.py +0 -0
  76. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/slicing.py +0 -0
  77. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/be_beamfields/spacecharge.py +0 -0
  78. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/elements.py +0 -0
  79. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/line.py +0 -0
  80. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/mathlibs.py +0 -0
  81. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/particles.py +0 -0
  82. {xtrack-0.84.7 → xtrack-0.85.0}/ducktrack/temp_pyparticles.py +0 -0
  83. {xtrack-0.84.7 → xtrack-0.85.0}/pyproject.toml +0 -0
  84. {xtrack-0.84.7 → xtrack-0.85.0}/setup.cfg +0 -0
  85. {xtrack-0.84.7 → xtrack-0.85.0}/setup.py +0 -0
  86. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_acceleration.py +0 -0
  87. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_amplitude_detuning.py +0 -0
  88. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_aperture_table.py +0 -0
  89. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  90. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_apertures.py +0 -0
  91. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_attr_replicas_and_slices.py +0 -0
  92. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_bucket_with_ref_energy_change.py +0 -0
  93. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_cavity_absolute_time.py +0 -0
  94. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_chromatic_functions_vs_madx.py +0 -0
  95. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_coasting.py +0 -0
  96. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_collective_tracker.py +0 -0
  97. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_collimation.py +0 -0
  98. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_electron_cooler.py +0 -0
  99. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_element_characterization_functions.py +0 -0
  100. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_element_internal_record.py +0 -0
  101. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_elements.py +0 -0
  102. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_environment.py +0 -0
  103. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_footprint.py +0 -0
  104. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_freeze_longitudinal.py +0 -0
  105. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_full_rings.py +0 -0
  106. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_h6_sps_beamline.py +0 -0
  107. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_hvkick.py +0 -0
  108. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_ions.py +0 -0
  109. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_legacy_multiline_to_env.py +0 -0
  110. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_lhc_env.py +0 -0
  111. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_lhc_match_phase_15.py +0 -0
  112. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_lumi.py +0 -0
  113. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_madloader.py +0 -0
  114. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_madnginterface.py +0 -0
  115. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_match_and_track_from_element.py +0 -0
  116. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_match_coupling_knob.py +0 -0
  117. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_match_nested.py +0 -0
  118. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_match_optics_and_ip_knob.py +0 -0
  119. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  120. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_match_orbit_bump.py +0 -0
  121. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_match_tune_chroma_cminus.py +0 -0
  122. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_monitor.py +0 -0
  123. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_multi_bunch_gauss.py +0 -0
  124. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_multiline.py +0 -0
  125. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_multisetter.py +0 -0
  126. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_multispecies.py +0 -0
  127. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_optimize_for_tracking.py +0 -0
  128. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_particles.py +0 -0
  129. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_particles_basics.py +0 -0
  130. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_particles_pdg.py +0 -0
  131. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_periodic_symmetric_twiss_and_match.py +0 -0
  132. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_pipeline.py +0 -0
  133. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_prebuild_kernels.py +0 -0
  134. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_ps_against_ptc.py +0 -0
  135. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_ps_multiturn_twiss.py +0 -0
  136. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_psb_chicane.py +0 -0
  137. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_pyht_interface.py +0 -0
  138. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_radial_steering.py +0 -0
  139. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_radiation.py +0 -0
  140. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_radiation_equilibrium_emittances.py +0 -0
  141. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_radiation_integrals.py +0 -0
  142. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_random_gen.py +0 -0
  143. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_random_gen_exp.py +0 -0
  144. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_random_gen_gauss.py +0 -0
  145. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_random_gen_ruth.py +0 -0
  146. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_rbend_rbarc.py +0 -0
  147. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_rf_track.py +0 -0
  148. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_rotation_signs.py +0 -0
  149. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_second_order_taylor_map.py +0 -0
  150. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_seeds.py +0 -0
  151. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_slice_and_insert_with_replicas.py +0 -0
  152. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_slicing.py +0 -0
  153. /xtrack-0.84.7/tests/test_solenoid_bz_map_vs_boris.py → /xtrack-0.85.0/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
  154. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_spacecharge_in_ring.py +0 -0
  155. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_sps_thick.py +0 -0
  156. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_survey.py +0 -0
  157. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_tapering.py +0 -0
  158. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_tilt_shifts.py +0 -0
  159. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_tracker.py +0 -0
  160. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_twiss.py +0 -0
  161. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_twiss_vs_madx_psb.py +0 -0
  162. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_vs_madx.py +0 -0
  163. {xtrack-0.84.7 → xtrack-0.85.0}/tests/test_xmask_orbit_correction.py +0 -0
  164. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/__init__.py +0 -0
  165. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/_temp/__init__.py +0 -0
  166. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  167. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  168. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  169. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/_temp/lhc_match/__init__.py +0 -0
  170. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  171. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  172. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  173. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/aperture_meas.py +0 -0
  174. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/base_element.py +0 -0
  175. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/apertures.py +0 -0
  176. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  177. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  178. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  179. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  180. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  181. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  182. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/beam_interaction.py +0 -0
  183. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  184. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  185. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  186. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/drift.h +0 -0
  187. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  188. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  189. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  190. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  191. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  192. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  193. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
  194. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/elens.h +0 -0
  195. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  196. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  197. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  198. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  199. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  200. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/marker.h +0 -0
  201. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  202. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  203. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  204. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  205. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  206. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  207. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  208. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  209. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thick_slice_drift.h +0 -0
  210. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  211. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  212. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  213. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  214. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  215. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  216. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
  217. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
  218. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  219. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  220. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_bend.h +0 -0
  221. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_cavity.h +0 -0
  222. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  223. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  224. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  225. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
  226. /xtrack-0.84.7/xtrack/beam_elements/elements_src/track_multipolar_components.h → /xtrack-0.85.0/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
  227. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  228. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_multipole.h +0 -0
  229. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_quadrupole.h +0 -0
  230. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  231. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  232. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  233. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  234. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  235. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  236. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  237. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/wire.h +0 -0
  238. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  239. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  240. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  241. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  242. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/exciter.py +0 -0
  243. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/magnets.py +0 -0
  244. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/beam_elements/rft_element.py +0 -0
  245. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/footprint.py +0 -0
  246. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/general.py +0 -0
  247. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/headers/atomicadd.h +0 -0
  248. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/headers/checks.h +0 -0
  249. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/headers/constants.h +0 -0
  250. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/headers/particle_states.h +0 -0
  251. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/headers/synrad_spectrum.h +0 -0
  252. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/headers/track.h +0 -0
  253. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/internal_record.py +0 -0
  254. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/json.py +0 -0
  255. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/linear_normal_form.py +0 -0
  256. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/loss_location_refinement/__init__.py +0 -0
  257. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  258. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/lumi.py +0 -0
  259. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/mad_parser/__init__.py +0 -0
  260. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/mad_parser/madx.lark +0 -0
  261. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/mad_parser/parse.py +0 -0
  262. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/match.py +0 -0
  263. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/__init__.py +0 -0
  264. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/beam_position_monitor.h +0 -0
  265. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/beam_position_monitor.py +0 -0
  266. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/beam_profile_monitor.h +0 -0
  267. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/beam_profile_monitor.py +0 -0
  268. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/beam_size_monitor.h +0 -0
  269. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/beam_size_monitor.py +0 -0
  270. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/last_turns_monitor.h +0 -0
  271. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/last_turns_monitor.py +0 -0
  272. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/particles_monitor.h +0 -0
  273. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/monitors/particles_monitor.py +0 -0
  274. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/multiline.py +0 -0
  275. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/multiline_legacy/__init__.py +0 -0
  276. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  277. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  278. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/multisetter/__init__.py +0 -0
  279. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/multisetter/multisetter.py +0 -0
  280. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/particles/__init__.py +0 -0
  281. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/particles/constants.py +0 -0
  282. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/particles/masses.py +0 -0
  283. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/particles/particles.py +0 -0
  284. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/particles/pdg.py +0 -0
  285. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/particles/rng_src/base_rng.h +0 -0
  286. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/particles/rng_src/particles_rng.h +0 -0
  287. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/pipeline/__init__.py +0 -0
  288. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/pipeline/core.py +0 -0
  289. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/pipeline/manager.py +0 -0
  290. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/pipeline/multitracker.py +0 -0
  291. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/progress_indicator.py +0 -0
  292. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/random/__init__.py +0 -0
  293. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/random/random_generators.py +0 -0
  294. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/random/random_src/exponential.h +0 -0
  295. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  296. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/random/random_src/normal.h +0 -0
  297. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/random/random_src/rutherford.h +0 -0
  298. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/random/random_src/uniform.h +0 -0
  299. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/random/random_src/uniform_accurate.h +0 -0
  300. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/slicing.py +0 -0
  301. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/survey.py +0 -0
  302. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/svgutils/__init__.py +0 -0
  303. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/svgutils/parser.py +0 -0
  304. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/svgutils/path.py +0 -0
  305. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/svgutils/svgutils.py +0 -0
  306. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/synctime.py +0 -0
  307. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/tapering.py +0 -0
  308. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/targets.py +0 -0
  309. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/tracker.py +0 -0
  310. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/tracker_data.py +0 -0
  311. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/tracker_src/tracker.h +0 -0
  312. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/twiss.py +0 -0
  313. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack/twissplot.py +0 -0
  314. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack.egg-info/dependency_links.txt +0 -0
  315. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack.egg-info/requires.txt +0 -0
  316. {xtrack-0.84.7 → xtrack-0.85.0}/xtrack.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xtrack
3
- Version: 0.84.7
3
+ Version: 0.85.0
4
4
  Summary: Tracking library for particle accelerators
5
5
  Home-page: https://xsuite.readthedocs.io/
6
6
  Download-URL: https://pypi.python.org/pypi/xtrack
@@ -13,6 +13,8 @@ checks = [
13
13
  (xt.SRotation, dict(isthick=False, allow_rot_and_shift=False, rot_and_shift_from_parent=None , _inherit_strengths=None)),
14
14
  (xt.YRotation, dict(isthick=False, allow_rot_and_shift=False, rot_and_shift_from_parent=None , _inherit_strengths=None)),
15
15
  (xt.Solenoid, dict(isthick=True , allow_rot_and_shift=True , rot_and_shift_from_parent=None , _inherit_strengths=None)),
16
+ (xt.UniformSolenoid, dict(isthick=True , allow_rot_and_shift=True , rot_and_shift_from_parent=None , _inherit_strengths=None)),
17
+ (xt.VariableSolenoid, dict(isthick=True , allow_rot_and_shift=True , rot_and_shift_from_parent=None , _inherit_strengths=None)),
16
18
  (xt.RFMultipole, dict(isthick=False, allow_rot_and_shift=True , rot_and_shift_from_parent=None , _inherit_strengths=None)),
17
19
  (xt.DipoleEdge, dict(isthick=False, allow_rot_and_shift=True , rot_and_shift_from_parent=None , _inherit_strengths=None)),
18
20
  (xt.SimpleThinBend, dict(isthick=False, allow_rot_and_shift=False, rot_and_shift_from_parent=None , _inherit_strengths=None)),
@@ -31,6 +33,7 @@ checks = [
31
33
  (xt.DriftSliceSextupole, dict(isthick=True, allow_rot_and_shift=False, rot_and_shift_from_parent=False, _inherit_strengths=False)),
32
34
  (xt.ThickSliceBend, dict(isthick=True, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=True )),
33
35
  (xt.ThickSliceOctupole, dict(isthick=True, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=True )),
36
+ (xt.ThickSliceUniformSolenoid,dict(isthick=True, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=True )),
34
37
  (xt.ThickSliceQuadrupole, dict(isthick=True, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=True )),
35
38
  (xt.ThickSliceSextupole, dict(isthick=True, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=True )),
36
39
  (xt.ThinSliceBend, dict(isthick=False, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=True )),
@@ -39,6 +42,8 @@ checks = [
39
42
  (xt.ThinSliceOctupole, dict(isthick=False, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=True )),
40
43
  (xt.ThinSliceQuadrupole, dict(isthick=False, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=True )),
41
44
  (xt.ThinSliceSextupole, dict(isthick=False, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=True )),
45
+ (xt.ThinSliceUniformSolenoidEntry, dict(isthick=False, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=False)),
46
+ (xt.ThinSliceUniformSolenoidExit, dict(isthick=False, allow_rot_and_shift=False, rot_and_shift_from_parent=True , _inherit_strengths=False)),
42
47
  ]
43
48
 
44
49
  def test_elements_classflags():
@@ -1318,7 +1318,7 @@ def test_solenoid_against_madx(test_context, ks, ksi, length):
1318
1318
 
1319
1319
  @for_all_test_contexts
1320
1320
  def test_solenoid_thick_drift_like(test_context):
1321
- solenoid = xt.Solenoid(ks=1.001e-9, length=1, _context=test_context)
1321
+ solenoid = xt.UniformSolenoid(ks=1.001e-9, length=1, _context=test_context)
1322
1322
  l_drift = xt.Line(elements=[xt.Drift(length=1)])
1323
1323
  l_drift.config.XTRACK_USE_EXACT_DRIFTS = True
1324
1324
  l_drift.build_tracker(_context=test_context)
@@ -1353,7 +1353,7 @@ def test_solenoid_thick_drift_like(test_context):
1353
1353
  ],
1354
1354
  )
1355
1355
  def test_solenoid_thick_analytic(test_context, length, expected):
1356
- solenoid = xt.Solenoid(
1356
+ solenoid = xt.UniformSolenoid(
1357
1357
  ks=1,
1358
1358
  length=length,
1359
1359
  _context=test_context,
@@ -1392,8 +1392,9 @@ def test_solenoid_with_mult_kicks(test_context, backtrack):
1392
1392
  knl = np.array([0.1, 0.4, 0.5])
1393
1393
  ksl = np.array([0.2, 0.3, 0.6])
1394
1394
 
1395
- solenoid_with_kicks = xt.Solenoid(
1395
+ solenoid_with_kicks = xt.UniformSolenoid(
1396
1396
  length=length,
1397
+ integrator='uniform',
1397
1398
  ks=ks,
1398
1399
  num_multipole_kicks=num_kicks,
1399
1400
  knl=knl,
@@ -1402,11 +1403,11 @@ def test_solenoid_with_mult_kicks(test_context, backtrack):
1402
1403
 
1403
1404
  line_ref = xt.Line(
1404
1405
  elements=[
1405
- xt.Solenoid(length=length / (num_kicks + 1), ks=ks),
1406
+ xt.UniformSolenoid(length=length / (num_kicks)/2, ks=ks),
1406
1407
  xt.Multipole(knl=knl / num_kicks, ksl=ksl / num_kicks),
1407
- xt.Solenoid(length=length / (num_kicks + 1), ks=ks),
1408
+ xt.UniformSolenoid(length=length / (num_kicks), ks=ks),
1408
1409
  xt.Multipole(knl=knl / num_kicks, ksl=ksl / num_kicks),
1409
- xt.Solenoid(length=length / (num_kicks + 1), ks=ks),
1410
+ xt.UniformSolenoid(length=length / (num_kicks) /2, ks=ks),
1410
1411
  ],
1411
1412
  element_names=[
1412
1413
  'sol_0', 'kick_0', 'sol_1', 'kick_1', 'sol_2',
@@ -1457,7 +1458,7 @@ def test_solenoid_shifted_and_rotated_multipolar_kick(test_context):
1457
1458
  mult_rot_y_rad = 0.2
1458
1459
  mult_shift_x = 0.3
1459
1460
 
1460
- solenoid = xt.Solenoid(
1461
+ solenoid = xt.Solenoid( # Need to use legacy one
1461
1462
  ks=ks,
1462
1463
  length=length,
1463
1464
  knl=knl,
@@ -1467,7 +1468,7 @@ def test_solenoid_shifted_and_rotated_multipolar_kick(test_context):
1467
1468
  mult_shift_x=mult_shift_x,
1468
1469
  )
1469
1470
 
1470
- solenoid_no_kick = xt.Solenoid(ks=0.9, length=0.25)
1471
+ solenoid_no_kick = xt.UniformSolenoid(ks=0.9, length=0.25)
1471
1472
  kick = xt.Multipole(knl=np.array(knl) / 3, ksl=np.array(ksl) / 3)
1472
1473
 
1473
1474
  line_test = xt.Line(elements=[solenoid])
@@ -1527,11 +1528,11 @@ def test_solenoid_multipole_shifts(shift_x, shift_y, test_element_name):
1527
1528
  quad = xt.Quadrupole(length=1, k1=K1)
1528
1529
  sext = xt.Sextupole(length=1, k2=K2)
1529
1530
 
1530
- bend_sol = xt.Solenoid(length=1 / N_SLICES, ks=KS,
1531
+ bend_sol = xt.Solenoid(length=1 / N_SLICES, ks=KS, # need legacy
1531
1532
  knl=[K0 * (1 / N_SLICES), 0, 0], num_multipole_kicks=1)
1532
- quad_sol = xt.Solenoid(length=1 / N_SLICES, ks=KS,
1533
+ quad_sol = xt.Solenoid(length=1 / N_SLICES, ks=KS, # need legacy
1533
1534
  knl=[0, K1 * (1 / N_SLICES), 0], num_multipole_kicks=1)
1534
- sext_sol = xt.Solenoid(length=1 / N_SLICES, ks=KS,
1535
+ sext_sol = xt.Solenoid(length=1 / N_SLICES, ks=KS, # need legacy
1535
1536
  knl=[0, 0, K2 * (1 / N_SLICES)], num_multipole_kicks=1)
1536
1537
 
1537
1538
  ################################################################################
@@ -1588,8 +1589,8 @@ def test_solenoid_multipole_shifts(shift_x, shift_y, test_element_name):
1588
1589
  ########################################
1589
1590
  # Assertions
1590
1591
  ########################################
1591
- assert np.isclose(tw.x[-1], tw_sol.x[-1], rtol=1E-6)
1592
- assert np.isclose(tw.y[-1], tw_sol.y[-1], rtol=1E-6)
1592
+ xo.assert_allclose(tw.x[-1], tw_sol.x[-1], rtol=2E-6)
1593
+ xo.assert_allclose(tw.y[-1], tw_sol.y[-1], rtol=2E-6)
1593
1594
 
1594
1595
 
1595
1596
  def test_solenoid_multipole_rotations():
@@ -1613,7 +1614,7 @@ def test_solenoid_multipole_rotations():
1613
1614
  bl_components_out = [env.new('bl_drift1', xt.Drift, length=1)]
1614
1615
 
1615
1616
  bl_components_sol = [
1616
- env.new(f'bl_sol.{i}', xt.Solenoid,
1617
+ env.new(f'bl_sol.{i}', xt.UniformSolenoid,
1617
1618
  length=(L_SOL / N_SLICES),
1618
1619
  ks=0,
1619
1620
  knl=[K0 * (L_SOL / N_SLICES), 0, 0],
@@ -1637,7 +1638,7 @@ def test_solenoid_multipole_rotations():
1637
1638
  env.new('hrot_drift1', xt.Drift, length=1)]
1638
1639
 
1639
1640
  hrot_components_sol = [
1640
- env.new(f'hrot_sol.{i}', xt.Solenoid,
1641
+ env.new(f'hrot_sol.{i}', xt.Solenoid, # need legacy
1641
1642
  length=(L_SOL / N_SLICES) * np.cos(XING_RAD),
1642
1643
  ks=0,
1643
1644
  knl=[K0 * (L_SOL / N_SLICES), 0, 0],
@@ -1663,7 +1664,7 @@ def test_solenoid_multipole_rotations():
1663
1664
  env.new('vrot_drift1', xt.Drift, length=1)]
1664
1665
 
1665
1666
  vrot_components_sol = [
1666
- env.new(f'vrot_sol.{i}', xt.Solenoid,
1667
+ env.new(f'vrot_sol.{i}', xt.Solenoid, # need legacy
1667
1668
  length=(L_SOL / N_SLICES) * np.cos(XING_RAD),
1668
1669
  ks=0,
1669
1670
  knl=[K0 * (L_SOL / N_SLICES), 0, 0],
@@ -1753,7 +1754,7 @@ def test_drift_like_solenoid_with_kicks_radiation(radiation_mode, config):
1753
1754
  ])
1754
1755
 
1755
1756
  line_ref = xt.Line(elements=[
1756
- xt.Solenoid(ks=0, length=1, knl=knl, ksl=ksl, num_multipole_kicks=1)
1757
+ xt.UniformSolenoid(ks=0, length=1, knl=knl, ksl=ksl, num_multipole_kicks=1)
1757
1758
  ])
1758
1759
 
1759
1760
  coords = np.linspace(-0.05, 0.05, 10)
@@ -1809,9 +1810,9 @@ def test_solenoid_with_kicks_radiation(radiation_mode, config):
1809
1810
  knl = [0.1, 0.4, 0.5]
1810
1811
  ksl = [0.2, 0.3, 0.6]
1811
1812
 
1812
- sol_ref = xt.Solenoid(ks=ks, length=l)
1813
- sol_1 = xt.Solenoid(ks=ks, length=l, knl=knl, ksl=ksl, num_multipole_kicks=1)
1814
- sol_3 = xt.Solenoid(ks=ks, length=l, knl=knl, ksl=ksl, num_multipole_kicks=3)
1813
+ sol_ref = xt.UniformSolenoid(ks=ks, length=l)
1814
+ sol_1 = xt.UniformSolenoid(ks=ks, length=l, knl=knl, ksl=ksl, num_multipole_kicks=1)
1815
+ sol_3 = xt.UniformSolenoid(ks=ks, length=l, knl=knl, ksl=ksl, num_multipole_kicks=3)
1815
1816
 
1816
1817
  line_ref = xt.Line(elements=[sol_ref])
1817
1818
  line_1 = xt.Line(elements=[sol_1])
@@ -1852,7 +1853,7 @@ def test_solenoid_with_kicks_radiation(radiation_mode, config):
1852
1853
  d_delta_3 = p_3.delta - p0.delta
1853
1854
 
1854
1855
  xo.assert_allclose(
1855
- d_delta_1 - d_delta_ref, d_delta_3 - d_delta_ref, rtol=0.01, atol=1e-15
1856
+ d_delta_1 - d_delta_ref, d_delta_3 - d_delta_ref, rtol=0.01, atol=2e-15
1856
1857
  )
1857
1858
 
1858
1859
 
@@ -2197,3 +2198,167 @@ def test_configure_model():
2197
2198
  assert line['o1'].edge_exit_active == False
2198
2199
  assert line['o1'].integrator == 'uniform'
2199
2200
  assert line['o1'].num_multipole_kicks == 7
2201
+
2202
+ @for_all_test_contexts
2203
+ @pytest.mark.parametrize('reference', ['legacy', 'variable'])
2204
+ def test_uniform_solenoid_with_slices(test_context, reference):
2205
+
2206
+ length = 3.
2207
+ ks = 2.
2208
+
2209
+ sol = xt.UniformSolenoid(length=length, ks=ks, _context=test_context)
2210
+
2211
+ if reference == 'legacy':
2212
+ # Check against legacy solenoid
2213
+ ref_sol = xt.Solenoid(length=length, ks=ks) # Old solenoid
2214
+ elif reference == 'variable':
2215
+ # Check against variable solenoid
2216
+ ref_sol = xt.VariableSolenoid(length=length, ks_profile=[ks, ks])
2217
+ else:
2218
+ raise ValueError("Reference must be 'legacy' or 'variable'")
2219
+
2220
+ p0 = xt.Particles(p0c=1e9, x=1e-3, y=2e-3)
2221
+
2222
+ p = p0.copy(_context=test_context)
2223
+ p_ref = p0.copy()
2224
+
2225
+ sol.track(p)
2226
+ ref_sol.track(p_ref)
2227
+
2228
+ xo.assert_allclose(p.x, p_ref.x, rtol=0, atol=1e-10)
2229
+ xo.assert_allclose(p.y, p_ref.y, rtol=0, atol=1e-10)
2230
+ xo.assert_allclose(p.px, p_ref.px, rtol=0, atol=1e-10)
2231
+ xo.assert_allclose(p.py, p_ref.py, rtol=0, atol=1e-10)
2232
+ xo.assert_allclose(p.delta, p_ref.delta, rtol=0, atol=1e-10)
2233
+ xo.assert_allclose(p.ax, 0., rtol=0, atol=1e-10)
2234
+ xo.assert_allclose(p.ay, 0., rtol=0, atol=1e-10)
2235
+ xo.assert_allclose(p.kin_px, p_ref.px, rtol=0, atol=1e-10)
2236
+ xo.assert_allclose(p.kin_py, p_ref.py, rtol=0, atol=1e-10)
2237
+
2238
+ sol.edge_exit_active = False
2239
+ p = p0.copy(_context=test_context)
2240
+ sol.track(p)
2241
+
2242
+ xo.assert_allclose(p.x, p_ref.x, rtol=0, atol=1e-10)
2243
+ xo.assert_allclose(p.y, p_ref.y, rtol=0, atol=1e-10)
2244
+ xo.assert_allclose(p.px, p_ref.px, rtol=0, atol=1e-10)
2245
+ xo.assert_allclose(p.py, p_ref.py, rtol=0, atol=1e-10)
2246
+ xo.assert_allclose(p.delta, p_ref.delta, rtol=0, atol=1e-10)
2247
+ xo.assert_allclose(p.ax, p_ref.ax, rtol=0, atol=1e-10)
2248
+ xo.assert_allclose(p.ay, p_ref.ay, rtol=0, atol=1e-10)
2249
+ xo.assert_allclose(p.kin_px, p_ref.kin_px, rtol=0, atol=1e-10)
2250
+ xo.assert_allclose(p.kin_py, p_ref.kin_py, rtol=0, atol=1e-10)
2251
+
2252
+ p0_for_backtrack = p.copy()
2253
+ p_for_backtrack = p0_for_backtrack.copy(_context=test_context)
2254
+ lsol = xt.Line([sol])
2255
+ lsol.build_tracker(_context=test_context)
2256
+
2257
+ sol.edge_entry_active = True
2258
+ sol.edge_exit_active = True
2259
+
2260
+ lsol.track(p_for_backtrack, backtrack=True)
2261
+ xo.assert_allclose(p_for_backtrack.x, p0.x, rtol=0, atol=1e-10)
2262
+ xo.assert_allclose(p_for_backtrack.y, p0.y, rtol=0, atol=1e-10)
2263
+ xo.assert_allclose(p_for_backtrack.px, p0.px, rtol=0, atol=1e-10)
2264
+ xo.assert_allclose(p_for_backtrack.py, p0.py, rtol=0, atol=1e-10)
2265
+ xo.assert_allclose(p_for_backtrack.delta, p0.delta, rtol=0, atol=1e-10)
2266
+ xo.assert_allclose(p_for_backtrack.ax, 0., rtol=0, atol=1e-10)
2267
+ xo.assert_allclose(p_for_backtrack.ay, 0., rtol=0, atol=1e-10)
2268
+ xo.assert_allclose(p_for_backtrack.kin_px, p0.px, rtol=0, atol=1e-10)
2269
+ xo.assert_allclose(p_for_backtrack.kin_py, p0.py, rtol=0, atol=1e-10)
2270
+
2271
+ sol.edge_entry_active = False
2272
+ p_for_backtrack = p0_for_backtrack.copy(_context=test_context)
2273
+ lsol.track(p_for_backtrack, backtrack=True)
2274
+ xo.assert_allclose(p_for_backtrack.x, p0.x, rtol=0, atol=1e-10)
2275
+ xo.assert_allclose(p_for_backtrack.y, p0.y, rtol=0, atol=1e-10)
2276
+ xo.assert_allclose(p_for_backtrack.px, p0.px, rtol=0, atol=1e-10)
2277
+ xo.assert_allclose(p_for_backtrack.py, p0.py, rtol=0, atol=1e-10)
2278
+ xo.assert_allclose(p_for_backtrack.delta, p0.delta, rtol=0, atol=1e-10)
2279
+ xo.assert_allclose(p_for_backtrack.ax, -ks /2 *p0.y, rtol=0, atol=1e-10)
2280
+ xo.assert_allclose(p_for_backtrack.ay, ks /2 *p0.x, rtol=0, atol=1e-10)
2281
+ xo.assert_allclose(p_for_backtrack.kin_px, p0.px + ks /2 *p0.y, rtol=0, atol=1e-10)
2282
+ xo.assert_allclose(p_for_backtrack.kin_py, p0.py - ks /2 *p0.x, rtol=0, atol=1e-10)
2283
+
2284
+
2285
+ sol.edge_entry_active = True
2286
+ sol.edge_exit_active = True
2287
+
2288
+ lsol_sliced = lsol.copy(shallow=True)
2289
+ lsol_sliced.cut_at_s([length / 3, 2 * length / 3])
2290
+ lsol_sliced.build_tracker(_context=test_context)
2291
+ tt_sliced = lsol_sliced.get_table(attr=True)
2292
+
2293
+ assert np.all(tt_sliced.name == np.array(
2294
+ ['e0_entry', 'e0..entry_map', 'e0..0', 'e0..1', 'e0..2',
2295
+ 'e0..exit_map', 'e0_exit', '_end_point']))
2296
+
2297
+ xo.assert_allclose(tt_sliced.s, np.array([0., 0., 0., 1., 2., 3., 3., 3.]),
2298
+ rtol=0, atol=1e-10)
2299
+
2300
+ assert np.all(tt_sliced.element_type == np.array(
2301
+ ['Marker', 'ThinSliceUniformSolenoidEntry',
2302
+ 'ThickSliceUniformSolenoid', 'ThickSliceUniformSolenoid',
2303
+ 'ThickSliceUniformSolenoid', 'ThinSliceUniformSolenoidExit',
2304
+ 'Marker', '']))
2305
+
2306
+ lsol_sliced.particle_ref = xt.Particles(p0c=100e9)
2307
+ tw = lsol_sliced.twiss(x=p0.x, px=p0.px, y=p0.y, py=p0.py, betx=1, bety=1)
2308
+ p_ref = p0.copy()
2309
+ ref_sol.track(p_ref)
2310
+
2311
+ xo.assert_allclose(tw.x[-1], p_ref.x, rtol=0, atol=1e-10)
2312
+ xo.assert_allclose(tw.px[-1], p_ref.px, rtol=0, atol=1e-10)
2313
+ xo.assert_allclose(tw.y[-1], p_ref.y, rtol=0, atol=1e-10)
2314
+ xo.assert_allclose(tw.py[-1], p_ref.py, rtol=0, atol=1e-10)
2315
+ xo.assert_allclose(tw.delta[-1], p_ref.delta, rtol=0, atol=1e-10)
2316
+
2317
+ tw['ax'] = tw.px - tw.kin_px
2318
+ tw['ay'] = tw.py - tw.kin_py
2319
+
2320
+ # tw.cols['ax ay'] should look as follows:
2321
+ # TwissTable: 8 rows, 3 cols
2322
+ # name ax ay
2323
+ # e0_entry 0 0
2324
+ # e0..entry_map 0 0
2325
+ # e0..0 -0.002 0.001
2326
+ # e0..1 -0.000129201 0.00120122
2327
+ # e0..2 -0.000724768 -0.000583627
2328
+ # e0..exit_map -0.00209988 0.000700686
2329
+ # e0_exit 0 0
2330
+ # _end_point 0 0
2331
+
2332
+ tw_before = tw.rows[:'e0..entry_map']
2333
+ tw_inside = tw.rows['e0..0':'e0..exit_map']
2334
+ tw_after = tw.rows['e0_exit':]
2335
+
2336
+ xo.assert_allclose(tw_before.ax, 0, rtol=0, atol=1e-20)
2337
+ xo.assert_allclose(tw_before.ay, 0, rtol=0, atol=1e-20)
2338
+ xo.assert_allclose(tw_inside.ax, -0.5 * ks * tw_inside.y, rtol=0, atol=1e-15)
2339
+ xo.assert_allclose(tw_inside.ay, 0.5 * ks * tw_inside.x, rtol=0, atol=1e-15)
2340
+ xo.assert_allclose(tw_after.ax, 0, rtol=0, atol=1e-20)
2341
+ xo.assert_allclose(tw_after.ay, 0, rtol=0, atol=1e-20)
2342
+
2343
+ # Twiss backwards
2344
+ tw_back = lsol_sliced.twiss(init=tw.get_twiss_init('e0_exit'))
2345
+ tw_back['ax'] = tw_back.px - tw_back.kin_px
2346
+ tw_back['ay'] = tw_back.py - tw_back.kin_py
2347
+
2348
+ xo.assert_allclose(tw_back.x, tw.x, rtol=0, atol=1e-10)
2349
+ xo.assert_allclose(tw_back.px, tw.px, rtol=0, atol=1e-10)
2350
+ xo.assert_allclose(tw_back.y, tw.y, rtol=0, atol=1e-10)
2351
+ xo.assert_allclose(tw_back.py, tw.py, rtol=0, atol=1e-10)
2352
+ xo.assert_allclose(tw_back.delta, tw.delta, rtol=0, atol=1e-10)
2353
+ xo.assert_allclose(tw_back.ax, tw.ax, rtol=0, atol=1e-10)
2354
+ xo.assert_allclose(tw_back.ay, tw.ay, rtol=0, atol=1e-10)
2355
+
2356
+ sol.edge_entry_active = False
2357
+ tw_back = lsol_sliced.twiss(init=tw.get_twiss_init('e0_exit'))
2358
+ tw_back['ax'] = tw_back.px - tw_back.kin_px
2359
+ tw_back['ay'] = tw_back.py - tw_back.kin_py
2360
+
2361
+ xo.assert_allclose(tw_back.rows[:'e0..0'].ax, tw['ax', 'e0..0'],
2362
+ rtol=0, atol=1e-10)
2363
+ xo.assert_allclose(tw_back.rows[:'e0..0'].ay, tw['ay', 'e0..0'],
2364
+ rtol=0, atol=1e-10)
@@ -60,13 +60,14 @@ def test_fcc_ee_solenoid_correction():
60
60
 
61
61
  P0_J = line.particle_ref.p0c[0] * qe / clight
62
62
  brho = P0_J / qe / line.particle_ref.q0
63
- ks = 0.5 * (bz_sol_slices[:-1] + bz_sol_slices[1:]) / brho
63
+ ks_entry = bz_sol_slices[:-1] / brho
64
+ ks_exit = bz_sol_slices[1:] / brho
64
65
  l_sol_slices = np.diff(s_sol_slices)
65
66
  s_sol_slices_entry = s_sol_slices[:-1]
66
67
 
67
68
  sol_slices = []
68
69
  for ii in range(len(s_sol_slices_entry)):
69
- sol_slices.append(xt.Solenoid(length=l_sol_slices[ii], ks=0)) # Off for now
70
+ sol_slices.append(xt.VariableSolenoid(length=l_sol_slices[ii], ks_profile=[0, 0])) # Off for now
70
71
 
71
72
  s_ip = tt['s', ip_sol]
72
73
 
@@ -86,8 +87,8 @@ def test_fcc_ee_solenoid_correction():
86
87
  line.element_dict['sol_start_shift_'+ip_sol] = sol_start_shift
87
88
  line.element_dict['sol_end_shift_'+ip_sol] = sol_end_shift
88
89
 
89
- line.element_dict['sol_entry_'+ip_sol] = xt.Solenoid(length=0, ks=0)
90
- line.element_dict['sol_exit_'+ip_sol] = xt.Solenoid(length=0, ks=0)
90
+ line.element_dict['sol_entry_'+ip_sol] = xt.Marker()
91
+ line.element_dict['sol_exit_'+ip_sol] = xt.Marker()
91
92
 
92
93
  sol_slice_names = []
93
94
  sol_slice_names.append('sol_entry_'+ip_sol)
@@ -123,7 +124,8 @@ def test_fcc_ee_solenoid_correction():
123
124
  line.vars['on_sol_'+ip_sol] = 0
124
125
  for ii in range(len(s_sol_slices_entry)):
125
126
  nn = f'sol_slice_{ii}_{ip_sol}'
126
- line.element_refs[nn].ks = ks[ii] * line.vars['on_sol_'+ip_sol]
127
+ line.element_refs[nn].ks_profile[0] = ks_entry[ii] * line.vars['on_sol_'+ip_sol]
128
+ line.element_refs[nn].ks_profile[1] = ks_exit[ii] * line.vars['on_sol_'+ip_sol]
127
129
 
128
130
  tt = line.get_table()
129
131
 
@@ -60,13 +60,14 @@ def test_fcc_ee_solenoid_correction_new_optimizer_api():
60
60
 
61
61
  P0_J = line.particle_ref.p0c[0] * qe / clight
62
62
  brho = P0_J / qe / line.particle_ref.q0
63
- ks = 0.5 * (bz_sol_slices[:-1] + bz_sol_slices[1:]) / brho
63
+ ks_entry = bz_sol_slices[:-1] / brho
64
+ ks_exit = bz_sol_slices[1:] / brho
64
65
  l_sol_slices = np.diff(s_sol_slices)
65
66
  s_sol_slices_entry = s_sol_slices[:-1]
66
67
 
67
68
  sol_slices = []
68
69
  for ii in range(len(s_sol_slices_entry)):
69
- sol_slices.append(xt.Solenoid(length=l_sol_slices[ii], ks=0)) # Off for now
70
+ sol_slices.append(xt.VariableSolenoid(length=l_sol_slices[ii], ks_profile=[0, 0])) # Off for now
70
71
 
71
72
  s_ip = tt['s', ip_sol]
72
73
 
@@ -86,8 +87,8 @@ def test_fcc_ee_solenoid_correction_new_optimizer_api():
86
87
  line.element_dict['sol_start_shift_'+ip_sol] = sol_start_shift
87
88
  line.element_dict['sol_end_shift_'+ip_sol] = sol_end_shift
88
89
 
89
- line.element_dict['sol_entry_'+ip_sol] = xt.Solenoid(length=0, ks=0)
90
- line.element_dict['sol_exit_'+ip_sol] = xt.Solenoid(length=0, ks=0)
90
+ line.element_dict['sol_entry_'+ip_sol] = xt.Marker()
91
+ line.element_dict['sol_exit_'+ip_sol] = xt.Marker()
91
92
 
92
93
  sol_slice_names = []
93
94
  sol_slice_names.append('sol_entry_'+ip_sol)
@@ -123,7 +124,9 @@ def test_fcc_ee_solenoid_correction_new_optimizer_api():
123
124
  line.vars['on_sol_'+ip_sol] = 0
124
125
  for ii in range(len(s_sol_slices_entry)):
125
126
  nn = f'sol_slice_{ii}_{ip_sol}'
126
- line.element_refs[nn].ks = ks[ii] * line.vars['on_sol_'+ip_sol]
127
+ line.element_refs[nn].ks_profile[0] = ks_entry[ii] * line.vars['on_sol_'+ip_sol]
128
+ line.element_refs[nn].ks_profile[1] = ks_exit[ii] * line.vars['on_sol_'+ip_sol]
129
+
127
130
 
128
131
  tt = line.get_table()
129
132
 
@@ -880,6 +880,7 @@ def test_insert_thin_elements_at_s_lhc(test_context):
880
880
  Teapot = xt.Teapot
881
881
  slicing_strategies = [
882
882
  Strategy(slicing=Teapot(1)), # Default catch-all as in MAD-X
883
+ Strategy(slicing=None, element_type=xt.UniformSolenoid),
883
884
  Strategy(slicing=Teapot(4), element_type=xt.Bend),
884
885
  Strategy(slicing=Teapot(20), element_type=xt.Quadrupole),
885
886
  Strategy(slicing=Teapot(2), name=r'^mb\..*'),
@@ -1143,8 +1144,8 @@ def test_line_table_unique_names():
1143
1144
 
1144
1145
  def test_extend_knl_ksl():
1145
1146
 
1146
- classes_to_check = ['Bend', 'Quadrupole', 'Sextupole', 'Octupole', 'Solenoid',
1147
- 'Multipole']
1147
+ classes_to_check = ['Bend', 'Quadrupole', 'Sextupole', 'Octupole', 'UniformSolenoid',
1148
+ 'VariableSolenoid', 'Multipole']
1148
1149
 
1149
1150
  for cc in classes_to_check:
1150
1151
 
@@ -1188,7 +1189,9 @@ def test_extend_knl_ksl():
1188
1189
  'a', 'b', 'c'], ksl=['d', 'e', 'f']),
1189
1190
  env.new('o1', xt.Octupole, length=1, knl=[
1190
1191
  'a', 'b', 'c'], ksl=['d', 'e', 'f']),
1191
- env.new('s2', xt.Solenoid, length=1, knl=[
1192
+ env.new('u1', xt.UniformSolenoid, length=1, knl=[
1193
+ 'a', 'b', 'c'], ksl=['d', 'e', 'f']),
1194
+ env.new('v1', xt.VariableSolenoid, length=1, knl=[
1192
1195
  'a', 'b', 'c'], ksl=['d', 'e', 'f']),
1193
1196
  env.new('m1', xt.Multipole, length=1, knl=[
1194
1197
  'a', 'b', 'c'], ksl=['d', 'e', 'f']),
@@ -1210,7 +1213,7 @@ def test_extend_knl_ksl():
1210
1213
  assert line['q1'].order == order
1211
1214
  assert line['s1'].order == 5
1212
1215
  assert line['o1'].order == 5
1213
- assert line['s2'].order == 5
1216
+ assert line['u1'].order == 5
1214
1217
  assert line['m1'].order == 2
1215
1218
 
1216
1219
  xo.assert_allclose(line['b1'].inv_factorial_order,
@@ -1221,7 +1224,9 @@ def test_extend_knl_ksl():
1221
1224
  1/math.factorial(5), rtol=0, atol=1e-15)
1222
1225
  xo.assert_allclose(line['o1'].inv_factorial_order,
1223
1226
  1/math.factorial(5), rtol=0, atol=1e-15)
1224
- xo.assert_allclose(line['s2'].inv_factorial_order,
1227
+ xo.assert_allclose(line['u1'].inv_factorial_order,
1228
+ 1/math.factorial(5), rtol=0, atol=1e-15)
1229
+ xo.assert_allclose(line['v1'].inv_factorial_order,
1225
1230
  1/math.factorial(5), rtol=0, atol=1e-15)
1226
1231
  xo.assert_allclose(line['m1'].inv_factorial_order,
1227
1232
  1/math.factorial(2), rtol=0, atol=1e-15)
@@ -1242,9 +1247,13 @@ def test_extend_knl_ksl():
1242
1247
  0., 0., 0.], rtol=0, atol=1e-15)
1243
1248
  xo.assert_allclose(line['o1'].ksl, [4., 5., 6.,
1244
1249
  0., 0., 0.], rtol=0, atol=1e-15)
1245
- xo.assert_allclose(line['s2'].knl, [3., 2., 1.,
1250
+ xo.assert_allclose(line['u1'].knl, [3., 2., 1.,
1251
+ 0., 0., 0.], rtol=0, atol=1e-15)
1252
+ xo.assert_allclose(line['u1'].ksl, [4., 5., 6.,
1246
1253
  0., 0., 0.], rtol=0, atol=1e-15)
1247
- xo.assert_allclose(line['s2'].ksl, [4., 5., 6.,
1254
+ xo.assert_allclose(line['v1'].knl, [3., 2., 1.,
1255
+ 0., 0., 0.], rtol=0, atol=1e-15)
1256
+ xo.assert_allclose(line['v1'].ksl, [4., 5., 6.,
1248
1257
  0., 0., 0.], rtol=0, atol=1e-15)
1249
1258
  xo.assert_allclose(line['m1'].knl, [3., 2., 1.], rtol=0, atol=1e-15)
1250
1259
  xo.assert_allclose(line['m1'].ksl, [4., 5., 6.], rtol=0, atol=1e-15)
@@ -1255,13 +1264,15 @@ def test_extend_knl_ksl():
1255
1264
  assert line['q1'].order == 11
1256
1265
  assert line['s1'].order == 11
1257
1266
  assert line['o1'].order == 11
1258
- assert line['s2'].order == 11
1267
+ assert line['u1'].order == 11
1268
+ assert line['v1'].order == 11
1259
1269
  assert line['m1'].order == 11
1260
1270
  assert line['b1'].inv_factorial_order == 1/math.factorial(11)
1261
1271
  assert line['q1'].inv_factorial_order == 1/math.factorial(11)
1262
1272
  assert line['s1'].inv_factorial_order == 1/math.factorial(11)
1263
1273
  assert line['o1'].inv_factorial_order == 1/math.factorial(11)
1264
- assert line['s2'].inv_factorial_order == 1/math.factorial(11)
1274
+ assert line['u1'].inv_factorial_order == 1/math.factorial(11)
1275
+ assert line['v1'].inv_factorial_order == 1/math.factorial(11)
1265
1276
  assert line['m1'].inv_factorial_order == 1/math.factorial(11)
1266
1277
  xo.assert_allclose(line['b1'].knl, [3., 2., 1., 0.,
1267
1278
  0., 0., 0., 0., 0., 0., 0., 0.], rtol=0, atol=1e-15)
@@ -1279,9 +1290,13 @@ def test_extend_knl_ksl():
1279
1290
  0., 0., 0., 0., 0., 0., 0., 0.], rtol=0, atol=1e-15)
1280
1291
  xo.assert_allclose(line['o1'].ksl, [4., 5., 6., 0.,
1281
1292
  0., 0., 0., 0., 0., 0., 0., 0.], rtol=0, atol=1e-15)
1282
- xo.assert_allclose(line['s2'].knl, [3., 2., 1., 0.,
1293
+ xo.assert_allclose(line['u1'].knl, [3., 2., 1., 0.,
1294
+ 0., 0., 0., 0., 0., 0., 0., 0.], rtol=0, atol=1e-15)
1295
+ xo.assert_allclose(line['v1'].ksl, [4., 5., 6., 0.,
1296
+ 0., 0., 0., 0., 0., 0., 0., 0.], rtol=0, atol=1e-15)
1297
+ xo.assert_allclose(line['v1'].knl, [3., 2., 1., 0.,
1283
1298
  0., 0., 0., 0., 0., 0., 0., 0.], rtol=0, atol=1e-15)
1284
- xo.assert_allclose(line['s2'].ksl, [4., 5., 6., 0.,
1299
+ xo.assert_allclose(line['u1'].ksl, [4., 5., 6., 0.,
1285
1300
  0., 0., 0., 0., 0., 0., 0., 0.], rtol=0, atol=1e-15)
1286
1301
  xo.assert_allclose(line['m1'].knl, [3., 2., 1., 0.,
1287
1302
  0., 0., 0., 0., 0., 0., 0., 0.], rtol=0, atol=1e-15)
@@ -29,6 +29,7 @@ def test_mad_writer(case):
29
29
  mad_seq = line.to_madx_sequence(sequence_name='myseq')
30
30
 
31
31
  mad = Madx(stdout=True)
32
+ mad.options.rbarc = False
32
33
  mad.input(mad_seq)
33
34
  mad.beam(particle='proton', energy=7000e9)
34
35
  mad.use('myseq')
@@ -54,7 +55,7 @@ def test_mad_writer(case):
54
55
 
55
56
  assert np.all(tw2.rows['ip.*'].name == tw.rows['ip.*'].name)
56
57
 
57
- xo.assert_allclose(tw2.rows['ip.*'].s, tw.rows['ip.*'].s, rtol=0, atol=2e-9)
58
+ xo.assert_allclose(tw2.rows['ip.*'].s, tw.rows['ip.*'].s, rtol=0, atol=2e-5)
58
59
  xo.assert_allclose(tw2.rows['ip.*'].x, tw.rows['ip.*'].x, rtol=0, atol=1e-9)
59
60
  xo.assert_allclose(tw2.rows['ip.*'].y, tw.rows['ip.*'].y, rtol=0, atol=1e-9)
60
61
  xo.assert_allclose(tw2.rows['ip.*'].px, tw.rows['ip.*'].px, rtol=0, atol=1e-9)
@@ -73,7 +73,7 @@ def test_magnet_exact_drift(test_context):
73
73
  assert magnet.model == 'drift-kick-drift-exact'
74
74
  assert magnet.integrator == 'teapot'
75
75
 
76
- exact_drift = xt.Solenoid(length=2.0, _context=test_context) # Solenoid is exact drift when off
76
+ exact_drift = xt.UniformSolenoid(length=2.0, _context=test_context) # Solenoid is exact drift when off
77
77
 
78
78
  p0 = make_particles(test_context)
79
79
  p_test = p0.copy()
@@ -19,7 +19,7 @@ test_data_folder = (Path(__file__).parent / '../test_data').absolute()
19
19
  def test_simple_parser():
20
20
  sequence = """
21
21
  if (version>=50401){option,-rbarc;}; ! to be ignored
22
-
22
+
23
23
  third = 1 / 3;
24
24
  power = 3^4;
25
25
  hello := third * twopi;
@@ -30,7 +30,7 @@ def test_simple_parser():
30
30
  mb: sbend, l := mb.l, angle := hello;
31
31
  qf: quadrupole, l := 1, k1 := 1;
32
32
  qd: quadrupole, l := 1, k1 := -1;
33
-
33
+
34
34
  line: sequence, l = 12;
35
35
  ip1: marker, at = 0;
36
36
  qf1: qf, at := 1 + offset, from = ip1, slot_id = 1;
@@ -41,7 +41,7 @@ def test_simple_parser():
41
41
  mb1, k0 := hello, polarity = +1;
42
42
  qf1, knl := {0, 0, 0, 0.01, 0};
43
43
  qd1, knl := {0, 0, 0, -0.01, 0};
44
-
44
+
45
45
  return; ! should also be ignored
46
46
  """
47
47
 
@@ -480,7 +480,7 @@ def test_solenoid(example_sequence):
480
480
  # so: solenoid, l=2, ks=3; ! ignore ksi
481
481
  so1 = env['so1/line']
482
482
  xo.assert_allclose(positions['so1/line'], 31)
483
- assert isinstance(so1, xt.Solenoid)
483
+ assert isinstance(so1, xt.UniformSolenoid)
484
484
  assert so1.length == 2
485
485
  assert so1.ks == 3
486
486
 
@@ -683,7 +683,7 @@ def test_reversed_solenoid(example_sequence):
683
683
  # so: solenoid, l=2, ks=3; ! ignore ksi
684
684
  so1 = env['so1/line_reversed']
685
685
  xo.assert_allclose(positions_reversed['so1/line_reversed'], 36 - 31)
686
- assert isinstance(so1, xt.Solenoid)
686
+ assert isinstance(so1, xt.UniformSolenoid)
687
687
  assert so1.length == 2
688
688
  assert so1.ks == -3
689
689
 
@@ -151,12 +151,12 @@ def test_eq_emitt(conf):
151
151
  elif not tilt_machine_by_90_degrees and vertical_orbit_distortion and not wiggler_on:
152
152
  xo.assert_allclose(ex, 7.0910e-10, atol=0, rtol=1e-4)
153
153
  xo.assert_allclose(ey, 2.2195e-12, atol=0, rtol=7e-3)
154
- xo.assert_allclose(ez, 3.5607e-6, atol=0, rtol=1e-4)
154
+ xo.assert_allclose(ez, 3.5607e-6, atol=0, rtol=2e-4)
155
155
  checked = True
156
156
  elif tilt_machine_by_90_degrees and vertical_orbit_distortion and not wiggler_on:
157
157
  xo.assert_allclose(ex, 2.2154e-12, atol=0, rtol=7e-3)
158
158
  xo.assert_allclose(ey, 7.0911e-10, atol=0, rtol=1e-4)
159
- xo.assert_allclose(ez, 3.5607e-6, atol=0, rtol=1e-4)
159
+ xo.assert_allclose(ez, 3.5607e-6, atol=0, rtol=2e-4)
160
160
  checked = True
161
161
  else:
162
162
  raise ValueError('Unknown configuration')
@@ -661,7 +661,7 @@ def test_thick_slice_octupole(test_context):
661
661
  @for_all_test_contexts
662
662
  def test_thick_slice_solenoid(test_context):
663
663
 
664
- sol = xt.Solenoid(ks=0.1, length=1)
664
+ sol = xt.UniformSolenoid(ks=0.1, length=1)
665
665
 
666
666
  line = xt.Line(elements=[sol])
667
667
 
@@ -688,12 +688,12 @@ def test_thick_slice_solenoid(test_context):
688
688
 
689
689
  line.to_json('ttt_thick_solenoid.json')
690
690
  line2 = xt.Line.from_json('ttt_thick_solenoid.json')
691
- assert isinstance(line2['e0..0'], xt.ThickSliceSolenoid)
691
+ assert isinstance(line2['e0..0'], xt.ThickSliceUniformSolenoid)
692
692
  assert line2['e0..0'].parent_name == 'e0'
693
693
  assert line2['e0..0']._parent is None
694
694
 
695
695
  line2.build_tracker(_context=test_context)
696
- assert isinstance(line2['e0..0'], xt.ThickSliceSolenoid)
696
+ assert isinstance(line2['e0..0'], xt.ThickSliceUniformSolenoid)
697
697
  assert line2['e0..0'].parent_name == 'e0'
698
698
  assert line2['e0..0']._parent is line2.element_dict['e0']
699
699