xtrack 0.94.2__tar.gz → 0.95.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 (361) hide show
  1. {xtrack-0.94.2/xtrack.egg-info → xtrack-0.95.0}/PKG-INFO +1 -1
  2. xtrack-0.95.0/tests/test_atomic_add.py +90 -0
  3. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_element_internal_record.py +0 -1
  4. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_elements.py +15 -1
  5. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_elements_thick.py +12 -16
  6. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_madnginterface.py +26 -8
  7. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_misalign.py +254 -27
  8. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_native_madloader.py +47 -15
  9. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_native_madloader_lhc.py +23 -0
  10. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_slicing.py +127 -77
  11. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_spin.py +255 -0
  12. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_tilt_shifts.py +3 -6
  13. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_twiss.py +1 -1
  14. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +2 -2
  15. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/python_lattice_writer/lattice_py_generation.py +2 -1
  16. xtrack-0.95.0/xtrack/_version.py +1 -0
  17. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/base_element.py +95 -234
  18. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements.py +7 -0
  19. xtrack-0.95.0/xtrack/beam_elements/elements_src/_generate_slice_elements_c_code.py +310 -0
  20. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/bend.h +1 -1
  21. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/misalignment.h +3 -2
  22. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/rbend.h +1 -1
  23. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/srotation.h +0 -13
  24. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_bend.h +1 -1
  25. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +1 -1
  26. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_bend.h +1 -1
  27. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +1 -1
  28. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +1 -1
  29. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +1 -1
  30. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +1 -1
  31. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +1 -1
  32. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet.h +0 -1
  33. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +28 -23
  34. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_misalignments.h +18 -15
  35. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_srotation.h +13 -0
  36. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_xrotation.h +13 -0
  37. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_yrotation.h +13 -0
  38. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/xrotation.h +0 -13
  39. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/yrotation.h +0 -13
  40. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/slice_base.py +1 -0
  41. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/slice_elements_drift.py +4 -2
  42. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/environment.py +79 -23
  43. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/footprint.py +3 -0
  44. xtrack-0.95.0/xtrack/headers/atomicadd.h +350 -0
  45. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/headers/particle_states.h +1 -0
  46. xtrack-0.95.0/xtrack/headers/track_local_particle_with_transformations.h +208 -0
  47. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/internal_record.py +14 -12
  48. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/line.py +44 -67
  49. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/mad_loader.py +5 -5
  50. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/mad_parser/loader.py +48 -58
  51. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/mad_parser/madx.lark +3 -2
  52. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/mad_parser/parse.py +6 -3
  53. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/mad_writer.py +23 -13
  54. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/madng_interface.py +3 -0
  55. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/particles/particles.py +3 -0
  56. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/slicing.py +32 -18
  57. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/track_flags.py +3 -3
  58. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/twiss.py +8 -3
  59. {xtrack-0.94.2 → xtrack-0.95.0/xtrack.egg-info}/PKG-INFO +1 -1
  60. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack.egg-info/SOURCES.txt +3 -0
  61. xtrack-0.94.2/xtrack/_version.py +0 -1
  62. xtrack-0.94.2/xtrack/headers/atomicadd.h +0 -41
  63. {xtrack-0.94.2 → xtrack-0.95.0}/LICENSE +0 -0
  64. {xtrack-0.94.2 → xtrack-0.95.0}/MANIFEST.in +0 -0
  65. {xtrack-0.94.2 → xtrack-0.95.0}/README.md +0 -0
  66. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/__init__.py +0 -0
  67. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/base_classes.py +0 -0
  68. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/BB6D.py +0 -0
  69. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  70. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/__init__.py +0 -0
  71. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/beambeam.py +0 -0
  72. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/boost.py +0 -0
  73. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  74. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  75. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/qgauss.py +0 -0
  76. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/slicing.py +0 -0
  77. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/be_beamfields/spacecharge.py +0 -0
  78. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/elements.py +0 -0
  79. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/line.py +0 -0
  80. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/mathlibs.py +0 -0
  81. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/particles.py +0 -0
  82. {xtrack-0.94.2 → xtrack-0.95.0}/ducktrack/temp_pyparticles.py +0 -0
  83. {xtrack-0.94.2 → xtrack-0.95.0}/pyproject.toml +0 -0
  84. {xtrack-0.94.2 → xtrack-0.95.0}/setup.cfg +0 -0
  85. {xtrack-0.94.2 → xtrack-0.95.0}/setup.py +0 -0
  86. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_acceleration.py +0 -0
  87. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_amplitude_detuning.py +0 -0
  88. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_aperture_table.py +0 -0
  89. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  90. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_apertures.py +0 -0
  91. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_attr_replicas_and_slices.py +0 -0
  92. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_boris_spatial.py +0 -0
  93. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_bucket_with_ref_energy_change.py +0 -0
  94. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_cavity_absolute_time.py +0 -0
  95. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_chromatic_functions_vs_madx.py +0 -0
  96. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_coasting.py +0 -0
  97. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_collective_tracker.py +0 -0
  98. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_collimation.py +0 -0
  99. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_coupling_edwards_teng.py +0 -0
  100. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_electron_cooler.py +0 -0
  101. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_element_characterization_functions.py +0 -0
  102. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_elements_classflags.py +0 -0
  103. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_environment.py +0 -0
  104. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  105. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  106. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_footprint.py +0 -0
  107. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_freeze_longitudinal.py +0 -0
  108. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_full_rings.py +0 -0
  109. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_h6_sps_beamline.py +0 -0
  110. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_hvkick.py +0 -0
  111. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_ions.py +0 -0
  112. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_json.py +0 -0
  113. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_legacy_multiline_to_env.py +0 -0
  114. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_lhc_env.py +0 -0
  115. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_lhc_match_phase_15.py +0 -0
  116. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_line.py +0 -0
  117. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_load.py +0 -0
  118. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_load_vars.py +0 -0
  119. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_lumi.py +0 -0
  120. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_mad_writer.py +0 -0
  121. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_madloader.py +0 -0
  122. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_magnet.py +0 -0
  123. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_match_and_track_from_element.py +0 -0
  124. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_match_coupling_knob.py +0 -0
  125. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_match_nested.py +0 -0
  126. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_match_optics_and_ip_knob.py +0 -0
  127. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  128. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_match_orbit_bump.py +0 -0
  129. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_match_tune_chroma_cminus.py +0 -0
  130. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_monitor.py +0 -0
  131. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_multi_bunch_gauss.py +0 -0
  132. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_multiline.py +0 -0
  133. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_multisetter.py +0 -0
  134. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_multispecies.py +0 -0
  135. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_optimize_for_tracking.py +0 -0
  136. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_particles.py +0 -0
  137. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_particles_basics.py +0 -0
  138. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_particles_pdg.py +0 -0
  139. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_pipeline.py +0 -0
  140. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_prebuild_kernels.py +0 -0
  141. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_ps_against_ptc.py +0 -0
  142. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_ps_multiturn_twiss.py +0 -0
  143. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_psb_chicane.py +0 -0
  144. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_pyht_interface.py +0 -0
  145. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_quadrupole_fringe_ptc.py +0 -0
  146. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_quadrupole_wedge.py +0 -0
  147. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_radial_steering.py +0 -0
  148. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_radiation.py +0 -0
  149. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_radiation_equilibrium_emittances.py +0 -0
  150. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  151. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_radiation_integrals.py +0 -0
  152. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_random_gen.py +0 -0
  153. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_random_gen_exp.py +0 -0
  154. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_random_gen_gauss.py +0 -0
  155. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_random_gen_ruth.py +0 -0
  156. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_rbend_rbarc.py +0 -0
  157. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_rbend_straight_body.py +0 -0
  158. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_rf_track.py +0 -0
  159. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_rotation_signs.py +0 -0
  160. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_second_order_taylor_map.py +0 -0
  161. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_seeds.py +0 -0
  162. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_slice_and_insert_with_replicas.py +0 -0
  163. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_slice_elements.py +0 -0
  164. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  165. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
  166. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_spacecharge_in_ring.py +0 -0
  167. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_sps_thick.py +0 -0
  168. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_survey.py +0 -0
  169. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_tapering.py +0 -0
  170. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_thick_kickers_rf_crab.py +0 -0
  171. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_thick_lhc.py +0 -0
  172. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_tracker.py +0 -0
  173. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_trajectory_correcton.py +0 -0
  174. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_twiss_to_file.py +0 -0
  175. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_twiss_vs_madx_psb.py +0 -0
  176. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_vs_madx.py +0 -0
  177. {xtrack-0.94.2 → xtrack-0.95.0}/tests/test_xmask_orbit_correction.py +0 -0
  178. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/__init__.py +0 -0
  179. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/__init__.py +0 -0
  180. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  181. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  182. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  183. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/lhc_match/__init__.py +0 -0
  184. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  185. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  186. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/_temp/python_lattice_writer/__init__.py +0 -0
  187. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/aperture_meas.py +0 -0
  188. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/__init__.py +0 -0
  189. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/apertures.py +0 -0
  190. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  191. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  192. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  193. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  194. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  195. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  196. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/beam_interaction.py +0 -0
  197. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  198. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/crab_cavity.h +0 -0
  199. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
  200. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  201. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  202. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift.h +0 -0
  203. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_exact.h +0 -0
  204. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_exact_slice.h +0 -0
  205. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
  206. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  207. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_cavity.h +0 -0
  208. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_crab_cavity.h +0 -0
  209. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_multipole.h +0 -0
  210. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  211. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  212. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  213. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  214. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
  215. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
  216. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/elens.h +0 -0
  217. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  218. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  219. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
  220. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  221. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  222. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  223. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  224. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  225. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/marker.h +0 -0
  226. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  227. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  228. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  229. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  230. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  231. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  232. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  233. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  234. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  235. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  236. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  237. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/slnd.h +0 -0
  238. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/temprf.h +0 -0
  239. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_cavity.h +0 -0
  240. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_crab_cavity.h +0 -0
  241. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_multipole.h +0 -0
  242. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  243. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  244. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  245. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
  246. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_cavity.h +0 -0
  247. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_crab_cavity.h +0 -0
  248. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_multipole.h +0 -0
  249. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  250. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  251. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  252. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  253. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  254. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  255. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  256. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  257. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  258. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
  259. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
  260. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  261. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  262. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  263. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
  264. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
  265. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
  266. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
  267. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet.template.h +0 -0
  268. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_configure.h +0 -0
  269. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  270. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
  271. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  272. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  273. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_rf.h +0 -0
  274. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_rf.template.h +0 -0
  275. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  276. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  277. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  278. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_xyshift.h +0 -0
  279. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
  280. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  281. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/wire.h +0 -0
  282. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  283. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  284. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/exciter.py +0 -0
  285. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/rft_element.py +0 -0
  286. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/slice_elements_edge.py +0 -0
  287. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  288. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/beam_elements/slice_elements_thin.py +0 -0
  289. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/boris.py +0 -0
  290. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/builder.py +0 -0
  291. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/functions.py +0 -0
  292. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/general.py +0 -0
  293. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/headers/checks.h +0 -0
  294. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/headers/constants.h +0 -0
  295. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/headers/synrad_spectrum.h +0 -0
  296. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/headers/track.h +0 -0
  297. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/json.py +0 -0
  298. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/linear_normal_form.py +0 -0
  299. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/load.py +0 -0
  300. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/loss_location_refinement/__init__.py +0 -0
  301. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  302. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/lumi.py +0 -0
  303. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/mad_parser/__init__.py +0 -0
  304. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/match.py +0 -0
  305. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/__init__.py +0 -0
  306. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/beam_position_monitor.h +0 -0
  307. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/beam_position_monitor.py +0 -0
  308. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/beam_profile_monitor.h +0 -0
  309. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/beam_profile_monitor.py +0 -0
  310. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/beam_size_monitor.h +0 -0
  311. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/beam_size_monitor.py +0 -0
  312. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/last_turns_monitor.h +0 -0
  313. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/last_turns_monitor.py +0 -0
  314. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/particles_monitor.h +0 -0
  315. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/monitors/particles_monitor.py +0 -0
  316. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/multiline.py +0 -0
  317. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/multiline_legacy/__init__.py +0 -0
  318. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  319. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/multiline_legacy/shared_knobs.py +0 -0
  320. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/multisetter/__init__.py +0 -0
  321. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/multisetter/multisetter.py +0 -0
  322. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/particles/__init__.py +0 -0
  323. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/particles/constants.py +0 -0
  324. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/particles/masses.py +0 -0
  325. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/particles/pdg.py +0 -0
  326. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/particles/rng_src/base_rng.h +0 -0
  327. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/particles/rng_src/particles_rng.h +0 -0
  328. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/pipeline/__init__.py +0 -0
  329. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/pipeline/core.py +0 -0
  330. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/pipeline/manager.py +0 -0
  331. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/pipeline/multitracker.py +0 -0
  332. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/prebuilt_kernel_definitions/__init__.py +0 -0
  333. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/prebuilt_kernel_definitions/element_inits.py +0 -0
  334. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/prebuilt_kernel_definitions/element_types.py +0 -0
  335. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/progress_indicator.py +0 -0
  336. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/random/__init__.py +0 -0
  337. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/random/random_generators.py +0 -0
  338. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/random/random_src/exponential.h +0 -0
  339. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  340. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/random/random_src/normal.h +0 -0
  341. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/random/random_src/rutherford.h +0 -0
  342. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/random/random_src/uniform.h +0 -0
  343. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/random/random_src/uniform_accurate.h +0 -0
  344. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/survey.py +0 -0
  345. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/svgutils/__init__.py +0 -0
  346. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/svgutils/parser.py +0 -0
  347. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/svgutils/path.py +0 -0
  348. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/svgutils/svgutils.py +0 -0
  349. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/synctime.py +0 -0
  350. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/table.py +0 -0
  351. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/tapering.py +0 -0
  352. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/targets.py +0 -0
  353. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/tracker.py +0 -0
  354. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/tracker_data.py +0 -0
  355. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/tracker_src/tracker.h +0 -0
  356. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/trajectory_correction.py +0 -0
  357. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/twissplot.py +0 -0
  358. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack/view.py +0 -0
  359. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack.egg-info/dependency_links.txt +0 -0
  360. {xtrack-0.94.2 → xtrack-0.95.0}/xtrack.egg-info/requires.txt +0 -0
  361. {xtrack-0.94.2 → xtrack-0.95.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.94.2
3
+ Version: 0.95.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
@@ -0,0 +1,90 @@
1
+ # copyright ############################### #
2
+ # This file is part of the Xtrack Package. #
3
+ # Copyright (c) CERN, 2025. #
4
+ # ######################################### #
5
+
6
+ import pytest
7
+ import numpy as np
8
+
9
+ import xtrack as xt
10
+ import xobjects as xo
11
+ from xobjects.test_helpers import for_all_test_contexts
12
+
13
+
14
+ @for_all_test_contexts
15
+ @pytest.mark.parametrize("overload", [True, False], ids=['overload', 'no_overload'])
16
+ @pytest.mark.parametrize("ctype", [xo.Int8, xo.Int16, xo.Int32, xo.Int64,
17
+ xo.UInt8, xo.UInt16, xo.UInt32,
18
+ xo.UInt64, xo.Float32, xo.Float64])
19
+ def test_atomic(overload, ctype, test_context):
20
+ if overload:
21
+ func_name = 'atomicAdd'
22
+ else:
23
+ func_name = f'atomicAdd_{ctype.__name__.lower()[0]}{ctype.__name__.split("t")[1]}'
24
+ class TestAtomic(xt.BeamElement):
25
+ _xofields = {f'val': ctype}
26
+ allow_track = False
27
+ _extra_c_sources = [f'''
28
+ #include <headers/track.h>
29
+ #include <headers/atomicadd.h>
30
+
31
+ GPUKERN
32
+ void run_atomic_test(TestAtomicData el, GPUGLMEM {ctype._c_type}* increments,
33
+ GPUGLMEM {ctype._c_type}* retvals, int length) {{
34
+ VECTORIZE_OVER(ii, length);
35
+ GPUGLMEM {ctype._c_type}* val = TestAtomicData_getp_val(el);
36
+ {ctype._c_type} ret = {func_name}(val, increments[ii]);
37
+ retvals[ii] = ret;
38
+ END_VECTORIZE;
39
+ }}
40
+ ''']
41
+
42
+ _kernels = {
43
+ 'run_atomic_test': xo.Kernel(
44
+ c_name='run_atomic_test',
45
+ args=[xo.Arg(xo.ThisClass, name='el'),
46
+ xo.Arg(ctype, pointer=True, name='increments'),
47
+ xo.Arg(ctype, pointer=True, name='retvals'),
48
+ xo.Arg(xo.Int32, name='length')],
49
+ n_threads='length')
50
+ }
51
+
52
+ atomic = TestAtomic(_context=test_context, val=0)
53
+ assert atomic.val == 0
54
+
55
+ # Test with all increments = 1, so we can check the return values easily.
56
+ num_steps = 10000
57
+ if ctype.__name__.startswith('Int') or ctype.__name__.startswith('Uint'):
58
+ # Less steps to avoid overflow
59
+ num_steps = min(num_steps, 2**(8*ctype._size - 1) - 1)
60
+ increments = test_context.zeros(shape=(num_steps,), dtype=ctype._dtype) + 1
61
+ retvals = test_context.zeros(shape=(num_steps,), dtype=ctype._dtype)
62
+ atomic.run_atomic_test(increments=increments, retvals=retvals, length=num_steps)
63
+ assert atomic.val == num_steps
64
+ retvals = np.sort(test_context.nparray_from_context_array(retvals))
65
+ assert np.allclose(retvals, np.arange(num_steps, dtype=ctype._dtype), atol=1.e-15, rtol=1.e-15)
66
+
67
+ # Test with random increments, where we now only can check the total sum
68
+ # (retvals can be anything). Watch out: overflow is undefined behaviour,
69
+ # except for unsigned integers, so we skip this test for signed integers.
70
+ atomic.val = 0
71
+ retvals = test_context.zeros(shape=(num_steps,), dtype=ctype._dtype)
72
+ if ctype.__name__.startswith('Uint'):
73
+ low = 0
74
+ high = 2**(8*ctype._size) - 1
75
+ increments = np.random.randint(low, high+1, size=num_steps, dtype=ctype._dtype)
76
+ increments = test_context.nparray_to_context_array(increments)
77
+ atomic.run_atomic_test(increments=increments, retvals=retvals, length=num_steps)
78
+ increments = test_context.nparray_from_context_array(increments)
79
+ assert atomic.val == (np.sum(increments).item() % (2**(8*ctype._size)))
80
+
81
+ elif ctype.__name__.startswith('Float'):
82
+ increments = np.zeros(shape=(num_steps,), dtype=ctype._dtype)
83
+ increments += np.random.uniform(0, 10, size=num_steps)
84
+ increments = test_context.nparray_to_context_array(increments)
85
+ atomic.run_atomic_test(increments=increments, retvals=retvals, length=num_steps)
86
+ increments = test_context.nparray_from_context_array(increments)
87
+ if ctype == xo.Float32:
88
+ assert np.isclose(atomic.val, np.sum(increments), atol=10., rtol=1.e-4)
89
+ else:
90
+ assert np.isclose(atomic.val, np.sum(increments), atol=1.e-6, rtol=1.e-12)
@@ -276,7 +276,6 @@ def test_record_with_twiss(test_context):
276
276
  line.particle_ref = xp.Particles(mass0=xp.PROTON_MASS_EV, q0=1, p0c=6.5e12)
277
277
  io_buffer = line.tracker.io_buffer
278
278
  line.twiss(at_s=np.linspace(0, line.get_length(), 500))
279
-
280
279
 
281
280
 
282
281
  @for_all_test_contexts
@@ -223,7 +223,7 @@ def test_drift_exact_and_expanded(test_context):
223
223
 
224
224
  assert line['e2'].model == 'adaptive'
225
225
 
226
- p0 = xp.Particles(p0c=1e9, px=0.3, _context=test_context)
226
+ p0 = xp.Particles(p0c=1e9, px=0.3)
227
227
  x_prime_expanded = p0.px / (1 + p0.delta)
228
228
  x_prime_exact = p0.px / np.sqrt((1 + p0.delta)**2 - p0.px**2)
229
229
 
@@ -1288,3 +1288,17 @@ def test_multipole_tilt_90_deg(test_context):
1288
1288
  xo.assert_allclose(pf.ptau, pfy.ptau, rtol=0, atol=1e-14)
1289
1289
 
1290
1290
 
1291
+ def test_beam_element_sin_cos_rot_backwards_compatible():
1292
+ rot_s_rad = 0.13
1293
+ sin_rot_s = np.sin(rot_s_rad)
1294
+ cos_rot_s = np.cos(rot_s_rad)
1295
+
1296
+ mb_init = xt.Bend(length=1, _sin_rot_s=sin_rot_s, _cos_rot_s=cos_rot_s)
1297
+ mb_dict = xt.Bend.from_dict({
1298
+ 'length': 1,
1299
+ '_sin_rot_s': sin_rot_s,
1300
+ '_cos_rot_s': cos_rot_s,
1301
+ })
1302
+
1303
+ assert rot_s_rad == mb_init.rot_s_rad
1304
+ assert rot_s_rad == mb_dict.rot_s_rad
@@ -633,14 +633,11 @@ def test_import_thick_bend_from_madx(use_true_thick_bends, with_knobs, bend_type
633
633
  # we assume k0_from_h=False, even if its value evaluates to zero. In MAD-X
634
634
  # k0 = h if k0 is zero, but this is not feasible to implement in Xtrack now.
635
635
  xo.assert_allclose(elem.k0, 0 if with_knobs else 0.05, atol=1e-14)
636
+ xo.assert_allclose(elem.k2, 0.4, atol=1e-14)
636
637
  xo.assert_allclose(elem.h, 0.05, atol=1e-14) # h = angle / L
638
+ xo.assert_allclose(elem.knl, 0.0, atol=1e-14)
637
639
  xo.assert_allclose(elem.ksl, 0.0, atol=1e-14)
638
640
 
639
- xo.assert_allclose(
640
- elem.knl,
641
- np.array([0, 0, 0.8, 0, 0, 0]), # knl = [0, 0, k2 * L, 0, 0]
642
- atol=1e-14,
643
- )
644
641
 
645
642
  # Edges:
646
643
  xo.assert_allclose(elem.edge_entry_fint, 0.5, atol=1e-14)
@@ -667,14 +664,10 @@ def test_import_thick_bend_from_madx(use_true_thick_bends, with_knobs, bend_type
667
664
  # Element:
668
665
  xo.assert_allclose(elem.length, 3.0, atol=1e-14)
669
666
  xo.assert_allclose(elem.k0, 0.4, atol=1e-14)
667
+ xo.assert_allclose(elem.k2, 0.8, atol=1e-14)
670
668
  xo.assert_allclose(elem.h, 0.2 / 3.0, atol=1e-14) # h = angle / length
671
669
  xo.assert_allclose(elem.ksl, 0.0, atol=1e-14)
672
-
673
- xo.assert_allclose(
674
- elem.knl,
675
- np.array([0, 0, 2.4, 0, 0, 0]), # knl = [0, 0, k2 * L, 0, 0]
676
- atol=1e-14,
677
- )
670
+ xo.assert_allclose(elem.ksl, 0.0, atol=1e-14)
678
671
 
679
672
  # Edges:
680
673
  xo.assert_allclose(elem.edge_entry_fint, 1.0, atol=1e-14)
@@ -779,7 +772,8 @@ def test_import_thick_bend_from_madx_and_slice(
779
772
  xo.assert_allclose(elem.weight, 0.5, atol=1e-14)
780
773
  xo.assert_allclose(elem._parent.length, 2.0, atol=1e-14)
781
774
  xo.assert_allclose(elem._parent.k0, 0.2, atol=1e-14)
782
- xo.assert_allclose(elem._parent.knl, [0., 0, 0.8, 0, 0, 0], atol=1e-14)
775
+ xo.assert_allclose(elem._parent.k2, 0.4, atol=1e-14)
776
+ xo.assert_allclose(elem._parent.knl, 0, atol=1e-14)
783
777
  xo.assert_allclose(elem._parent.ksl, 0, atol=1e-14)
784
778
  xo.assert_allclose(elem._parent.h, 0.05, atol=1e-14)
785
779
 
@@ -803,14 +797,16 @@ def test_import_thick_bend_from_madx_and_slice(
803
797
  xo.assert_allclose(elem.weight, 0.5, atol=1e-14)
804
798
  xo.assert_allclose(elem._parent.length, 3.0, atol=1e-14)
805
799
  xo.assert_allclose(elem._parent.k0, 0.4, atol=1e-14)
806
- xo.assert_allclose(elem._parent.knl, [0., 0, 2.4, 0, 0, 0], atol=1e-14)
800
+ xo.assert_allclose(elem._parent.k2, 0.8, atol=1e-14)
801
+ xo.assert_allclose(elem._parent.knl, 0, atol=1e-14)
807
802
  xo.assert_allclose(elem._parent.ksl, 0, atol=1e-14)
808
803
  xo.assert_allclose(elem._parent.h, 0.2/3, atol=1e-14)
809
804
 
810
805
  xo.assert_allclose(elem._xobject.weight, 0.5, atol=1e-14)
811
806
  xo.assert_allclose(elem._xobject._parent.length, 3.0, atol=1e-14)
812
807
  xo.assert_allclose(elem._xobject._parent.k0, 0.4, atol=1e-14)
813
- xo.assert_allclose(elem._xobject._parent.knl, [0., 0, 2.4, 0, 0, 0], atol=1e-14)
808
+ xo.assert_allclose(elem._xobject._parent.k2, 0.8, atol=1e-14)
809
+ xo.assert_allclose(elem._xobject._parent.knl, 0, atol=1e-14)
814
810
  xo.assert_allclose(elem._xobject._parent.ksl, 0, atol=1e-14)
815
811
  xo.assert_allclose(elem._xobject._parent.h, 0.2/3, atol=1e-14)
816
812
 
@@ -1572,14 +1568,14 @@ def test_solenoid_multipole_shifts(shift_x, shift_y, test_element_name):
1572
1568
  test_sol.mult_shift_y = shift_y
1573
1569
 
1574
1570
  tw = line.twiss(
1575
- _continue_if_lost=True,
1571
+ #_continue_if_lost=True,
1576
1572
  start=xt.START,
1577
1573
  end=xt.END,
1578
1574
  betx=BETX,
1579
1575
  bety=BETY,
1580
1576
  px=PX0)
1581
1577
  tw_sol = sol_line.twiss(
1582
- _continue_if_lost=True,
1578
+ #_continue_if_lost=True,
1583
1579
  start=xt.START,
1584
1580
  end=xt.END,
1585
1581
  betx=BETX,
@@ -196,16 +196,16 @@ def test_madng_twiss_with_initial_conditions():
196
196
  line = xt.load(test_data_folder /
197
197
  'hllhc15_thick/lhc_thick_with_knobs.json')
198
198
  #pytest.set_trace()
199
- tw_xs = line.twiss(betx=120, bety=150)
200
- tw = line.madng_twiss(beta11=120, beta22=150)
199
+ tw_xs = line.twiss(betx=120, bety=150, alfx=5, alfy=5, dx=1e-4)
200
+ tw = line.madng_twiss(beta11=120, beta22=150, alfa11=5, alfa22=5, dx=1e-4)
201
201
 
202
202
  assert len(tw) == len(tw_xs)
203
203
  assert len(tw.betx) == len(tw.beta11_ng)
204
204
 
205
- xo.assert_allclose(tw.betx, tw.beta11_ng, rtol=1e-7, atol=1e-6)
206
- xo.assert_allclose(tw.bety, tw.beta22_ng, rtol=1e-7, atol=1e-6)
207
- xo.assert_allclose(tw.alfx, tw.alfa11_ng, rtol=1e-7, atol=1e-6)
208
- xo.assert_allclose(tw.alfy, tw.alfa22_ng, rtol=1e-7, atol=1e-6)
205
+ xo.assert_allclose(tw.betx, tw.beta11_ng, rtol=1e-6, atol=1e-6)
206
+ xo.assert_allclose(tw.bety, tw.beta22_ng, rtol=1e-6, atol=1e-6)
207
+ xo.assert_allclose(tw.alfx, tw.alfa11_ng, rtol=1e-6, atol=1e-6)
208
+ xo.assert_allclose(tw.alfy, tw.alfa22_ng, rtol=1e-6, atol=1e-6)
209
209
  xo.assert_allclose(tw.dx, tw.dx_ng, rtol=1e-8, atol=1e-6)
210
210
  xo.assert_allclose(tw.dy, tw.dy_ng, rtol=1e-8, atol=1e-6)
211
211
  xo.assert_allclose(tw.dpx, tw.dpx_ng, rtol=1e-8, atol=1e-6)
@@ -213,8 +213,8 @@ def test_madng_twiss_with_initial_conditions():
213
213
  xo.assert_allclose(tw.x, tw.x_ng, rtol=1e-8, atol=1e-6)
214
214
  xo.assert_allclose(tw.y, tw.y_ng, rtol=1e-8, atol=1e-6)
215
215
 
216
- tw2_xs = line.twiss(start='s.ds.l8.b1', end='ip1', betx=100, bety=34)
217
- tw2_xsng = line.madng_twiss(start='s.ds.l8.b1', end='ip1', beta11=100, beta22=34, xsuite_tw=False)
216
+ tw2_xs = line.twiss(start='s.ds.l8.b1', end='ip1', betx=100, bety=34, dx=1e-5)
217
+ tw2_xsng = line.madng_twiss(start='s.ds.l8.b1', end='ip1', beta11=100, beta22=34, dx=1e-5, xsuite_tw=False)
218
218
 
219
219
  assert len(tw2_xs.betx) == len(tw2_xsng.beta11_ng)
220
220
  xo.assert_allclose(tw2_xs.betx, tw2_xsng.beta11_ng, rtol=1e-8, atol=1e-6)
@@ -248,6 +248,24 @@ def test_madng_twiss_with_initial_conditions():
248
248
  xo.assert_allclose(tw3_xsng.alfx, tw3_xsng.alfa11_ng, rtol=1e-8, atol=1e-6)
249
249
  xo.assert_allclose(tw3_xsng.alfy, tw3_xsng.alfa22_ng, rtol=1e-8, atol=1e-6)
250
250
 
251
+ tw4_xs = line.twiss(start='ip3', end='ip4', betx=121.5668, bety=218.58374, alfx=2.295, alfy=-2.6429, dx=-0.51)
252
+ tw4_xsng = line.madng_twiss(start='ip3', end='ip4', beta11=121.5668, beta22=218.58374, alfa11=2.295,
253
+ alfa22=-2.6429, dx=-0.51, xsuite_tw=False)
254
+
255
+ assert len(tw4_xs.betx) == len(tw4_xsng.beta11_ng)
256
+ xo.assert_allclose(tw4_xs.betx, tw4_xsng.beta11_ng, rtol=1e-6, atol=1e-5)
257
+ xo.assert_allclose(tw4_xs.bety, tw4_xsng.beta22_ng, rtol=1e-6, atol=1e-5)
258
+ xo.assert_allclose(tw4_xs.alfx, tw4_xsng.alfa11_ng, rtol=1e-6, atol=1e-5)
259
+ xo.assert_allclose(tw4_xs.alfy, tw4_xsng.alfa22_ng, rtol=1e-6, atol=1e-5)
260
+ xo.assert_allclose(tw4_xs.dx, tw4_xsng.dx_ng, rtol=1e-7, atol=1e-8)
261
+ xo.assert_allclose(tw4_xs.dy, tw4_xsng.dy_ng, rtol=1e-7, atol=1e-8)
262
+ xo.assert_allclose(tw4_xs.x, tw4_xsng.x_ng, rtol=1e-8, atol=1e-10)
263
+ xo.assert_allclose(tw4_xs.y, tw4_xsng.y_ng, rtol=1e-8, atol=1e-10)
264
+ xo.assert_allclose(tw4_xs.px, tw4_xsng.px_ng, rtol=1e-8, atol=1e-10)
265
+ xo.assert_allclose(tw4_xs.py, tw4_xsng.py_ng, rtol=1e-8, atol=1e-10)
266
+ xo.assert_allclose(tw4_xs.mux, tw4_xsng.mu1_ng, rtol=1e-8, atol=1e-5)
267
+ xo.assert_allclose(tw4_xs.muy, tw4_xsng.mu2_ng, rtol=1e-8, atol=1e-5)
268
+
251
269
  def test_madng_slices():
252
270
  line = xt.load(test_data_folder /
253
271
  'hllhc15_thick/lhc_thick_with_knobs.json')
@@ -8,7 +8,7 @@ import pytest
8
8
  import xobjects as xo
9
9
  import xtrack as xt
10
10
  import pymadng as ng
11
-
11
+ from typing import Literal
12
12
  from xobjects.test_helpers import for_all_test_contexts
13
13
 
14
14
 
@@ -415,7 +415,7 @@ def test_misalign_dedicated_vs_beam_element(test_context, element_type):
415
415
  xo.assert_allclose(p_ref.zeta, p_test.zeta, atol=1e-15, rtol=1e-15)
416
416
  xo.assert_allclose(p_ref.s, p_test.s, atol=1e-15, rtol=1e-15)
417
417
 
418
- # Check backtrak
418
+ # Check backtrack
419
419
  line_test.track(p_test, backtrack=True)
420
420
  xo.assert_allclose(p_test.x, p0.x, atol=1e-14, rtol=1e-14)
421
421
  xo.assert_allclose(p_test.px, p0.px, atol=1e-14, rtol=1e-14)
@@ -425,39 +425,266 @@ def test_misalign_dedicated_vs_beam_element(test_context, element_type):
425
425
  xo.assert_allclose(p_test.zeta, p0.zeta, atol=1e-14, rtol=1e-14)
426
426
  xo.assert_allclose(p_test.s, p0.s, atol=1e-14, rtol=1e-14)
427
427
 
428
- def test_errors_on_slices():
429
428
 
429
+ def test_thick_slice_misaligned_bend():
430
+ length = 3
431
+ angle = 0.3
432
+ dx = 0.1
433
+ dy = 0.2
434
+ ds = 0.3
435
+ theta = 0.1 # rad
436
+ phi = 0.2 # rad
437
+ psi = 0.5 # rad
438
+ tilt = 0.1
439
+ anchor = 1 # m
440
+ n_slices = 5
441
+
442
+ bend = xt.Bend(
443
+ length=length,
444
+ angle=angle,
445
+ shift_x=dx,
446
+ shift_y=dy,
447
+ shift_s=ds,
448
+ rot_x_rad=phi,
449
+ rot_y_rad=theta,
450
+ rot_s_rad_no_frame=psi,
451
+ rot_s_rad=tilt,
452
+ rot_shift_anchor=anchor,
453
+ k0_from_h=True,
454
+ edge_entry_active=False,
455
+ edge_entry_model='full',
456
+ edge_entry_angle=0.05,
457
+ edge_entry_hgap=0.06,
458
+ edge_entry_fint=0.08,
459
+ edge_exit_active=False,
460
+ edge_exit_model='full',
461
+ edge_exit_angle=-0.05,
462
+ edge_exit_hgap=0.06,
463
+ edge_exit_fint=0.08,
464
+ )
465
+ line_test = xt.Line(elements=[bend], element_names=['bend'])
466
+ line_test.slice_thick_elements([xt.Strategy(slicing=xt.Teapot(n_slices, mode='thick'))])
467
+
468
+ line_ref = xt.Line(elements=[bend], element_names=['bend'])
469
+
470
+ assert {f'bend..{i}' for i in range(n_slices)} <= set(line_test.element_names)
471
+
472
+ p0 = xt.Particles(x=0.2, y=-0.6, px=-0.01, py=0.02, zeta=0.5, delta=0.9)
473
+
474
+ p_ref = p0.copy()
475
+ line_ref.track(p_ref)
476
+
477
+ p_test = p0.copy()
478
+ line_test.track(p_test)
479
+
480
+ assert p_test.state > 0
481
+ xo.assert_allclose(p_test.x, p_ref.x, atol=5e-14, rtol=8e-14)
482
+ xo.assert_allclose(p_test.px, p_ref.px, atol=5e-14, rtol=8e-14)
483
+ xo.assert_allclose(p_test.y, p_ref.y, atol=5e-14, rtol=8e-14)
484
+ xo.assert_allclose(p_test.py, p_ref.py, atol=5e-14, rtol=8e-14)
485
+ xo.assert_allclose(p_test.delta, p_ref.delta, atol=5e-14, rtol=8e-14)
486
+ xo.assert_allclose(p_test.zeta, p_ref.zeta, atol=5e-14, rtol=8e-14)
487
+ xo.assert_allclose(p_test.s, p_ref.s, atol=5e-14, rtol=8e-14)
488
+
489
+
490
+ def test_thick_slice_misaligned_quad():
491
+ length = 3
492
+ k1 = 0.07
493
+ dx = 0.1
494
+ dy = 0.2
495
+ ds = 0.3
496
+ theta = 0.1 # rad
497
+ phi = 0.2 # rad
498
+ psi = 0.5 # rad
499
+ tilt = 0.1
500
+ anchor = 1 # m
501
+ n_slices = 5
502
+
503
+ quad = xt.Quadrupole(
504
+ length=length,
505
+ k1=k1,
506
+ shift_x=dx,
507
+ shift_y=dy,
508
+ shift_s=ds,
509
+ rot_x_rad=phi,
510
+ rot_y_rad=theta,
511
+ rot_s_rad_no_frame=psi,
512
+ rot_s_rad=tilt,
513
+ rot_shift_anchor=anchor,
514
+ edge_entry_active=True,
515
+ edge_exit_active=True,
516
+ )
517
+ line_test = xt.Line(elements=[quad], element_names=['quad'])
518
+ line_test.slice_thick_elements([xt.Strategy(slicing=xt.Teapot(n_slices, mode='thick'))])
519
+
520
+ line_ref = xt.Line(elements=[quad], element_names=['quad'])
521
+
522
+ assert {f'quad..{i}' for i in range(n_slices)} <= set(line_test.element_names)
523
+
524
+ p0 = xt.Particles(x=0.2, y=-0.6, px=-0.01, py=0.02, zeta=0.5, delta=0.9)
525
+
526
+ p_ref = p0.copy()
527
+ line_ref.track(p_ref)
528
+
529
+ p_test = p0.copy()
530
+ line_test.track(p_test)
531
+
532
+ assert p_test.state > 0
533
+ xo.assert_allclose(p_test.x, p_ref.x, atol=5e-14, rtol=8e-14)
534
+ xo.assert_allclose(p_test.px, p_ref.px, atol=5e-14, rtol=8e-14)
535
+ xo.assert_allclose(p_test.y, p_ref.y, atol=5e-14, rtol=8e-14)
536
+ xo.assert_allclose(p_test.py, p_ref.py, atol=5e-14, rtol=8e-14)
537
+ xo.assert_allclose(p_test.delta, p_ref.delta, atol=5e-14, rtol=8e-14)
538
+ xo.assert_allclose(p_test.zeta, p_ref.zeta, atol=5e-14, rtol=8e-14)
539
+ xo.assert_allclose(p_test.s, p_ref.s, atol=5e-14, rtol=8e-14)
540
+
541
+
542
+ def test_thick_slice_misaligned_uniform_solenoid():
543
+ length = 3
544
+ ks = 0.7
545
+ dx = 0.1
546
+ dy = 0.2
547
+ ds = 0.3
548
+ theta = 0.1 # rad
549
+ phi = 0.2 # rad
550
+ psi = 0.5 # rad
551
+ tilt = 0.1
552
+ anchor = 1 # m
553
+ n_slices = 5
554
+
555
+ sol = xt.UniformSolenoid(
556
+ length=length,
557
+ ks=ks,
558
+ shift_x=dx,
559
+ shift_y=dy,
560
+ shift_s=ds,
561
+ rot_x_rad=phi,
562
+ rot_y_rad=theta,
563
+ rot_s_rad_no_frame=psi,
564
+ rot_s_rad=tilt,
565
+ rot_shift_anchor=anchor,
566
+ )
567
+ line_test = xt.Line(elements=[sol], element_names=['sol'])
568
+ line_test.slice_thick_elements([xt.Strategy(slicing=xt.Teapot(n_slices, mode='thick'))])
569
+
570
+ line_ref = xt.Line(elements=[sol], element_names=['sol'])
571
+
572
+ assert {f'sol..{i}' for i in range(n_slices)} <= set(line_test.element_names)
573
+
574
+ p0 = xt.Particles(x=0.2, y=-0.6, px=-0.01, py=0.02, zeta=0.5, delta=0.9)
575
+
576
+ p_ref = p0.copy()
577
+ line_ref.track(p_ref)
578
+
579
+ p_test = p0.copy()
580
+ line_test.track(p_test)
581
+
582
+ assert p_test.state > 0
583
+ xo.assert_allclose(p_test.x, p_ref.x, atol=5e-14, rtol=8e-14)
584
+ xo.assert_allclose(p_test.px, p_ref.px, atol=5e-14, rtol=8e-14)
585
+ xo.assert_allclose(p_test.y, p_ref.y, atol=5e-14, rtol=8e-14)
586
+ xo.assert_allclose(p_test.py, p_ref.py, atol=5e-14, rtol=8e-14)
587
+ xo.assert_allclose(p_test.delta, p_ref.delta, atol=5e-14, rtol=8e-14)
588
+ xo.assert_allclose(p_test.zeta, p_ref.zeta, atol=5e-14, rtol=8e-14)
589
+ xo.assert_allclose(p_test.s, p_ref.s, atol=5e-14, rtol=8e-14)
590
+
591
+
592
+ @pytest.mark.parametrize(
593
+ 'transformations,valid',
594
+ [
595
+ ({'rot_x_rad': 0.1}, False),
596
+ ({'rot_y_rad': -0.2}, False),
597
+ ({'rot_s_rad_no_frame': 0.3}, False),
598
+ ({'shift_x': 0.2}, True),
599
+ ({'shift_y': -0.3}, True),
600
+ ({'shift_s': 0.1}, True),
601
+ ({'rot_s_rad': 0.2}, True),
602
+ ],
603
+ ids=[
604
+ 'rot_x_rad',
605
+ 'rot_y_rad',
606
+ 'rot_s_rad_no_frame',
607
+ 'shift_x',
608
+ 'shift_y',
609
+ 'shift_s',
610
+ 'rot_s_rad',
611
+ ]
612
+ )
613
+ def test_thin_slice_misaligned_bend_valid_invalid(transformations, valid):
430
614
  env = xt.Environment()
431
615
  line = env.new_line(components=[
432
- env.new('b', 'Bend', angle=0.1, length=2)
616
+ env.new(
617
+ name='b',
618
+ parent='Bend',
619
+ angle=0.1,
620
+ length=2,
621
+ model='drift-kick-drift-expanded', # compare to a similar model
622
+ **transformations,
623
+ ),
433
624
  ])
434
625
 
435
- p = xt.Particles(p0c=1e9)
436
- line.track(p)
437
- assert p.state[0] == 1
626
+ line.slice_thick_elements([
627
+ xt.Strategy(slicing=xt.Teapot(50, mode='thin')),
628
+ ])
438
629
 
439
- line['b'].shift_x = 0.1
440
- line.track(p)
441
- assert p.state[0] == 1
630
+ p0 = xt.Particles(x=0.01, py=0.03, p0c=1e9)
631
+ p_test = p0.copy()
632
+ line.track(p_test)
442
633
 
443
- line.cut_at_s([0.5])
444
- line.track(p)
445
- assert p.state[0] == -41
634
+ if not valid:
635
+ assert p_test.state[0] == -42
636
+ return
446
637
 
447
- p = xt.Particles(p0c=1e9)
448
- line['b'].angle = 0
449
- line.track(p)
450
- assert p.state[0] == 1
638
+ p_ref = p0.copy()
639
+ line['b'].track(p_ref)
640
+
641
+ xo.assert_allclose(p_test.x, p_ref.x, atol=1e-6, rtol=1e-5)
642
+ xo.assert_allclose(p_test.y, p_ref.y, atol=1e-6, rtol=1e-5)
643
+ xo.assert_allclose(p_test.px, p_ref.px, atol=1e-14, rtol=1e-14)
644
+ xo.assert_allclose(p_test.py, p_ref.py, atol=1e-14, rtol=1e-14)
645
+ xo.assert_allclose(p_test.zeta, p_ref.zeta, atol=1e-7, rtol=1e-5)
646
+ xo.assert_allclose(p_test.delta, p_ref.delta, atol=1e-14, rtol=1e-14)
647
+
648
+
649
+ @pytest.mark.parametrize('h', [0.0, 0.1], ids=['straight', 'polar'])
650
+ def test_spin_drift(h):
651
+ bend = xt.Bend(
652
+ length=2,
653
+ h=h,
654
+ k0=0,
655
+ shift_x=0.01,
656
+ shift_y=-0.03,
657
+ shift_s=0.02,
658
+ rot_x_rad=-0.03,
659
+ rot_y_rad=0.02,
660
+ rot_s_rad_no_frame=0.01,
661
+ rot_s_rad=0.04,
662
+ rot_shift_anchor=0.2,
663
+ )
664
+ bend.integrator = 'uniform'
665
+ bend.num_multipole_kicks = 1
666
+
667
+ line_test = xt.Line(elements=[bend], element_names=['bend'])
668
+ line_test.configure_spin('auto')
669
+
670
+ p0 = xt.Particles(
671
+ x=0.2,
672
+ y=-0.6,
673
+ spin_z=1.,
674
+ mass0=xt.ELECTRON_MASS_EV,
675
+ anomalous_magnetic_moment=0.00115965218128,
676
+ )
451
677
 
452
- line['b'].angle = 0.1
453
- line.track(p)
454
- assert p.state[0] == -41
678
+ p = p0.copy()
679
+ line_test.track(p)
455
680
 
456
- line['b'].angle = 0
457
- p = xt.Particles(p0c=1e9)
458
- line.track(p)
459
- assert p.state[0] == 1
681
+ # Check that spin norm is preserved
682
+ expected_norm = 1
683
+ result_norm = np.linalg.norm([p.spin_x, p.spin_y, p.spin_z])
684
+ xo.assert_allclose(result_norm, expected_norm, atol=1e-15, rtol=1e-15)
460
685
 
461
- line['b'].rot_x_rad = 0.1
462
- line.track(p)
463
- assert p.state[0] == -40
686
+ # In the absence of magnetic field, spin should follow momentum
687
+ xo.assert_allclose(p.spin_x, p.px, atol=1e-15, rtol=1e-15)
688
+ xo.assert_allclose(p.spin_y, p.py, atol=1e-15, rtol=1e-15)
689
+ ps = np.sqrt(1 - p.px**2 - p.py**2)
690
+ xo.assert_allclose(p.spin_z, ps, atol=1e-15, rtol=1e-15)