xtrack 0.89.3__tar.gz → 0.90.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 (344) hide show
  1. {xtrack-0.89.3/xtrack.egg-info → xtrack-0.90.0}/PKG-INFO +1 -1
  2. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_elements.py +36 -2
  3. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_elements_thick.py +7 -6
  4. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_environment.py +174 -23
  5. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_line.py +1 -1
  6. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_multispecies.py +2 -8
  7. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_particles.py +4 -1
  8. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_rbend_straight_body.py +1 -1
  9. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_slicing.py +0 -1
  10. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_survey.py +3 -3
  11. xtrack-0.90.0/xtrack/_version.py +1 -0
  12. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements.py +34 -2
  13. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift.h +19 -3
  14. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice.h +19 -3
  15. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet.h +5 -5
  16. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet.template.h +5 -5
  17. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/environment.py +480 -40
  18. xtrack-0.90.0/xtrack/functions.py +80 -0
  19. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/line.py +195 -412
  20. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_loader.py +4 -8
  21. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multiline_legacy/shared_knobs.py +1 -1
  22. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/particles.py +8 -0
  23. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/survey.py +2 -1
  24. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/trajectory_correction.py +4 -2
  25. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/twiss.py +5 -0
  26. {xtrack-0.89.3 → xtrack-0.90.0/xtrack.egg-info}/PKG-INFO +1 -1
  27. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack.egg-info/SOURCES.txt +1 -0
  28. xtrack-0.89.3/xtrack/_version.py +0 -1
  29. {xtrack-0.89.3 → xtrack-0.90.0}/LICENSE +0 -0
  30. {xtrack-0.89.3 → xtrack-0.90.0}/MANIFEST.in +0 -0
  31. {xtrack-0.89.3 → xtrack-0.90.0}/README.md +0 -0
  32. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/__init__.py +0 -0
  33. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/base_classes.py +0 -0
  34. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/BB6D.py +0 -0
  35. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
  36. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/__init__.py +0 -0
  37. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/beambeam.py +0 -0
  38. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/boost.py +0 -0
  39. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
  40. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
  41. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/qgauss.py +0 -0
  42. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/slicing.py +0 -0
  43. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/spacecharge.py +0 -0
  44. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/elements.py +0 -0
  45. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/line.py +0 -0
  46. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/mathlibs.py +0 -0
  47. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/particles.py +0 -0
  48. {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/temp_pyparticles.py +0 -0
  49. {xtrack-0.89.3 → xtrack-0.90.0}/pyproject.toml +0 -0
  50. {xtrack-0.89.3 → xtrack-0.90.0}/setup.cfg +0 -0
  51. {xtrack-0.89.3 → xtrack-0.90.0}/setup.py +0 -0
  52. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_acceleration.py +0 -0
  53. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_amplitude_detuning.py +0 -0
  54. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_aperture_table.py +0 -0
  55. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
  56. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_apertures.py +0 -0
  57. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_attr_replicas_and_slices.py +0 -0
  58. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_bucket_with_ref_energy_change.py +0 -0
  59. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_cavity_absolute_time.py +0 -0
  60. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_chromatic_functions_vs_madx.py +0 -0
  61. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_coasting.py +0 -0
  62. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_collective_tracker.py +0 -0
  63. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_collimation.py +0 -0
  64. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_coupling_edwards_teng.py +0 -0
  65. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_electron_cooler.py +0 -0
  66. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_element_characterization_functions.py +0 -0
  67. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_element_internal_record.py +0 -0
  68. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_elements_classflags.py +0 -0
  69. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_fcc_ee_solenoid_correction.py +0 -0
  70. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
  71. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_footprint.py +0 -0
  72. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_freeze_longitudinal.py +0 -0
  73. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_full_rings.py +0 -0
  74. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_h6_sps_beamline.py +0 -0
  75. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_hvkick.py +0 -0
  76. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_ions.py +0 -0
  77. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_legacy_multiline_to_env.py +0 -0
  78. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_lhc_env.py +0 -0
  79. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_lhc_match_phase_15.py +0 -0
  80. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_load.py +0 -0
  81. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_load_vars.py +0 -0
  82. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_lumi.py +0 -0
  83. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_mad_writer.py +0 -0
  84. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_madloader.py +0 -0
  85. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_madnginterface.py +0 -0
  86. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_magnet.py +0 -0
  87. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_and_track_from_element.py +0 -0
  88. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_coupling_knob.py +0 -0
  89. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_nested.py +0 -0
  90. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_optics_and_ip_knob.py +0 -0
  91. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
  92. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_orbit_bump.py +0 -0
  93. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_tune_chroma_cminus.py +0 -0
  94. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_misalign.py +0 -0
  95. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_monitor.py +0 -0
  96. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_multi_bunch_gauss.py +0 -0
  97. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_multiline.py +0 -0
  98. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_multisetter.py +0 -0
  99. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_native_madloader.py +0 -0
  100. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_optimize_for_tracking.py +0 -0
  101. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_particles_basics.py +0 -0
  102. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_particles_pdg.py +0 -0
  103. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_pipeline.py +0 -0
  104. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_prebuild_kernels.py +0 -0
  105. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_ps_against_ptc.py +0 -0
  106. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_ps_multiturn_twiss.py +0 -0
  107. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_psb_chicane.py +0 -0
  108. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_pyht_interface.py +0 -0
  109. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_quadrupole_fringe_ptc.py +0 -0
  110. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_quadrupole_wedge.py +0 -0
  111. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radial_steering.py +0 -0
  112. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radiation.py +0 -0
  113. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radiation_equilibrium_emittances.py +0 -0
  114. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
  115. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radiation_integrals.py +0 -0
  116. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_random_gen.py +0 -0
  117. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_random_gen_exp.py +0 -0
  118. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_random_gen_gauss.py +0 -0
  119. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_random_gen_ruth.py +0 -0
  120. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_rbend_rbarc.py +0 -0
  121. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_rf_track.py +0 -0
  122. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_rotation_signs.py +0 -0
  123. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_second_order_taylor_map.py +0 -0
  124. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_seeds.py +0 -0
  125. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_slice_and_insert_with_replicas.py +0 -0
  126. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_slice_elements.py +0 -0
  127. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
  128. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
  129. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_spacecharge_in_ring.py +0 -0
  130. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_spin.py +0 -0
  131. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_sps_thick.py +0 -0
  132. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_tapering.py +0 -0
  133. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_thick_kickers_rf_crab.py +0 -0
  134. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_thick_lhc.py +0 -0
  135. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_tilt_shifts.py +0 -0
  136. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_tracker.py +0 -0
  137. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_trajectory_correcton.py +0 -0
  138. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_twiss.py +0 -0
  139. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_twiss_vs_madx_psb.py +0 -0
  140. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_vs_madx.py +0 -0
  141. {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_xmask_orbit_correction.py +0 -0
  142. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/__init__.py +0 -0
  143. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/__init__.py +0 -0
  144. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
  145. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
  146. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
  147. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/lhc_match/__init__.py +0 -0
  148. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
  149. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
  150. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/lhc_match/var_limits.py +0 -0
  151. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/aperture_meas.py +0 -0
  152. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/base_element.py +0 -0
  153. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/__init__.py +0 -0
  154. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures.py +0 -0
  155. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
  156. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
  157. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
  158. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
  159. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
  160. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
  161. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/beam_interaction.py +0 -0
  162. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/bend.h +0 -0
  163. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/cavity.h +0 -0
  164. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/crab_cavity.h +0 -0
  165. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
  166. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
  167. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
  168. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_exact.h +0 -0
  169. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_exact_slice.h +0 -0
  170. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
  171. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_cavity.h +0 -0
  172. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_crab_cavity.h +0 -0
  173. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_multipole.h +0 -0
  174. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
  175. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
  176. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
  177. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
  178. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
  179. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
  180. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/elens.h +0 -0
  181. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/exciter.h +0 -0
  182. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
  183. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
  184. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
  185. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/magnet.h +0 -0
  186. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
  187. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
  188. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
  189. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/marker.h +0 -0
  190. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/misalignment.h +0 -0
  191. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/multipole.h +0 -0
  192. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
  193. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
  194. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/octupole.h +0 -0
  195. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
  196. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/rbend.h +0 -0
  197. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
  198. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
  199. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
  200. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
  201. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
  202. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
  203. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/slnd.h +0 -0
  204. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/srotation.h +0 -0
  205. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/temprf.h +0 -0
  206. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
  207. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_cavity.h +0 -0
  208. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_crab_cavity.h +0 -0
  209. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_multipole.h +0 -0
  210. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
  211. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
  212. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
  213. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
  214. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
  215. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
  216. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
  217. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
  218. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_cavity.h +0 -0
  219. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_crab_cavity.h +0 -0
  220. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_multipole.h +0 -0
  221. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
  222. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
  223. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
  224. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
  225. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
  226. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
  227. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
  228. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
  229. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
  230. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
  231. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
  232. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
  233. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
  234. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
  235. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
  236. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
  237. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
  238. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
  239. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
  240. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
  241. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
  242. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_configure.h +0 -0
  243. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
  244. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
  245. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
  246. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
  247. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_misalignments.h +0 -0
  248. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
  249. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_rf.h +0 -0
  250. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_rf.template.h +0 -0
  251. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
  252. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
  253. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
  254. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
  255. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
  256. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_xyshift.h +0 -0
  257. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
  258. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
  259. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/wedge.h +0 -0
  260. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/wire.h +0 -0
  261. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
  262. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
  263. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
  264. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
  265. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/exciter.py +0 -0
  266. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/rft_element.py +0 -0
  267. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_base.py +0 -0
  268. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_elements_drift.py +0 -0
  269. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_elements_edge.py +0 -0
  270. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_elements_thick.py +0 -0
  271. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_elements_thin.py +0 -0
  272. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/footprint.py +0 -0
  273. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/general.py +0 -0
  274. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/atomicadd.h +0 -0
  275. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/checks.h +0 -0
  276. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/constants.h +0 -0
  277. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/particle_states.h +0 -0
  278. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/synrad_spectrum.h +0 -0
  279. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/track.h +0 -0
  280. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/internal_record.py +0 -0
  281. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/json.py +0 -0
  282. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/linear_normal_form.py +0 -0
  283. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/load.py +0 -0
  284. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/loss_location_refinement/__init__.py +0 -0
  285. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
  286. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/lumi.py +0 -0
  287. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_parser/__init__.py +0 -0
  288. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_parser/loader.py +0 -0
  289. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_parser/madx.lark +0 -0
  290. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_parser/parse.py +0 -0
  291. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_writer.py +0 -0
  292. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/madng_interface.py +0 -0
  293. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/match.py +0 -0
  294. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/__init__.py +0 -0
  295. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_position_monitor.h +0 -0
  296. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_position_monitor.py +0 -0
  297. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_profile_monitor.h +0 -0
  298. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_profile_monitor.py +0 -0
  299. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_size_monitor.h +0 -0
  300. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_size_monitor.py +0 -0
  301. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/last_turns_monitor.h +0 -0
  302. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/last_turns_monitor.py +0 -0
  303. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/particles_monitor.h +0 -0
  304. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/particles_monitor.py +0 -0
  305. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multiline.py +0 -0
  306. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multiline_legacy/__init__.py +0 -0
  307. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
  308. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multisetter/__init__.py +0 -0
  309. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multisetter/multisetter.py +0 -0
  310. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/__init__.py +0 -0
  311. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/constants.py +0 -0
  312. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/masses.py +0 -0
  313. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/pdg.py +0 -0
  314. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/rng_src/base_rng.h +0 -0
  315. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/rng_src/particles_rng.h +0 -0
  316. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/pipeline/__init__.py +0 -0
  317. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/pipeline/core.py +0 -0
  318. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/pipeline/manager.py +0 -0
  319. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/pipeline/multitracker.py +0 -0
  320. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/progress_indicator.py +0 -0
  321. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/__init__.py +0 -0
  322. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_generators.py +0 -0
  323. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/exponential.h +0 -0
  324. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
  325. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/normal.h +0 -0
  326. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/rutherford.h +0 -0
  327. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/uniform.h +0 -0
  328. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/uniform_accurate.h +0 -0
  329. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/slicing.py +0 -0
  330. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/svgutils/__init__.py +0 -0
  331. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/svgutils/parser.py +0 -0
  332. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/svgutils/path.py +0 -0
  333. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/svgutils/svgutils.py +0 -0
  334. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/synctime.py +0 -0
  335. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/tapering.py +0 -0
  336. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/targets.py +0 -0
  337. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/track_flags.py +0 -0
  338. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/tracker.py +0 -0
  339. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/tracker_data.py +0 -0
  340. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/tracker_src/tracker.h +0 -0
  341. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/twissplot.py +0 -0
  342. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack.egg-info/dependency_links.txt +0 -0
  343. {xtrack-0.89.3 → xtrack-0.90.0}/xtrack.egg-info/requires.txt +0 -0
  344. {xtrack-0.89.3 → xtrack-0.90.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.89.3
3
+ Version: 0.90.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
@@ -214,6 +214,40 @@ def test_drift(test_context):
214
214
  dtk_particle.zeta,
215
215
  rtol=1e-14, atol=1e-14)
216
216
 
217
+ @for_all_test_contexts
218
+ def test_drift_exact_and_expanded(test_context):
219
+
220
+ line = xt.Line(elements=[xt.Drift(length=1.), xt.Drift(length=2.), xt.Drift(length=3.)])
221
+ ltot = line.get_length()
222
+ line.build_tracker(_context=test_context)
223
+
224
+ assert line['e2'].model == 'adaptive'
225
+
226
+ p0 = xp.Particles(p0c=1e9, px=0.3, _context=test_context)
227
+ x_prime_expanded = p0.px / (1 + p0.delta)
228
+ x_prime_exact = p0.px / np.sqrt((1 + p0.delta)**2 - p0.px**2)
229
+
230
+ p = p0.copy(_context=test_context)
231
+ line.track(p)
232
+ xo.assert_allclose(p.x, x_prime_expanded*ltot, rtol=1e-14, atol=1e-14)
233
+
234
+ line.configure_drift_model(model='exact')
235
+ assert line['e2'].model == 'exact'
236
+ p = p0.copy(_context=test_context)
237
+ line.track(p)
238
+ xo.assert_allclose(p.x, x_prime_exact*ltot, rtol=1e-14, atol=1e-14)
239
+
240
+ line.configure_drift_model(model='expanded')
241
+ assert line['e2'].model == 'expanded'
242
+ p = p0.copy(_context=test_context)
243
+ line.track(p)
244
+ xo.assert_allclose(p.x, x_prime_expanded*ltot, rtol=1e-14, atol=1e-14)
245
+
246
+ line.config.XTRACK_USE_EXACT_DRIFTS = True
247
+ p = p0.copy(_context=test_context)
248
+ line.track(p)
249
+ xo.assert_allclose(p.x, x_prime_exact*ltot, rtol=1e-14, atol=1e-14)
250
+
217
251
 
218
252
  @for_all_test_contexts
219
253
  def test_drift_exact(test_context):
@@ -232,7 +266,7 @@ def test_drift_exact(test_context):
232
266
  drift = xt.Drift(_context=test_context, length=10.)
233
267
  line = xt.Line(elements=[drift])
234
268
  line.build_tracker(compile=False, _context=test_context)
235
- line.config.XTRACK_USE_EXACT_DRIFTS = True
269
+ line.configure_drift_model(model='exact')
236
270
  line.track(particles)
237
271
 
238
272
  dtk_drift = dtk.elements.DriftExact(length=10.)
@@ -1162,7 +1196,7 @@ def test_nonlinearlens(test_context):
1162
1196
  """)
1163
1197
 
1164
1198
  line = xt.Line.from_madx_sequence(mad.sequence.ss)
1165
- line.config.XTRACK_USE_EXACT_DRIFTS = True # to be consistent with madx
1199
+ line.configure_drift_model('exact') # to be consistent with madx
1166
1200
  line.build_tracker(_context=test_context)
1167
1201
 
1168
1202
  num_p_test = 10
@@ -59,7 +59,7 @@ def test_combined_function_dipole_against_ptc(test_context, k0, k1, k2, length,
59
59
 
60
60
  ml = MadLoader(mad.sequence.ss, allow_thick=True)
61
61
  line_thick = ml.make_line()
62
- line_thick.config.XTRACK_USE_EXACT_DRIFTS = True # to be consistent with mad
62
+ line_thick.configure_drift_model('exact') # to be consistent with madx
63
63
  line_thick.build_tracker(_context=test_context)
64
64
  line_thick.configure_bend_model(core=model, edge='dipole-only')
65
65
 
@@ -1283,7 +1283,7 @@ def test_solenoid_against_madx(test_context, ks, ksi, length):
1283
1283
  ml = MadLoader(mad.sequence.ss, allow_thick=True)
1284
1284
  line_thick = ml.make_line()
1285
1285
  line_thick.build_tracker(_context=test_context)
1286
- line_thick.config.XTRACK_USE_EXACT_DRIFTS = True # to be consistent with madx
1286
+ line_thick.configure_drift_model('exact') # to be consistent with madx
1287
1287
 
1288
1288
  for ii in range(len(p0.x)):
1289
1289
  mad.input(f"""
@@ -1320,7 +1320,7 @@ def test_solenoid_against_madx(test_context, ks, ksi, length):
1320
1320
  def test_solenoid_thick_drift_like(test_context):
1321
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
- l_drift.config.XTRACK_USE_EXACT_DRIFTS = True
1323
+ l_drift.configure_drift_model('exact')
1324
1324
  l_drift.build_tracker(_context=test_context)
1325
1325
 
1326
1326
  p0 = xp.Particles(
@@ -1743,7 +1743,6 @@ def test_solenoid_multipole_rotations():
1743
1743
  def test_drift_like_solenoid_with_kicks_radiation(radiation_mode, config):
1744
1744
  test_context = xo.ContextCpu()
1745
1745
 
1746
- config['XTRACK_USE_EXACT_DRIFTS'] = True
1747
1746
  knl = [0.1, 0.4, 0.5]
1748
1747
  ksl = [0.2, 0.3, 0.6]
1749
1748
 
@@ -1752,6 +1751,7 @@ def test_drift_like_solenoid_with_kicks_radiation(radiation_mode, config):
1752
1751
  xt.Multipole(knl=knl, ksl=ksl),
1753
1752
  xt.Drift(length=0.5),
1754
1753
  ])
1754
+ line_test.configure_drift_model('exact')
1755
1755
 
1756
1756
  line_ref = xt.Line(elements=[
1757
1757
  xt.UniformSolenoid(ks=0, length=1, knl=knl, ksl=ksl, num_multipole_kicks=1)
@@ -1803,8 +1803,6 @@ def test_drift_like_solenoid_with_kicks_radiation(radiation_mode, config):
1803
1803
  def test_solenoid_with_kicks_radiation(radiation_mode, config):
1804
1804
  test_context = xo.ContextCpu()
1805
1805
 
1806
- config['XTRACK_USE_EXACT_DRIFTS'] = True
1807
-
1808
1806
  ks = 0.4
1809
1807
  l = 1.1
1810
1808
  knl = [0.1, 0.4, 0.5]
@@ -1818,6 +1816,9 @@ def test_solenoid_with_kicks_radiation(radiation_mode, config):
1818
1816
  line_1 = xt.Line(elements=[sol_1])
1819
1817
  line_3 = xt.Line(elements=[sol_3])
1820
1818
 
1819
+ for ll in (line_ref, line_1, line_3):
1820
+ ll.configure_drift_model('exact')
1821
+
1821
1822
  coords = np.linspace(-0.05, 0.05, 10)
1822
1823
  coords_6d = np.array(list(itertools.product(*(coords,) * 6))).T
1823
1824
 
@@ -620,19 +620,19 @@ def test_assemble_ring():
620
620
  assert 'cell3_copy' in env.lines
621
621
  assert cell3_select.particle_ref is not None
622
622
  assert env.lines['cell3_copy'] is cell3_select
623
- assert cell3_select._element_dict is env.element_dict
623
+ assert cell3_select.element_dict is env.element_dict
624
624
  assert cell3_select.element_names[0] == 'start.cell.3.arc.2'
625
625
  assert cell3_select.element_names[-1] == 'end.cell.3.arc.2'
626
626
  assert (np.array(cell3_select.element_names) == np.array(
627
627
  tw.rows['start.cell.3.arc.2':'end.cell.3.arc.2'].name)).all()
628
628
 
629
- # Check that they share the _element_dict
630
- assert cell._element_dict is env.element_dict
631
- assert halfcell._element_dict is env.element_dict
632
- assert halfcell_ss._element_dict is env.element_dict
633
- assert cell_ss._element_dict is env.element_dict
634
- assert insertion._element_dict is env.element_dict
635
- assert ring2._element_dict is env.element_dict
629
+ # Check that they share the element_dict
630
+ assert cell.element_dict is env.element_dict
631
+ assert halfcell.element_dict is env.element_dict
632
+ assert halfcell_ss.element_dict is env.element_dict
633
+ assert cell_ss.element_dict is env.element_dict
634
+ assert insertion.element_dict is env.element_dict
635
+ assert ring2.element_dict is env.element_dict
636
636
 
637
637
  cell3_select.twiss4d()
638
638
 
@@ -1039,19 +1039,19 @@ def test_assemble_ring_builders():
1039
1039
  name='cell3_copy')
1040
1040
  assert 'cell3_copy' in env.lines
1041
1041
  assert env.lines['cell3_copy'] is cell3_select
1042
- assert cell3_select._element_dict is env.element_dict
1042
+ assert cell3_select.element_dict is env.element_dict
1043
1043
  assert cell3_select.element_names[0] == 'start.cell.3.arc.2'
1044
1044
  assert cell3_select.element_names[-1] == 'end.cell.3.arc.2'
1045
1045
  assert (np.array(cell3_select.element_names) == np.array(
1046
1046
  tw.rows['start.cell.3.arc.2':'end.cell.3.arc.2'].name)).all()
1047
1047
 
1048
- # Check that they share the _element_dict
1049
- assert cell._element_dict is env.element_dict
1050
- assert halfcell._element_dict is env.element_dict
1051
- assert halfcell_ss._element_dict is env.element_dict
1052
- assert cell_ss._element_dict is env.element_dict
1053
- assert insertion._element_dict is env.element_dict
1054
- assert ring2._element_dict is env.element_dict
1048
+ # Check that they share the element_dict
1049
+ assert cell.element_dict is env.element_dict
1050
+ assert halfcell.element_dict is env.element_dict
1051
+ assert halfcell_ss.element_dict is env.element_dict
1052
+ assert cell_ss.element_dict is env.element_dict
1053
+ assert insertion.element_dict is env.element_dict
1054
+ assert ring2.element_dict is env.element_dict
1055
1055
 
1056
1056
  cell3_select.twiss4d()
1057
1057
 
@@ -1393,13 +1393,13 @@ def test_assemble_ring_repeated_elements():
1393
1393
  xo.assert_allclose(tw_ring2.betx[0], tw_cell.betx[0], atol=0, rtol=5e-4)
1394
1394
  xo.assert_allclose(tw_ring2.bety[0], tw_cell.bety[0], atol=0, rtol=5e-4)
1395
1395
 
1396
- # Check that they share the _element_dict
1397
- assert cell._element_dict is env.element_dict
1398
- assert halfcell._element_dict is env.element_dict
1399
- assert halfcell_ss._element_dict is env.element_dict
1400
- assert cell_ss._element_dict is env.element_dict
1401
- assert insertion._element_dict is env.element_dict
1402
- assert ring2._element_dict is env.element_dict
1396
+ # Check that they share the element_dict
1397
+ assert cell.element_dict is env.element_dict
1398
+ assert halfcell.element_dict is env.element_dict
1399
+ assert halfcell_ss.element_dict is env.element_dict
1400
+ assert cell_ss.element_dict is env.element_dict
1401
+ assert insertion.element_dict is env.element_dict
1402
+ assert ring2.element_dict is env.element_dict
1403
1403
 
1404
1404
  xo.assert_allclose(tw_ring2['betx', 'ip::0'], tw_half_insertion['betx', 'ip'], atol=0, rtol=5e-4)
1405
1405
  xo.assert_allclose(tw_ring2['bety', 'ip::0'], tw_half_insertion['bety', 'ip'], atol=0, rtol=5e-4)
@@ -3193,3 +3193,154 @@ def test_enviroment_from_two_lines():
3193
3193
  assert np.allclose(tw2.s, tw2i.s, atol=0, rtol=1e-15)
3194
3194
  assert np.allclose(tw2.betx, tw2i.betx, atol=0, rtol=1e-15)
3195
3195
  assert np.allclose(tw2.bety, tw2i.bety, atol=0, rtol=1e-15)
3196
+
3197
+ def test_particle_ref_from_particles_container():
3198
+
3199
+ env = xt.Environment()
3200
+ env['a'] = 4.
3201
+
3202
+ env.new_particle('my_particle', p0c=['1e12 * a'])
3203
+ assert 'my_particle' in env.particles
3204
+ xo.assert_allclose(env['my_particle'].p0c, 4e12, rtol=0, atol=1e-9)
3205
+ env['a'] = 5.
3206
+ xo.assert_allclose(env['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3207
+
3208
+ env.particle_ref = 'my_particle'
3209
+
3210
+ xo.assert_allclose(env.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3211
+ assert env.particle_ref.__class__.__name__ == 'EnvParticleRef'
3212
+ assert env._particle_ref == 'my_particle'
3213
+ assert env.ref['my_particle']._value is env.get('my_particle')
3214
+ env.particle_ref.p0c = '2e12 * a'
3215
+ xo.assert_allclose(env.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3216
+ env['my_particle'].p0c = '1e12 * a'
3217
+ xo.assert_allclose(env.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3218
+
3219
+ env2 = xt.Environment.from_dict(env.to_dict())
3220
+ assert 'my_particle' in env2.particles
3221
+ assert isinstance(env2.get('my_particle'), xt.Particles)
3222
+ assert env2.get('my_particle') is not env.get('my_particle')
3223
+ assert env2._particle_ref == "my_particle"
3224
+ assert env2.ref['my_particle']._value is env2.get('my_particle')
3225
+ xo.assert_allclose(env2['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3226
+ env2['a'] = 6.
3227
+ xo.assert_allclose(env2['my_particle'].p0c, 6e12, rtol=0, atol=1e-9)
3228
+ env2['a'] = 5.
3229
+
3230
+ assert env2.particle_ref.__class__.__name__ == 'EnvParticleRef'
3231
+ env2.particle_ref.p0c = '2e12 * a'
3232
+ xo.assert_allclose(env2.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3233
+ env2['my_particle'].p0c = '1e12 * a'
3234
+ xo.assert_allclose(env2.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3235
+
3236
+ env2 = env.copy()
3237
+ assert 'my_particle' in env2.particles
3238
+ assert env2._particle_ref == "my_particle"
3239
+ assert env.ref['my_particle']._value is env.get('my_particle')
3240
+ assert isinstance(env2.get('my_particle'), xt.Particles)
3241
+ assert env2.get('my_particle') is not env.get('my_particle')
3242
+ xo.assert_allclose(env2['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3243
+ env2['a'] = 6.
3244
+ xo.assert_allclose(env2['my_particle'].p0c, 6e12, rtol=0, atol=1e-9)
3245
+ env2['a'] = 5.
3246
+
3247
+ assert env2.particle_ref.__class__.__name__ == 'EnvParticleRef'
3248
+ env2.particle_ref.p0c = '2e12 * a'
3249
+ xo.assert_allclose(env2.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3250
+ env2['my_particle'].p0c = '1e12 * a'
3251
+ xo.assert_allclose(env2.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3252
+
3253
+ ll = env.new_line(name='my_line', components=[])
3254
+ assert ll._particle_ref == 'my_particle'
3255
+
3256
+ xo.assert_allclose(ll.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3257
+ assert ll.particle_ref.__class__.__name__ == 'LineParticleRef'
3258
+ ll.particle_ref.p0c = '2e12 * a'
3259
+ xo.assert_allclose(env.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3260
+ env['my_particle'].p0c = '1e12 * a'
3261
+ xo.assert_allclose(ll.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3262
+
3263
+ ll2 = xt.Line.from_dict(ll.to_dict())
3264
+ assert 'my_particle' in ll2.env.particles
3265
+ assert ll2.env.particle_ref is None
3266
+ assert ll2.particle_ref.__class__.__name__ == 'LineParticleRef'
3267
+ assert ll2._particle_ref == 'my_particle'
3268
+ xo.assert_allclose(ll2.env['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3269
+ ll2['a'] = 7.
3270
+ xo.assert_allclose(ll2.env['my_particle'].p0c, 7e12, rtol=0, atol=1e-9)
3271
+ ll2['a'] = 5.
3272
+
3273
+ ll2.particle_ref.p0c = '2e12 * a'
3274
+ xo.assert_allclose(ll2.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3275
+ ll2.env['my_particle'].p0c = '1e12 * a'
3276
+ xo.assert_allclose(ll2.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3277
+
3278
+
3279
+ ll2 = ll.copy()
3280
+ assert 'my_particle' in ll2.env.particles
3281
+ assert ll2.env.particle_ref is None
3282
+ assert ll2.particle_ref.__class__.__name__ == 'LineParticleRef'
3283
+ assert ll2._particle_ref == 'my_particle'
3284
+ xo.assert_allclose(ll2.env['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3285
+ ll2['a'] = 7.
3286
+ xo.assert_allclose(ll2.env['my_particle'].p0c, 7e12, rtol=0, atol=1e-9)
3287
+ ll2['a'] = 5.
3288
+
3289
+ ll2.particle_ref.p0c = '2e12 * a'
3290
+ xo.assert_allclose(ll2.particle_ref.p0c, 10e12, rtol=0, atol=1e-9)
3291
+ ll2.env['my_particle'].p0c = '1e12 * a'
3292
+ xo.assert_allclose(ll2.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3293
+
3294
+ def test_particle_ref_as_object():
3295
+
3296
+ env = xt.Environment()
3297
+ env['a'] = 4.
3298
+
3299
+ env.new_particle('my_particle', p0c=['1e12 * a'])
3300
+ assert 'my_particle' in env.particles
3301
+ xo.assert_allclose(env['my_particle'].p0c, 4e12, rtol=0, atol=1e-9)
3302
+ env['a'] = 5.
3303
+ xo.assert_allclose(env['my_particle'].p0c, 5e12, rtol=0, atol=1e-9)
3304
+
3305
+ part = env['my_particle'].copy()
3306
+ env.particle_ref = part
3307
+
3308
+ xo.assert_allclose(env.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3309
+ assert env.particle_ref.__class__.__name__ == 'EnvParticleRef'
3310
+ assert env._particle_ref is part
3311
+ env['my_particle'].p0c = '2e12 * a'
3312
+ xo.assert_allclose(env.eval('2e12 * a'), 10e12, rtol=0, atol=1e-9)
3313
+ xo.assert_allclose(env.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3314
+
3315
+ env2 = xt.Environment.from_dict(env.to_dict())
3316
+ assert 'my_particle' in env2.particles
3317
+ assert isinstance(env2.get('my_particle'), xt.Particles)
3318
+ assert env2.get('my_particle') is not env.get('my_particle')
3319
+ assert isinstance(env2._particle_ref, xt.Particles)
3320
+ assert env2.particle_ref.__class__.__name__ == 'EnvParticleRef'
3321
+
3322
+ env2 = env.copy()
3323
+ assert 'my_particle' in env2.particles
3324
+ assert isinstance(env2._particle_ref, xt.Particles)
3325
+ assert isinstance(env2.get('my_particle'), xt.Particles)
3326
+ assert env2.get('my_particle') is not env.get('my_particle')
3327
+ assert env2.particle_ref.__class__.__name__ == 'EnvParticleRef'
3328
+
3329
+ ll = env.new_line(name='my_line', components=[])
3330
+ assert isinstance(ll._particle_ref, xt.Particles)
3331
+ assert ll._particle_ref is env._particle_ref
3332
+ xo.assert_allclose(ll.particle_ref.p0c, 5e12, rtol=0, atol=1e-9)
3333
+ assert ll.particle_ref.__class__.__name__ == 'LineParticleRef'
3334
+
3335
+ ll2 = xt.Line.from_dict(ll.to_dict())
3336
+ assert ll2.env.particle_ref is None
3337
+ assert ll2.particle_ref.__class__.__name__ == 'LineParticleRef'
3338
+ assert isinstance(ll2._particle_ref, xt.Particles)
3339
+ assert ll2._particle_ref is not ll._particle_ref
3340
+
3341
+
3342
+ ll2 = ll.copy()
3343
+ assert ll2.env.particle_ref is None
3344
+ assert ll2.particle_ref.__class__.__name__ == 'LineParticleRef'
3345
+ assert isinstance(ll2._particle_ref, xt.Particles)
3346
+ assert ll2._particle_ref is not ll._particle_ref
@@ -65,7 +65,7 @@ def test_simplification_methods():
65
65
  line.remove_zero_length_drifts(inplace=True)
66
66
 
67
67
  # Test merging of multipoles
68
- line._var_management = None
68
+ line.env._var_management = None
69
69
  line.insert_element(element=xt.Multipole(knl=[1, 0, 3], ksl=[0, 20, 0]), name='m1', at_s=3.3)
70
70
  line.insert_element(element=xt.Multipole(knl=[4, 2], ksl=[10, 40]), name='m2', at_s=3.3)
71
71
  line.insert_element(element=xt.Multipole(knl=[0, 3, 8], ksl=[2, 0, 17]), name='m3', at_s=3.3)
@@ -413,9 +413,6 @@ def test_multispecies_quadrupole():
413
413
  line_ref1.configure_bend_model(core=model)
414
414
  line_ref2.configure_bend_model(core=model)
415
415
 
416
- # line_ref1.config.XTRACK_USE_EXACT_DRIFTS = True
417
- # line_ref2.config.XTRACK_USE_EXACT_DRIFTS = True
418
-
419
416
  line_ref1.build_tracker()
420
417
  line_ref2.build_tracker()
421
418
 
@@ -521,9 +518,6 @@ def test_multispecies_sextupole():
521
518
  line_ref1.configure_bend_model(core=model)
522
519
  line_ref2.configure_bend_model(core=model)
523
520
 
524
- # line_ref1.config.XTRACK_USE_EXACT_DRIFTS = True
525
- # line_ref2.config.XTRACK_USE_EXACT_DRIFTS = True
526
-
527
521
  line_ref1.build_tracker()
528
522
  line_ref2.build_tracker()
529
523
 
@@ -623,8 +617,8 @@ def test_multispecies_octupole():
623
617
  line_ref1.append_element(element=xt.Marker(), name='endmarker')
624
618
  line_ref2.append_element(element=xt.Marker(), name='endmarker')
625
619
 
626
- line_ref1.config.XTRACK_USE_EXACT_DRIFTS = True
627
- line_ref2.config.XTRACK_USE_EXACT_DRIFTS = True
620
+ line_ref1.configure_drift_model(model='exact')
621
+ line_ref2.configure_drift_model(model='exact')
628
622
 
629
623
  line_ref1.build_tracker()
630
624
  line_ref2.build_tracker()
@@ -4,6 +4,7 @@
4
4
  # ######################################### #
5
5
  import numpy as np
6
6
  import pytest
7
+ from scipy.constants import c as clight
7
8
 
8
9
  import xtrack as xt
9
10
  import xobjects as xo
@@ -135,7 +136,7 @@ def test_check_is_active_sorting_cpu_default(test_context):
135
136
  assert set(particles.particle_id[8:]) == {1, 3, 5, 6, 7, 8, 9, 10, 12, 17}
136
137
 
137
138
  def test_particles_energy_coordinates():
138
- p = xt.Particles(mass0=xt.PROTON_MASS_EV, q0=1,
139
+ p = xt.Particles(mass0=xt.PROTON_MASS_EV, q0=2,
139
140
  kinetic_energy0=50e6, delta=0.1)
140
141
 
141
142
  beta0 = p.beta0[0]
@@ -144,6 +145,7 @@ def test_particles_energy_coordinates():
144
145
  energy0 = p.energy0[0]
145
146
  energy = p.energy[0]
146
147
  p0c = p.p0c[0]
148
+ rigidity0 = p.rigidity0[0]
147
149
 
148
150
  delta = p.delta[0]
149
151
  ptau = p.ptau[0]
@@ -156,6 +158,7 @@ def test_particles_energy_coordinates():
156
158
  xo.assert_allclose(gamma, 1 / np.sqrt(1 - beta**2), rtol=0, atol=1e-14)
157
159
  xo.assert_allclose(energy, mass0_ev * gamma, rtol=0, atol=1e-6) # 1e-6 eV
158
160
  xo.assert_allclose(energy0, mass0_ev * gamma0, rtol=0, atol=1e-6) # 1e-6 eV
161
+ xo.assert_allclose(rigidity0, p0c / clight / p.q0, rtol=0, atol=1e-14)
159
162
 
160
163
  Pc = p0c * (1 + delta)
161
164
  xo.assert_allclose(Pc, mass0_ev * gamma * beta, rtol=0, atol=1e-6) # 1e-6 eV
@@ -1376,7 +1376,7 @@ def test_rbend_straight_body_thin_slices_fine():
1376
1376
  at=2.5)])
1377
1377
  line.insert('start', xt.Marker(), at=0)
1378
1378
  line.append('end', xt.Marker())
1379
- line.config.XTRACK_USE_EXACT_DRIFTS = True
1379
+ line.configure_drift_model('exact')
1380
1380
 
1381
1381
  line_no_slice = line.copy(shallow=True)
1382
1382
 
@@ -457,7 +457,6 @@ def test_slicing_xdeps_consistency():
457
457
  elements=[xt.Bend(k0=1, length=100)] * num_elements,
458
458
  element_names=[f'bend{ii}' for ii in range(num_elements)],
459
459
  )
460
- line._init_var_management()
461
460
 
462
461
  for ii in range(num_elements):
463
462
  line.vars[f'k{ii}'] = 1
@@ -150,7 +150,7 @@ def test_survey_with_ref_transformations():
150
150
  ])
151
151
 
152
152
  line.config.XTRACK_GLOBAL_XY_LIMIT = None
153
- line.config.XTRACK_USE_EXACT_DRIFTS = True
153
+ line.configure_drift_model('exact')
154
154
  tw = line.twiss4d(_continue_if_lost=True, betx=1, bety=1, x=1e-3, y=2e-3)
155
155
 
156
156
  sv_no_arg = line.survey()
@@ -289,7 +289,7 @@ def test_survey_with_h_and_v_bends():
289
289
  ])
290
290
 
291
291
  line.config.XTRACK_GLOBAL_XY_LIMIT = None
292
- line.config.XTRACK_USE_EXACT_DRIFTS = True
292
+ line.configure_drift_model('exact')
293
293
  tw = line.twiss4d(_continue_if_lost=True, betx=1, bety=1, x=1e-3, y=2e-3)
294
294
 
295
295
  sv_no_arg = line.survey()
@@ -463,7 +463,7 @@ def test_survey_against_madx():
463
463
  tw_ptc = xt.Table(mad.table.ptc_twiss)
464
464
 
465
465
  line.config.XTRACK_GLOBAL_XY_LIMIT = None
466
- line.config.XTRACK_USE_EXACT_DRIFTS = True
466
+ line.configure_drift_model('exact')
467
467
 
468
468
  sv = line.survey()
469
469
  tw = line.twiss(betx=1, bety=1, x=1e-3, y=2e-3)
@@ -0,0 +1 @@
1
+ __version__ = '0.90.0'
@@ -18,6 +18,13 @@ from xtrack.internal_record import RecordIndex
18
18
 
19
19
  DEFAULT_MULTIPOLE_ORDER = 5
20
20
 
21
+ _INDEX_TO_MODEL_DRIFT = {
22
+ 0: 'adaptive',
23
+ 1: 'expanded',
24
+ 2: 'exact'
25
+ }
26
+ _MODEL_TO_INDEX_DRIFT = {k: v for v, k in _INDEX_TO_MODEL_DRIFT.items()}
27
+
21
28
  _INDEX_TO_MODEL_CURVED = {
22
29
  0: 'adaptive',
23
30
  1: 'full',
@@ -95,6 +102,24 @@ class _HasIntegrator:
95
102
  except KeyError:
96
103
  raise ValueError(f'Invalid integrator: {value}')
97
104
 
105
+ class _HasModelDrift:
106
+
107
+ """
108
+ Mixin class adding properties and methods for beam elements
109
+ with drift model fields.
110
+ """
111
+
112
+ @property
113
+ def model(self):
114
+ return _INDEX_TO_MODEL_DRIFT[self._model]
115
+
116
+ @model.setter
117
+ def model(self, value):
118
+ try:
119
+ self._model = _MODEL_TO_INDEX_DRIFT[value]
120
+ except KeyError:
121
+ raise ValueError(f'Invalid model: {value}')
122
+
98
123
  class _HasModelStraight:
99
124
 
100
125
  """
@@ -315,7 +340,7 @@ class Marker(BeamElement):
315
340
  ]
316
341
 
317
342
 
318
- class Drift(BeamElement):
343
+ class Drift(_HasModelDrift, BeamElement):
319
344
  """Beam element modeling a drift section.
320
345
 
321
346
  Parameters
@@ -326,7 +351,8 @@ class Drift(BeamElement):
326
351
  """
327
352
 
328
353
  _xofields = {
329
- 'length': xo.Float64
354
+ 'length': xo.Float64,
355
+ 'model': xo.Int64
330
356
  }
331
357
 
332
358
  isthick = True
@@ -339,6 +365,12 @@ class Drift(BeamElement):
339
365
  '#include <beam_elements/elements_src/drift.h>',
340
366
  ]
341
367
 
368
+ _rename = {
369
+ 'model': '_model',
370
+ }
371
+
372
+ _no_expr_fields = {'model'}
373
+
342
374
  def __init__(self, length=None, **kwargs):
343
375
 
344
376
  if '_xobject' in kwargs and kwargs['_xobject'] is not None:
@@ -18,9 +18,25 @@ void Drift_track_local_particle(DriftData el, LocalParticle* part0){
18
18
  length = -length;
19
19
  }
20
20
 
21
- START_PER_PARTICLE_BLOCK(part0, part);
22
- Drift_single_particle(part, length);
23
- END_PER_PARTICLE_BLOCK;
21
+ int64_t model;
22
+ #ifdef XTRACK_USE_EXACT_DRIFTS
23
+ model = 2;
24
+ #else
25
+ model = DriftData_get_model(el);
26
+ if (model == 0) { // adaptive
27
+ model = 1; // expanded
28
+ }
29
+ #endif
30
+
31
+ if (model == 1) {
32
+ START_PER_PARTICLE_BLOCK(part0, part);
33
+ Drift_single_particle_expanded(part, length);
34
+ END_PER_PARTICLE_BLOCK;
35
+ } else if (model == 2) {
36
+ START_PER_PARTICLE_BLOCK(part0, part);
37
+ Drift_single_particle_exact(part, length);
38
+ END_PER_PARTICLE_BLOCK;
39
+ }
24
40
  }
25
41
 
26
42
 
@@ -24,9 +24,25 @@ void DriftSlice_track_local_particle(
24
24
  length = weight * DriftSliceData_get__parent_length(el); // m
25
25
  }
26
26
 
27
- START_PER_PARTICLE_BLOCK(part0, part);
28
- Drift_single_particle(part, length);
29
- END_PER_PARTICLE_BLOCK;
27
+ int64_t model;
28
+ #ifdef XTRACK_USE_EXACT_DRIFTS
29
+ model = 2;
30
+ #else
31
+ model = DriftSliceData_get__parent_model(el);
32
+ if (model == 0) { // adaptive
33
+ model = 1; // expanded
34
+ }
35
+ #endif
36
+
37
+ if (model == 1) {
38
+ START_PER_PARTICLE_BLOCK(part0, part);
39
+ Drift_single_particle_expanded(part, length);
40
+ END_PER_PARTICLE_BLOCK;
41
+ } else if (model == 2) {
42
+ START_PER_PARTICLE_BLOCK(part0, part);
43
+ Drift_single_particle_exact(part, length);
44
+ END_PER_PARTICLE_BLOCK;
45
+ }
30
46
  }
31
47
 
32
48
  #endif
@@ -498,11 +498,11 @@ void track_magnet_particles(
498
498
  }
499
499
  }
500
500
 
501
- double k0_drift, k1_drift, h_drift, ks_drift;
502
- double k0_kick, k1_kick, h_kick;
503
- double k0_h_correction, k1_h_correction;
504
- int8_t kick_rot_frame;
505
- int8_t drift_model;
501
+ double k0_drift=0, k1_drift=0, h_drift=0, ks_drift=0;
502
+ double k0_kick=0, k1_kick=0, h_kick=0;
503
+ double k0_h_correction=0, k1_h_correction=0;
504
+ int8_t kick_rot_frame=0;
505
+ int8_t drift_model=0;
506
506
  configure_tracking_model(
507
507
  model,
508
508
  k0,
@@ -417,11 +417,11 @@ void track_magnet_particles(
417
417
  }
418
418
  }
419
419
 
420
- double k0_drift, k1_drift, h_drift, ks_drift;
421
- double k0_kick, k1_kick, h_kick;
422
- double k0_h_correction, k1_h_correction;
423
- int8_t kick_rot_frame;
424
- int8_t drift_model;
420
+ double k0_drift=0, k1_drift=0, h_drift=0, ks_drift=0;
421
+ double k0_kick=0, k1_kick=0, h_kick=0;
422
+ double k0_h_correction=0, k1_h_correction=0;
423
+ int8_t kick_rot_frame=0;
424
+ int8_t drift_model=0;
425
425
  configure_tracking_model(
426
426
  model,
427
427
  k0,