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.
- {xtrack-0.89.3/xtrack.egg-info → xtrack-0.90.0}/PKG-INFO +1 -1
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_elements.py +36 -2
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_elements_thick.py +7 -6
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_environment.py +174 -23
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_line.py +1 -1
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_multispecies.py +2 -8
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_particles.py +4 -1
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_rbend_straight_body.py +1 -1
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_slicing.py +0 -1
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_survey.py +3 -3
- xtrack-0.90.0/xtrack/_version.py +1 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements.py +34 -2
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift.h +19 -3
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice.h +19 -3
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet.h +5 -5
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet.template.h +5 -5
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/environment.py +480 -40
- xtrack-0.90.0/xtrack/functions.py +80 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/line.py +195 -412
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_loader.py +4 -8
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multiline_legacy/shared_knobs.py +1 -1
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/particles.py +8 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/survey.py +2 -1
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/trajectory_correction.py +4 -2
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/twiss.py +5 -0
- {xtrack-0.89.3 → xtrack-0.90.0/xtrack.egg-info}/PKG-INFO +1 -1
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack.egg-info/SOURCES.txt +1 -0
- xtrack-0.89.3/xtrack/_version.py +0 -1
- {xtrack-0.89.3 → xtrack-0.90.0}/LICENSE +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/MANIFEST.in +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/README.md +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/base_classes.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/BB6D.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/BB6Ddata.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/beambeam.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/boost.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/gaussian_fields.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/propagate_sigma_matrix.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/qgauss.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/slicing.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/be_beamfields/spacecharge.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/elements.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/line.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/mathlibs.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/particles.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/ducktrack/temp_pyparticles.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/pyproject.toml +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/setup.cfg +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/setup.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_acceleration.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_amplitude_detuning.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_aperture_table.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_aperture_turn_ele_and_monitor.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_apertures.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_attr_replicas_and_slices.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_bucket_with_ref_energy_change.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_cavity_absolute_time.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_chromatic_functions_vs_madx.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_coasting.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_collective_tracker.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_collimation.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_coupling_edwards_teng.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_electron_cooler.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_element_characterization_functions.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_element_internal_record.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_elements_classflags.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_fcc_ee_solenoid_correction.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_fcc_ee_solenoid_correction_new_optimize_api.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_footprint.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_freeze_longitudinal.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_full_rings.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_h6_sps_beamline.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_hvkick.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_ions.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_legacy_multiline_to_env.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_lhc_env.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_lhc_match_phase_15.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_load.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_load_vars.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_lumi.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_mad_writer.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_madloader.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_madnginterface.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_magnet.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_and_track_from_element.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_coupling_knob.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_nested.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_optics_and_ip_knob.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_optics_and_ip_knob_new_optimize_api.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_orbit_bump.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_match_tune_chroma_cminus.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_misalign.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_monitor.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_multi_bunch_gauss.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_multiline.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_multisetter.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_native_madloader.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_optimize_for_tracking.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_particles_basics.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_particles_pdg.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_pipeline.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_prebuild_kernels.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_ps_against_ptc.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_ps_multiturn_twiss.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_psb_chicane.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_pyht_interface.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_quadrupole_fringe_ptc.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_quadrupole_wedge.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radial_steering.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radiation.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radiation_equilibrium_emittances.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radiation_equilibrium_emittances_thick.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_radiation_integrals.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_random_gen.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_random_gen_exp.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_random_gen_gauss.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_random_gen_ruth.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_rbend_rbarc.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_rf_track.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_rotation_signs.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_second_order_taylor_map.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_seeds.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_slice_and_insert_with_replicas.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_slice_elements.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_solenoid_bz_map_vs_boris.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_solenoid_bz_map_vs_boris_legacy.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_spacecharge_in_ring.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_spin.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_sps_thick.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_tapering.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_thick_kickers_rf_crab.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_thick_lhc.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_tilt_shifts.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_tracker.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_trajectory_correcton.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_twiss.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_twiss_vs_madx_psb.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_vs_madx.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/tests/test_xmask_orbit_correction.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/boris_and_solenoid_map/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/boris_and_solenoid_map/boris.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/boris_and_solenoid_map/solenoid_field.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/lhc_match/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/lhc_match/gen_madx_optics_file.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/lhc_match/lhc_match.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/_temp/lhc_match/var_limits.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/aperture_meas.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/base_element.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitellipse.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitpolygon.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitracetrack.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitrect.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/limitrectellipse.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/apertures_src/longitudinallimitrect.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/beam_interaction.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/bend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/cavity.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/crab_cavity.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/default_magnet_config.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/dipole_fringe.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/dipoleedge.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_exact.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_exact_slice.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_bend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_cavity.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_crab_cavity.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_multipole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_octupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_quadrupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_rbend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_sextupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/drift_slice_uniform_solenoid.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/electroncooler.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/elens.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/exciter.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/firstordertaylormap.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/legacy_solenoid.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/linesegmentmap.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/magnet.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/magnet_drift.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/magnet_edge.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/magnet_kick.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/marker.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/misalignment.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/multipole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/multipoleedge.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/nonlinearlens.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/octupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/quadrupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/rbend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/referenceenergyincrease.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/rfmultipole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/second_order_taylor_map.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/sextupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/simplethinbend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/simplethinquadrupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/slnd.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/srotation.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/temprf.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_bend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_cavity.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_crab_cavity.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_multipole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_octupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_quadrupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_rbend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_sextupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thick_slice_uniform_solenoid.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_bend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_bend_entry.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_bend_exit.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_cavity.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_crab_cavity.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_multipole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_octupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_entry.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_octupole_exit.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_entry.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_quadrupole_exit.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_rbend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_entry.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_rbend_exit.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_entry.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_sextupole_exit.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_entry.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/thin_slice_uniform_solenoid_exit.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_dipole_edge_linear.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_dipole_edge_nonlinear.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_dipole_fringe.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_drift.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_multipolar_components.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_legacy_solenoid_radiation.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_configure.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_drift.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_edge.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_kick.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_magnet_radiation.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_misalignments.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_mult_fringe.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_rf.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_rf.template.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_srotation.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_thick_bend.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_thick_cfd.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_wedge.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_xrotation.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_xyshift.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/track_yrotation.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/variable_solenoid.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/wedge.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/wire.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/xrotation.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/xyshift.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/yrotation.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/elements_src/zetashift.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/exciter.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/rft_element.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_base.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_elements_drift.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_elements_edge.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_elements_thick.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/beam_elements/slice_elements_thin.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/footprint.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/general.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/atomicadd.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/checks.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/constants.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/particle_states.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/synrad_spectrum.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/headers/track.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/internal_record.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/json.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/linear_normal_form.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/load.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/loss_location_refinement/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/loss_location_refinement/loss_location_refinement.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/lumi.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_parser/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_parser/loader.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_parser/madx.lark +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_parser/parse.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/mad_writer.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/madng_interface.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/match.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_position_monitor.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_position_monitor.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_profile_monitor.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_profile_monitor.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_size_monitor.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/beam_size_monitor.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/last_turns_monitor.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/last_turns_monitor.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/particles_monitor.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/monitors/particles_monitor.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multiline.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multiline_legacy/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multiline_legacy/multiline_legacy.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multisetter/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/multisetter/multisetter.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/constants.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/masses.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/pdg.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/rng_src/base_rng.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/particles/rng_src/particles_rng.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/pipeline/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/pipeline/core.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/pipeline/manager.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/pipeline/multitracker.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/progress_indicator.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_generators.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/exponential.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/exponential_integral_Ei.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/normal.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/rutherford.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/uniform.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/random/random_src/uniform_accurate.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/slicing.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/svgutils/__init__.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/svgutils/parser.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/svgutils/path.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/svgutils/svgutils.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/synctime.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/tapering.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/targets.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/track_flags.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/tracker.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/tracker_data.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/tracker_src/tracker.h +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack/twissplot.py +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack.egg-info/dependency_links.txt +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack.egg-info/requires.txt +0 -0
- {xtrack-0.89.3 → xtrack-0.90.0}/xtrack.egg-info/top_level.txt +0 -0
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
630
|
-
assert cell.
|
|
631
|
-
assert halfcell.
|
|
632
|
-
assert halfcell_ss.
|
|
633
|
-
assert cell_ss.
|
|
634
|
-
assert insertion.
|
|
635
|
-
assert ring2.
|
|
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.
|
|
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
|
|
1049
|
-
assert cell.
|
|
1050
|
-
assert halfcell.
|
|
1051
|
-
assert halfcell_ss.
|
|
1052
|
-
assert cell_ss.
|
|
1053
|
-
assert insertion.
|
|
1054
|
-
assert ring2.
|
|
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
|
|
1397
|
-
assert cell.
|
|
1398
|
-
assert halfcell.
|
|
1399
|
-
assert halfcell_ss.
|
|
1400
|
-
assert cell_ss.
|
|
1401
|
-
assert insertion.
|
|
1402
|
-
assert ring2.
|
|
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.
|
|
627
|
-
line_ref2.
|
|
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=
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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,
|