xtrack 0.94.1__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.
- {xtrack-0.94.1/xtrack.egg-info → xtrack-0.95.0}/PKG-INFO +1 -1
- xtrack-0.95.0/tests/test_atomic_add.py +90 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_element_internal_record.py +0 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_elements.py +15 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_elements_thick.py +12 -16
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_madnginterface.py +26 -8
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_misalign.py +254 -27
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_native_madloader.py +47 -15
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_native_madloader_lhc.py +41 -14
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_slicing.py +127 -77
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_spin.py +255 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_tilt_shifts.py +3 -6
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_twiss.py +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +2 -2
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/python_lattice_writer/lattice_py_generation.py +21 -8
- xtrack-0.95.0/xtrack/_version.py +1 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/base_element.py +95 -234
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements.py +7 -0
- xtrack-0.95.0/xtrack/beam_elements/elements_src/_generate_slice_elements_c_code.py +310 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/bend.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/misalignment.h +3 -2
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/rbend.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/srotation.h +0 -13
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_bend.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_bend.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet.h +0 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +28 -23
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_misalignments.h +18 -15
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_srotation.h +13 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_xrotation.h +13 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_yrotation.h +13 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/xrotation.h +0 -13
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/yrotation.h +0 -13
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/slice_base.py +1 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/slice_elements_drift.py +4 -2
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/environment.py +79 -23
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/footprint.py +3 -0
- xtrack-0.95.0/xtrack/headers/atomicadd.h +350 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/headers/particle_states.h +1 -0
- xtrack-0.95.0/xtrack/headers/track_local_particle_with_transformations.h +208 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/internal_record.py +14 -12
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/line.py +44 -67
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/mad_loader.py +5 -5
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/mad_parser/loader.py +50 -60
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/mad_parser/madx.lark +3 -2
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/mad_parser/parse.py +6 -3
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/mad_writer.py +23 -13
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/madng_interface.py +3 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/particles/particles.py +3 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/slicing.py +32 -18
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/track_flags.py +3 -3
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/twiss.py +8 -3
- {xtrack-0.94.1 → xtrack-0.95.0/xtrack.egg-info}/PKG-INFO +1 -1
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack.egg-info/SOURCES.txt +3 -0
- xtrack-0.94.1/xtrack/_version.py +0 -1
- xtrack-0.94.1/xtrack/headers/atomicadd.h +0 -41
- {xtrack-0.94.1 → xtrack-0.95.0}/LICENSE +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/MANIFEST.in +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/README.md +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/base_classes.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/BB6D.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/beambeam.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/boost.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/qgauss.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/slicing.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/be_beamfields/spacecharge.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/elements.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/line.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/mathlibs.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/particles.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/ducktrack/temp_pyparticles.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/pyproject.toml +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/setup.cfg +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/setup.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_acceleration.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_amplitude_detuning.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_aperture_table.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_apertures.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_attr_replicas_and_slices.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_boris_spatial.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_bucket_with_ref_energy_change.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_cavity_absolute_time.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_chromatic_functions_vs_madx.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_coasting.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_collective_tracker.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_collimation.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_coupling_edwards_teng.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_electron_cooler.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_element_characterization_functions.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_elements_classflags.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_environment.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_fcc_ee_solenoid_correction.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_footprint.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_freeze_longitudinal.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_full_rings.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_h6_sps_beamline.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_hvkick.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_ions.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_json.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_legacy_multiline_to_env.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_lhc_env.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_lhc_match_phase_15.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_line.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_load.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_load_vars.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_lumi.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_mad_writer.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_madloader.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_magnet.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_match_and_track_from_element.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_match_coupling_knob.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_match_nested.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_match_optics_and_ip_knob.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_match_orbit_bump.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_match_tune_chroma_cminus.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_monitor.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_multi_bunch_gauss.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_multiline.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_multisetter.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_multispecies.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_optimize_for_tracking.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_particles.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_particles_basics.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_particles_pdg.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_pipeline.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_prebuild_kernels.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_ps_against_ptc.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_ps_multiturn_twiss.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_psb_chicane.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_pyht_interface.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_quadrupole_fringe_ptc.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_quadrupole_wedge.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_radial_steering.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_radiation.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_radiation_equilibrium_emittances.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_radiation_integrals.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_random_gen.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_random_gen_exp.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_random_gen_gauss.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_random_gen_ruth.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_rbend_rbarc.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_rbend_straight_body.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_rf_track.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_rotation_signs.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_second_order_taylor_map.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_seeds.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_slice_and_insert_with_replicas.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_slice_elements.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_spacecharge_in_ring.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_sps_thick.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_survey.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_tapering.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_thick_kickers_rf_crab.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_thick_lhc.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_tracker.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_trajectory_correcton.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_twiss_to_file.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_twiss_vs_madx_psb.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_vs_madx.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/tests/test_xmask_orbit_correction.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/lhc_match/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/lhc_match/var_limits.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/_temp/python_lattice_writer/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/aperture_meas.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/apertures.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/beam_interaction.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/cavity.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/crab_cavity.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_exact.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_exact_slice.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_cavity.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_crab_cavity.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_multipole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/elens.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/exciter.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/magnet.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/marker.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/multipole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/octupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/slnd.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/temprf.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_cavity.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_crab_cavity.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_multipole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_cavity.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_crab_cavity.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_multipole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet.template.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_configure.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_rf.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_rf.template.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/track_xyshift.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/wedge.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/wire.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/exciter.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/rft_element.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/slice_elements_edge.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/slice_elements_thick.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/beam_elements/slice_elements_thin.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/boris.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/builder.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/functions.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/general.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/headers/checks.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/headers/constants.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/headers/synrad_spectrum.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/headers/track.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/json.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/linear_normal_form.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/load.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/loss_location_refinement/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/lumi.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/mad_parser/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/match.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/beam_position_monitor.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/beam_position_monitor.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/beam_profile_monitor.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/beam_profile_monitor.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/beam_size_monitor.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/beam_size_monitor.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/last_turns_monitor.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/last_turns_monitor.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/particles_monitor.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/monitors/particles_monitor.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/multiline.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/multiline_legacy/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/multiline_legacy/shared_knobs.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/multisetter/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/multisetter/multisetter.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/particles/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/particles/constants.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/particles/masses.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/particles/pdg.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/particles/rng_src/base_rng.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/particles/rng_src/particles_rng.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/pipeline/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/pipeline/core.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/pipeline/manager.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/pipeline/multitracker.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/prebuilt_kernel_definitions/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/prebuilt_kernel_definitions/element_inits.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/prebuilt_kernel_definitions/element_types.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/progress_indicator.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/random/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/random/random_generators.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/random/random_src/exponential.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/random/random_src/normal.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/random/random_src/rutherford.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/random/random_src/uniform.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/random/random_src/uniform_accurate.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/survey.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/svgutils/__init__.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/svgutils/parser.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/svgutils/path.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/svgutils/svgutils.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/synctime.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/table.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/tapering.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/targets.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/tracker.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/tracker_data.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/tracker_src/tracker.h +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/trajectory_correction.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/twissplot.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack/view.py +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack.egg-info/dependency_links.txt +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack.egg-info/requires.txt +0 -0
- {xtrack-0.94.1 → xtrack-0.95.0}/xtrack.egg-info/top_level.txt +0 -0
|
@@ -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
|
|
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.
|
|
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.
|
|
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.
|
|
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-
|
|
206
|
-
xo.assert_allclose(tw.bety, tw.beta22_ng, rtol=1e-
|
|
207
|
-
xo.assert_allclose(tw.alfx, tw.alfa11_ng, rtol=1e-
|
|
208
|
-
xo.assert_allclose(tw.alfy, tw.alfa22_ng, rtol=1e-
|
|
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
|
|
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(
|
|
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
|
-
|
|
436
|
-
|
|
437
|
-
|
|
626
|
+
line.slice_thick_elements([
|
|
627
|
+
xt.Strategy(slicing=xt.Teapot(50, mode='thin')),
|
|
628
|
+
])
|
|
438
629
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
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
|
-
|
|
444
|
-
|
|
445
|
-
|
|
634
|
+
if not valid:
|
|
635
|
+
assert p_test.state[0] == -42
|
|
636
|
+
return
|
|
446
637
|
|
|
447
|
-
|
|
448
|
-
line['b'].
|
|
449
|
-
|
|
450
|
-
|
|
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
|
-
|
|
453
|
-
|
|
454
|
-
assert p.state[0] == -41
|
|
678
|
+
p = p0.copy()
|
|
679
|
+
line_test.track(p)
|
|
455
680
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
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
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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)
|