xsuite 0.41.0__cp312-cp312-macosx_11_0_arm64.whl → 0.41.2__cp312-cp312-macosx_11_0_arm64.whl

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.

Potentially problematic release.


This version of xsuite might be problematic. Click here for more details.

@@ -3368,244 +3368,679 @@ void LocalParticle_scale_exact_xp_yp(LocalParticle* part, double value_x, double
3368
3368
  }
3369
3369
 
3370
3370
 
3371
- #ifndef XOBJ_TYPEDEF_ParticlesMonitorData
3372
- #define XOBJ_TYPEDEF_ParticlesMonitorData
3373
- typedef struct ParticlesMonitorData_s * ParticlesMonitorData;
3374
- static inline ParticlesMonitorData ParticlesMonitorData_getp(ParticlesMonitorData restrict obj){
3371
+ #ifndef XOBJ_TYPEDEF_RandomUniformData
3372
+ #define XOBJ_TYPEDEF_RandomUniformData
3373
+ typedef struct RandomUniformData_s * RandomUniformData;
3374
+ static inline RandomUniformData RandomUniformData_getp(RandomUniformData restrict obj){
3375
3375
  int64_t offset=0;
3376
- return (ParticlesMonitorData)(( char*) obj+offset);
3376
+ return (RandomUniformData)(( char*) obj+offset);
3377
3377
  }
3378
- static inline int64_t ParticlesMonitorData_get_start_at_turn(const ParticlesMonitorData restrict obj){
3378
+ static inline uint8_t RandomUniformData_get__dummy(const RandomUniformData restrict obj){
3379
+ int64_t offset=0;
3380
+ return *(( uint8_t*) obj+offset);
3381
+ }
3382
+ static inline void RandomUniformData_set__dummy(RandomUniformData restrict obj, uint8_t value){
3383
+ int64_t offset=0;
3384
+ *(( uint8_t*) obj+offset)=value;
3385
+ }
3386
+ static inline uint8_t* RandomUniformData_getp__dummy(RandomUniformData restrict obj){
3387
+ int64_t offset=0;
3388
+ return ( uint8_t*)(( char*) obj+offset);
3389
+ }
3390
+ static inline double RandomUniformData_get__sin_rot_s(const RandomUniformData restrict obj){
3379
3391
  int64_t offset=0;
3380
3392
  offset+=8;
3381
- return *( int64_t*)(( char*) obj+offset);
3393
+ return *( double*)(( char*) obj+offset);
3382
3394
  }
3383
- static inline void ParticlesMonitorData_set_start_at_turn(ParticlesMonitorData restrict obj, int64_t value){
3395
+ static inline void RandomUniformData_set__sin_rot_s(RandomUniformData restrict obj, double value){
3384
3396
  int64_t offset=0;
3385
3397
  offset+=8;
3386
- *( int64_t*)(( char*) obj+offset)=value;
3398
+ *( double*)(( char*) obj+offset)=value;
3387
3399
  }
3388
- static inline int64_t* ParticlesMonitorData_getp_start_at_turn(ParticlesMonitorData restrict obj){
3400
+ static inline double* RandomUniformData_getp__sin_rot_s(RandomUniformData restrict obj){
3389
3401
  int64_t offset=0;
3390
3402
  offset+=8;
3391
- return ( int64_t*)(( char*) obj+offset);
3403
+ return ( double*)(( char*) obj+offset);
3392
3404
  }
3393
- static inline int64_t ParticlesMonitorData_get_stop_at_turn(const ParticlesMonitorData restrict obj){
3405
+ static inline double RandomUniformData_get__cos_rot_s(const RandomUniformData restrict obj){
3394
3406
  int64_t offset=0;
3395
3407
  offset+=16;
3396
- return *( int64_t*)(( char*) obj+offset);
3408
+ return *( double*)(( char*) obj+offset);
3397
3409
  }
3398
- static inline void ParticlesMonitorData_set_stop_at_turn(ParticlesMonitorData restrict obj, int64_t value){
3410
+ static inline void RandomUniformData_set__cos_rot_s(RandomUniformData restrict obj, double value){
3399
3411
  int64_t offset=0;
3400
3412
  offset+=16;
3401
- *( int64_t*)(( char*) obj+offset)=value;
3413
+ *( double*)(( char*) obj+offset)=value;
3402
3414
  }
3403
- static inline int64_t* ParticlesMonitorData_getp_stop_at_turn(ParticlesMonitorData restrict obj){
3415
+ static inline double* RandomUniformData_getp__cos_rot_s(RandomUniformData restrict obj){
3404
3416
  int64_t offset=0;
3405
3417
  offset+=16;
3406
- return ( int64_t*)(( char*) obj+offset);
3418
+ return ( double*)(( char*) obj+offset);
3407
3419
  }
3408
- static inline int64_t ParticlesMonitorData_get_part_id_start(const ParticlesMonitorData restrict obj){
3420
+ static inline double RandomUniformData_get__shift_x(const RandomUniformData restrict obj){
3409
3421
  int64_t offset=0;
3410
3422
  offset+=24;
3411
- return *( int64_t*)(( char*) obj+offset);
3423
+ return *( double*)(( char*) obj+offset);
3412
3424
  }
3413
- static inline void ParticlesMonitorData_set_part_id_start(ParticlesMonitorData restrict obj, int64_t value){
3425
+ static inline void RandomUniformData_set__shift_x(RandomUniformData restrict obj, double value){
3414
3426
  int64_t offset=0;
3415
3427
  offset+=24;
3416
- *( int64_t*)(( char*) obj+offset)=value;
3428
+ *( double*)(( char*) obj+offset)=value;
3417
3429
  }
3418
- static inline int64_t* ParticlesMonitorData_getp_part_id_start(ParticlesMonitorData restrict obj){
3430
+ static inline double* RandomUniformData_getp__shift_x(RandomUniformData restrict obj){
3419
3431
  int64_t offset=0;
3420
3432
  offset+=24;
3421
- return ( int64_t*)(( char*) obj+offset);
3433
+ return ( double*)(( char*) obj+offset);
3422
3434
  }
3423
- static inline int64_t ParticlesMonitorData_get_part_id_end(const ParticlesMonitorData restrict obj){
3435
+ static inline double RandomUniformData_get__shift_y(const RandomUniformData restrict obj){
3424
3436
  int64_t offset=0;
3425
3437
  offset+=32;
3426
- return *( int64_t*)(( char*) obj+offset);
3438
+ return *( double*)(( char*) obj+offset);
3427
3439
  }
3428
- static inline void ParticlesMonitorData_set_part_id_end(ParticlesMonitorData restrict obj, int64_t value){
3440
+ static inline void RandomUniformData_set__shift_y(RandomUniformData restrict obj, double value){
3429
3441
  int64_t offset=0;
3430
3442
  offset+=32;
3431
- *( int64_t*)(( char*) obj+offset)=value;
3443
+ *( double*)(( char*) obj+offset)=value;
3432
3444
  }
3433
- static inline int64_t* ParticlesMonitorData_getp_part_id_end(ParticlesMonitorData restrict obj){
3445
+ static inline double* RandomUniformData_getp__shift_y(RandomUniformData restrict obj){
3434
3446
  int64_t offset=0;
3435
3447
  offset+=32;
3436
- return ( int64_t*)(( char*) obj+offset);
3448
+ return ( double*)(( char*) obj+offset);
3437
3449
  }
3438
- static inline int64_t ParticlesMonitorData_get_ebe_mode(const ParticlesMonitorData restrict obj){
3450
+ static inline double RandomUniformData_get__shift_s(const RandomUniformData restrict obj){
3439
3451
  int64_t offset=0;
3440
3452
  offset+=40;
3441
- return *( int64_t*)(( char*) obj+offset);
3453
+ return *( double*)(( char*) obj+offset);
3442
3454
  }
3443
- static inline void ParticlesMonitorData_set_ebe_mode(ParticlesMonitorData restrict obj, int64_t value){
3455
+ static inline void RandomUniformData_set__shift_s(RandomUniformData restrict obj, double value){
3444
3456
  int64_t offset=0;
3445
3457
  offset+=40;
3446
- *( int64_t*)(( char*) obj+offset)=value;
3458
+ *( double*)(( char*) obj+offset)=value;
3447
3459
  }
3448
- static inline int64_t* ParticlesMonitorData_getp_ebe_mode(ParticlesMonitorData restrict obj){
3460
+ static inline double* RandomUniformData_getp__shift_s(RandomUniformData restrict obj){
3449
3461
  int64_t offset=0;
3450
3462
  offset+=40;
3451
- return ( int64_t*)(( char*) obj+offset);
3463
+ return ( double*)(( char*) obj+offset);
3452
3464
  }
3453
- static inline int64_t ParticlesMonitorData_get_n_records(const ParticlesMonitorData restrict obj){
3465
+ static inline double RandomUniformData_get__rot_x_rad(const RandomUniformData restrict obj){
3454
3466
  int64_t offset=0;
3455
3467
  offset+=48;
3456
- return *( int64_t*)(( char*) obj+offset);
3468
+ return *( double*)(( char*) obj+offset);
3457
3469
  }
3458
- static inline void ParticlesMonitorData_set_n_records(ParticlesMonitorData restrict obj, int64_t value){
3470
+ static inline void RandomUniformData_set__rot_x_rad(RandomUniformData restrict obj, double value){
3459
3471
  int64_t offset=0;
3460
3472
  offset+=48;
3461
- *( int64_t*)(( char*) obj+offset)=value;
3473
+ *( double*)(( char*) obj+offset)=value;
3462
3474
  }
3463
- static inline int64_t* ParticlesMonitorData_getp_n_records(ParticlesMonitorData restrict obj){
3475
+ static inline double* RandomUniformData_getp__rot_x_rad(RandomUniformData restrict obj){
3464
3476
  int64_t offset=0;
3465
3477
  offset+=48;
3466
- return ( int64_t*)(( char*) obj+offset);
3478
+ return ( double*)(( char*) obj+offset);
3467
3479
  }
3468
- static inline int64_t ParticlesMonitorData_get_n_repetitions(const ParticlesMonitorData restrict obj){
3480
+ static inline double RandomUniformData_get__rot_y_rad(const RandomUniformData restrict obj){
3469
3481
  int64_t offset=0;
3470
3482
  offset+=56;
3471
- return *( int64_t*)(( char*) obj+offset);
3483
+ return *( double*)(( char*) obj+offset);
3472
3484
  }
3473
- static inline void ParticlesMonitorData_set_n_repetitions(ParticlesMonitorData restrict obj, int64_t value){
3485
+ static inline void RandomUniformData_set__rot_y_rad(RandomUniformData restrict obj, double value){
3474
3486
  int64_t offset=0;
3475
3487
  offset+=56;
3476
- *( int64_t*)(( char*) obj+offset)=value;
3488
+ *( double*)(( char*) obj+offset)=value;
3477
3489
  }
3478
- static inline int64_t* ParticlesMonitorData_getp_n_repetitions(ParticlesMonitorData restrict obj){
3490
+ static inline double* RandomUniformData_getp__rot_y_rad(RandomUniformData restrict obj){
3479
3491
  int64_t offset=0;
3480
3492
  offset+=56;
3481
- return ( int64_t*)(( char*) obj+offset);
3493
+ return ( double*)(( char*) obj+offset);
3482
3494
  }
3483
- static inline int64_t ParticlesMonitorData_get_repetition_period(const ParticlesMonitorData restrict obj){
3495
+ static inline double RandomUniformData_get__rot_s_rad_no_frame(const RandomUniformData restrict obj){
3484
3496
  int64_t offset=0;
3485
3497
  offset+=64;
3486
- return *( int64_t*)(( char*) obj+offset);
3498
+ return *( double*)(( char*) obj+offset);
3487
3499
  }
3488
- static inline void ParticlesMonitorData_set_repetition_period(ParticlesMonitorData restrict obj, int64_t value){
3500
+ static inline void RandomUniformData_set__rot_s_rad_no_frame(RandomUniformData restrict obj, double value){
3489
3501
  int64_t offset=0;
3490
3502
  offset+=64;
3491
- *( int64_t*)(( char*) obj+offset)=value;
3503
+ *( double*)(( char*) obj+offset)=value;
3492
3504
  }
3493
- static inline int64_t* ParticlesMonitorData_getp_repetition_period(ParticlesMonitorData restrict obj){
3505
+ static inline double* RandomUniformData_getp__rot_s_rad_no_frame(RandomUniformData restrict obj){
3494
3506
  int64_t offset=0;
3495
3507
  offset+=64;
3496
- return ( int64_t*)(( char*) obj+offset);
3508
+ return ( double*)(( char*) obj+offset);
3497
3509
  }
3498
- static inline int64_t ParticlesMonitorData_get_flag_auto_to_numpy(const ParticlesMonitorData restrict obj){
3510
+ static inline double RandomUniformData_get_rot_shift_anchor(const RandomUniformData restrict obj){
3499
3511
  int64_t offset=0;
3500
3512
  offset+=72;
3501
- return *( int64_t*)(( char*) obj+offset);
3513
+ return *( double*)(( char*) obj+offset);
3502
3514
  }
3503
- static inline void ParticlesMonitorData_set_flag_auto_to_numpy(ParticlesMonitorData restrict obj, int64_t value){
3515
+ static inline void RandomUniformData_set_rot_shift_anchor(RandomUniformData restrict obj, double value){
3504
3516
  int64_t offset=0;
3505
3517
  offset+=72;
3506
- *( int64_t*)(( char*) obj+offset)=value;
3518
+ *( double*)(( char*) obj+offset)=value;
3507
3519
  }
3508
- static inline int64_t* ParticlesMonitorData_getp_flag_auto_to_numpy(ParticlesMonitorData restrict obj){
3520
+ static inline double* RandomUniformData_getp_rot_shift_anchor(RandomUniformData restrict obj){
3509
3521
  int64_t offset=0;
3510
3522
  offset+=72;
3511
- return ( int64_t*)(( char*) obj+offset);
3512
- }
3513
- static inline ParticlesData ParticlesMonitorData_getp_data(ParticlesMonitorData restrict obj){
3514
- int64_t offset=0;
3515
- offset+=152;
3516
- return (ParticlesData)(( char*) obj+offset);
3517
- }
3518
- static inline int64_t ParticlesMonitorData_get_data__capacity(const ParticlesMonitorData restrict obj){
3519
- int64_t offset=0;
3520
- offset+=160;
3521
- return *( int64_t*)(( char*) obj+offset);
3522
- }
3523
- static inline void ParticlesMonitorData_set_data__capacity(ParticlesMonitorData restrict obj, int64_t value){
3524
- int64_t offset=0;
3525
- offset+=160;
3526
- *( int64_t*)(( char*) obj+offset)=value;
3527
- }
3528
- static inline int64_t* ParticlesMonitorData_getp_data__capacity(ParticlesMonitorData restrict obj){
3529
- int64_t offset=0;
3530
- offset+=160;
3531
- return ( int64_t*)(( char*) obj+offset);
3532
- }
3533
- static inline int64_t ParticlesMonitorData_get_data__num_active_particles(const ParticlesMonitorData restrict obj){
3534
- int64_t offset=0;
3535
- offset+=168;
3536
- return *( int64_t*)(( char*) obj+offset);
3523
+ return ( double*)(( char*) obj+offset);
3537
3524
  }
3538
- static inline void ParticlesMonitorData_set_data__num_active_particles(ParticlesMonitorData restrict obj, int64_t value){
3539
- int64_t offset=0;
3540
- offset+=168;
3541
- *( int64_t*)(( char*) obj+offset)=value;
3525
+ #endif
3526
+ // copyright ############################### //
3527
+ // This file is part of the Xtrack Package. //
3528
+ // Copyright (c) CERN, 2021. //
3529
+ // ######################################### //
3530
+
3531
+ #ifndef XTRACK_CONSTANTS_H
3532
+ #define XTRACK_CONSTANTS_H
3533
+
3534
+ #if !defined( C_LIGHT )
3535
+ #define C_LIGHT ( 299792458.0 )
3536
+ #endif /* !defined( C_LIGHT ) */
3537
+
3538
+ #if !defined( EPSILON_0 )
3539
+ #define EPSILON_0 (8.854187817620e-12)
3540
+ #endif /* !defined( EPSILON_0 ) */
3541
+
3542
+ #if !defined( PI )
3543
+ #define PI (3.1415926535897932384626433832795028841971693993751)
3544
+ #endif /* !defined( PI ) */
3545
+
3546
+ #if !defined( MU_0 )
3547
+ #define MU_0 (PI*4.0e-7)
3548
+ #endif /* !defined( MU_0 ) */
3549
+
3550
+ #if !defined( DEG2RAD )
3551
+ #define DEG2RAD (0.0174532925199432957692369076848861271344287188854)
3552
+ #endif /* !defiend( DEG2RAD ) */
3553
+
3554
+ #if !defined( RAD2DEG )
3555
+ #define RAD2DEG (57.29577951308232087679815481410517033240547246656442)
3556
+ #endif /* !defiend( RAD2DEG ) */
3557
+
3558
+ #if !defined( SQRT_PI )
3559
+ #define SQRT_PI (1.7724538509055160272981674833411451827975494561224)
3560
+ #endif /* !defined( SQRT_PI ) */
3561
+
3562
+ #if !defined( QELEM )
3563
+ #define QELEM (1.60217662e-19)
3564
+ #endif /* !defined( QELEM ) */
3565
+
3566
+ #if !defined( DBL_MAX )
3567
+ #define DBL_MAX (1.7976931348623158e+308)
3568
+ #endif /* !defined( DBL_MAX ) */
3569
+
3570
+ #if !defined( DBL_MIN )
3571
+ #define DBL_MIN (2.2250738585072014e-308)
3572
+ #endif /* !defined( DBL_MIN ) */
3573
+
3574
+ #if !defined( DBL_EPSILON )
3575
+ #define DBL_EPSILON (2.2204460492503131e-16)
3576
+ #endif /* !defined( DBL_EPSILON ) */
3577
+
3578
+ #if !defined( RADIUS_ELECTRON )
3579
+ #define RADIUS_ELECTRON (2.8179403262e-15)
3580
+ #endif /* !defined( RADIUS_ELECTRON ) */
3581
+
3582
+ #if !defined( MASS_ELECTRON )
3583
+ #define MASS_ELECTRON (9.1093837e-31)
3584
+ #endif /* !defined( MASS_ELECTRON ) */
3585
+
3586
+ #endif /* XTRACK_CONSTANTS_H */
3587
+
3588
+ // copyright ############################### //
3589
+ // This file is part of the Xtrack Package. //
3590
+ // Copyright (c) CERN, 2023. //
3591
+ // ######################################### //
3592
+
3593
+ #ifndef XTRACK_FUNCTIONS_H
3594
+ #define XTRACK_FUNCTIONS_H
3595
+
3596
+ #include <headers/track.h>
3597
+
3598
+
3599
+ GPUFUN
3600
+ void kill_all_particles(LocalParticle* part0, int64_t kill_state) {
3601
+ START_PER_PARTICLE_BLOCK(part0, part);
3602
+ LocalParticle_kill_particle(part, kill_state);
3603
+ END_PER_PARTICLE_BLOCK;
3542
3604
  }
3543
- static inline int64_t* ParticlesMonitorData_getp_data__num_active_particles(ParticlesMonitorData restrict obj){
3544
- int64_t offset=0;
3545
- offset+=168;
3546
- return ( int64_t*)(( char*) obj+offset);
3605
+
3606
+
3607
+ GPUFUN
3608
+ int8_t assert_tracking(LocalParticle* part, int64_t kill_state){
3609
+ // Whenever we are not tracking, e.g. in a twiss, the particle will be at_turn < 0.
3610
+ // We test this to distinguish genuine tracking from twiss.
3611
+ if (LocalParticle_get_at_turn(part) < 0){
3612
+ LocalParticle_kill_particle(part, kill_state);
3613
+ return 0;
3614
+ }
3615
+ return 1;
3547
3616
  }
3548
- static inline int64_t ParticlesMonitorData_get_data__num_lost_particles(const ParticlesMonitorData restrict obj){
3549
- int64_t offset=0;
3550
- offset+=176;
3617
+
3618
+ #endif /* XTRACK_FUNCTIONS_H */
3619
+
3620
+ // copyright ############################### //
3621
+ // This file is part of the Xtrack Package. //
3622
+ // Copyright (c) CERN, 2023. //
3623
+ // ######################################### //
3624
+
3625
+ #ifndef XTRACK_PARTICLE_STATES_H
3626
+ #define XTRACK_PARTICLE_STATES_H
3627
+
3628
+ #define XT_LOST_ON_APERTURE 0
3629
+ #define XT_LOST_ON_LONG_CUT -2
3630
+ #define XT_LOST_ALL_E_IN_SYNRAD -10
3631
+ #define RNG_ERR_SEEDS_NOT_SET -20
3632
+ #define RNG_ERR_INVALID_TRACK -21
3633
+ #define RNG_ERR_RUTH_NOT_SET -22
3634
+ #define XT_INVALID_SLICE_TRANSFORM -40
3635
+ #define XT_INVALID_CURVED_SLICE_TRANSFORM -41
3636
+
3637
+ #endif /* XTRACK_PARTICLE_STATES_H */
3638
+
3639
+ // copyright ############################### //
3640
+ // This file is part of the Xtrack Package. //
3641
+ // Copyright (c) CERN, 2025. //
3642
+ // ######################################### //
3643
+ #ifndef XTRACK_TRACK_SROTATION_H
3644
+ #define XTRACK_TRACK_SROTATION_H
3645
+
3646
+ #include <headers/track.h>
3647
+
3648
+
3649
+ GPUFUN
3650
+ void SRotation_single_particle(LocalParticle* part, double sin_z, double cos_z)
3651
+ {
3652
+ double const x = LocalParticle_get_x(part);
3653
+ double const y = LocalParticle_get_y(part);
3654
+ double const px = LocalParticle_get_px(part);
3655
+ double const py = LocalParticle_get_py(part);
3656
+
3657
+ double const x_hat = cos_z * x + sin_z * y;
3658
+ double const y_hat = -sin_z * x + cos_z * y;
3659
+ double const px_hat = cos_z * px + sin_z * py;
3660
+ double const py_hat = -sin_z * px + cos_z * py;
3661
+
3662
+ LocalParticle_set_x(part, x_hat);
3663
+ LocalParticle_set_y(part, y_hat);
3664
+ LocalParticle_set_px(part, px_hat);
3665
+ LocalParticle_set_py(part, py_hat);
3666
+ }
3667
+
3668
+ #endif
3669
+ // copyright ############################### //
3670
+ // This file is part of the Xtrack Package. //
3671
+ // Copyright (c) CERN, 2021. //
3672
+ // ######################################### //
3673
+
3674
+ #ifndef XTRACK_TRACK_DRIFT_H
3675
+ #define XTRACK_TRACK_DRIFT_H
3676
+
3677
+
3678
+ GPUFUN
3679
+ void Drift_single_particle_expanded(LocalParticle* part, double length){
3680
+ double const rpp = LocalParticle_get_rpp(part);
3681
+ double const rv0v = 1./LocalParticle_get_rvv(part);
3682
+ double const xp = LocalParticle_get_px(part) * rpp;
3683
+ double const yp = LocalParticle_get_py(part) * rpp;
3684
+ double const dzeta = 1 - rv0v * ( 1. + ( xp*xp + yp*yp ) / 2. );
3685
+
3686
+ LocalParticle_add_to_x(part, xp * length );
3687
+ LocalParticle_add_to_y(part, yp * length );
3688
+ LocalParticle_add_to_s(part, length);
3689
+ LocalParticle_add_to_zeta(part, length * dzeta );
3690
+ }
3691
+
3692
+
3693
+ GPUFUN
3694
+ void Drift_single_particle_exact(LocalParticle* part, double length){
3695
+ double const px = LocalParticle_get_px(part);
3696
+ double const py = LocalParticle_get_py(part);
3697
+ double const rv0v = 1./LocalParticle_get_rvv(part);
3698
+ double const one_plus_delta = 1. + LocalParticle_get_delta(part);
3699
+
3700
+ double const one_over_pz = 1./sqrt(one_plus_delta*one_plus_delta
3701
+ - px * px - py * py);
3702
+ double const dzeta = 1 - rv0v * one_plus_delta * one_over_pz;
3703
+
3704
+ LocalParticle_add_to_x(part, px * one_over_pz * length);
3705
+ LocalParticle_add_to_y(part, py * one_over_pz * length);
3706
+ LocalParticle_add_to_zeta(part, dzeta * length);
3707
+ LocalParticle_add_to_s(part, length);
3708
+ }
3709
+
3710
+
3711
+ GPUFUN
3712
+ void Drift_single_particle(LocalParticle* part, double length){
3713
+ #ifndef XTRACK_USE_EXACT_DRIFTS
3714
+ Drift_single_particle_expanded(part, length);
3715
+ #else
3716
+ Drift_single_particle_exact(part, length);
3717
+ #endif
3718
+ }
3719
+
3720
+
3721
+ #endif /* XTRACK_TRACK_DRIFT_H */
3722
+
3723
+
3724
+ #ifndef XSTUITE_TRACK_FLAGS_H
3725
+ #define XSTUITE_TRACK_FLAGS_H
3726
+ #define XS_FLAG_BACKTRACK (0)
3727
+ #define XS_FLAG_KILL_CAVITY_KICK (2)
3728
+ #define XS_FLAG_IGNORE_GLOBAL_APERTURE (3)
3729
+ #define XS_FLAG_IGNORE_LOCAL_APERTURE (4)
3730
+ #define XS_FLAG_SR_TAPER (5)
3731
+ #define XS_FLAG_SR_KICK_SAME_AS_FIRST (6)
3732
+
3733
+ #endif // XSTUITE_TRACK_FLAGS_H
3734
+
3735
+ #include <random/random_src/uniform.h>
3736
+
3737
+
3738
+ void sample_uniform(
3739
+ RandomUniformData el,
3740
+
3741
+ ParticlesData particles,
3742
+ double* samples, int64_t n_samples_per_seed,
3743
+ int64_t flag_increment_at_element,
3744
+ int8_t* io_buffer){
3745
+
3746
+ // #define CONTEXT_OPENMP //only_for_context cpu_openmp
3747
+ #ifdef CONTEXT_OPENMP
3748
+ const int64_t capacity = ParticlesData_get__capacity(particles);
3749
+ const int num_threads = omp_get_max_threads();
3750
+
3751
+ #ifndef XT_OMP_SKIP_REORGANIZE
3752
+ const int64_t num_particles_to_track = ParticlesData_get__num_active_particles(particles);
3753
+
3754
+ {
3755
+ LocalParticle lpart;
3756
+ lpart.io_buffer = io_buffer;
3757
+ Particles_to_LocalParticle(particles, &lpart, 0, capacity);
3758
+ check_is_active(&lpart);
3759
+ count_reorganized_particles(&lpart);
3760
+ LocalParticle_to_Particles(&lpart, particles, 0, capacity);
3761
+ }
3762
+ #else // When we skip reorganize, we cannot just batch active particles
3763
+ const int64_t num_particles_to_track = capacity;
3764
+ #endif
3765
+
3766
+ const int64_t chunk_size = (num_particles_to_track + num_threads - 1)/num_threads; // ceil division
3767
+ #endif // CONTEXT_OPENMP
3768
+
3769
+ // #pragma omp parallel for //only_for_context cpu_openmp
3770
+ // for (int64_t batch_id = 0; batch_id < num_threads; batch_id++) { //only_for_context cpu_openmp
3771
+ LocalParticle lpart;
3772
+ lpart.io_buffer = io_buffer;
3773
+ lpart.track_flags = 0;
3774
+ // int64_t part_id = batch_id * chunk_size; //only_for_context cpu_openmp
3775
+ // int64_t end_id = (batch_id + 1) * chunk_size; //only_for_context cpu_openmp
3776
+ // if (end_id > num_particles_to_track) end_id = num_particles_to_track; //only_for_context cpu_openmp
3777
+
3778
+ int64_t part_id = 0; //only_for_context cpu_serial
3779
+ // int64_t part_id = blockDim.x * blockIdx.x + threadIdx.x; //only_for_context cuda
3780
+ // int64_t part_id = get_global_id(0); //only_for_context opencl
3781
+ int64_t end_id = 0; // unused outside of openmp //only_for_context cpu_serial cuda opencl
3782
+
3783
+ int64_t part_capacity = ParticlesData_get__capacity(particles);
3784
+ if (part_id<part_capacity){
3785
+ Particles_to_LocalParticle(particles, &lpart, part_id, end_id);
3786
+ if (check_is_active(&lpart)>0){
3787
+ RandomUniform_sample(el, &lpart, samples, n_samples_per_seed);
3788
+
3789
+ }
3790
+ if (check_is_active(&lpart)>0 && flag_increment_at_element){
3791
+ increment_at_element(&lpart, 1);
3792
+ }
3793
+ }
3794
+ // } //only_for_context cpu_openmp
3795
+
3796
+ // On OpenMP we want to additionally by default reorganize all
3797
+ // the particles.
3798
+ // #ifndef XT_OMP_SKIP_REORGANIZE //only_for_context cpu_openmp
3799
+ // LocalParticle lpart; //only_for_context cpu_openmp
3800
+ // lpart.io_buffer = io_buffer; //only_for_context cpu_openmp
3801
+ // Particles_to_LocalParticle(particles, &lpart, 0, capacity);//only_for_context cpu_openmp
3802
+ // check_is_active(&lpart); //only_for_context cpu_openmp
3803
+ // #endif //only_for_context cpu_openmp
3804
+ }
3805
+
3806
+ #ifndef XOBJ_TYPEDEF_ParticlesMonitorData
3807
+ #define XOBJ_TYPEDEF_ParticlesMonitorData
3808
+ typedef struct ParticlesMonitorData_s * ParticlesMonitorData;
3809
+ static inline ParticlesMonitorData ParticlesMonitorData_getp(ParticlesMonitorData restrict obj){
3810
+ int64_t offset=0;
3811
+ return (ParticlesMonitorData)(( char*) obj+offset);
3812
+ }
3813
+ static inline int64_t ParticlesMonitorData_get_start_at_turn(const ParticlesMonitorData restrict obj){
3814
+ int64_t offset=0;
3815
+ offset+=8;
3551
3816
  return *( int64_t*)(( char*) obj+offset);
3552
3817
  }
3553
- static inline void ParticlesMonitorData_set_data__num_lost_particles(ParticlesMonitorData restrict obj, int64_t value){
3818
+ static inline void ParticlesMonitorData_set_start_at_turn(ParticlesMonitorData restrict obj, int64_t value){
3554
3819
  int64_t offset=0;
3555
- offset+=176;
3820
+ offset+=8;
3556
3821
  *( int64_t*)(( char*) obj+offset)=value;
3557
3822
  }
3558
- static inline int64_t* ParticlesMonitorData_getp_data__num_lost_particles(ParticlesMonitorData restrict obj){
3823
+ static inline int64_t* ParticlesMonitorData_getp_start_at_turn(ParticlesMonitorData restrict obj){
3559
3824
  int64_t offset=0;
3560
- offset+=176;
3825
+ offset+=8;
3561
3826
  return ( int64_t*)(( char*) obj+offset);
3562
3827
  }
3563
- static inline int64_t ParticlesMonitorData_get_data_start_tracking_at_element(const ParticlesMonitorData restrict obj){
3828
+ static inline int64_t ParticlesMonitorData_get_stop_at_turn(const ParticlesMonitorData restrict obj){
3564
3829
  int64_t offset=0;
3565
- offset+=184;
3830
+ offset+=16;
3566
3831
  return *( int64_t*)(( char*) obj+offset);
3567
3832
  }
3568
- static inline void ParticlesMonitorData_set_data_start_tracking_at_element(ParticlesMonitorData restrict obj, int64_t value){
3833
+ static inline void ParticlesMonitorData_set_stop_at_turn(ParticlesMonitorData restrict obj, int64_t value){
3569
3834
  int64_t offset=0;
3570
- offset+=184;
3835
+ offset+=16;
3571
3836
  *( int64_t*)(( char*) obj+offset)=value;
3572
3837
  }
3573
- static inline int64_t* ParticlesMonitorData_getp_data_start_tracking_at_element(ParticlesMonitorData restrict obj){
3838
+ static inline int64_t* ParticlesMonitorData_getp_stop_at_turn(ParticlesMonitorData restrict obj){
3574
3839
  int64_t offset=0;
3575
- offset+=184;
3840
+ offset+=16;
3576
3841
  return ( int64_t*)(( char*) obj+offset);
3577
3842
  }
3578
- static inline double ParticlesMonitorData_get_data_q0(const ParticlesMonitorData restrict obj){
3843
+ static inline int64_t ParticlesMonitorData_get_part_id_start(const ParticlesMonitorData restrict obj){
3579
3844
  int64_t offset=0;
3580
- offset+=192;
3581
- return *( double*)(( char*) obj+offset);
3845
+ offset+=24;
3846
+ return *( int64_t*)(( char*) obj+offset);
3582
3847
  }
3583
- static inline void ParticlesMonitorData_set_data_q0(ParticlesMonitorData restrict obj, double value){
3848
+ static inline void ParticlesMonitorData_set_part_id_start(ParticlesMonitorData restrict obj, int64_t value){
3584
3849
  int64_t offset=0;
3585
- offset+=192;
3586
- *( double*)(( char*) obj+offset)=value;
3850
+ offset+=24;
3851
+ *( int64_t*)(( char*) obj+offset)=value;
3587
3852
  }
3588
- static inline double* ParticlesMonitorData_getp_data_q0(ParticlesMonitorData restrict obj){
3853
+ static inline int64_t* ParticlesMonitorData_getp_part_id_start(ParticlesMonitorData restrict obj){
3589
3854
  int64_t offset=0;
3590
- offset+=192;
3591
- return ( double*)(( char*) obj+offset);
3855
+ offset+=24;
3856
+ return ( int64_t*)(( char*) obj+offset);
3592
3857
  }
3593
- static inline double ParticlesMonitorData_get_data_mass0(const ParticlesMonitorData restrict obj){
3858
+ static inline int64_t ParticlesMonitorData_get_part_id_end(const ParticlesMonitorData restrict obj){
3594
3859
  int64_t offset=0;
3595
- offset+=200;
3596
- return *( double*)(( char*) obj+offset);
3860
+ offset+=32;
3861
+ return *( int64_t*)(( char*) obj+offset);
3597
3862
  }
3598
- static inline void ParticlesMonitorData_set_data_mass0(ParticlesMonitorData restrict obj, double value){
3863
+ static inline void ParticlesMonitorData_set_part_id_end(ParticlesMonitorData restrict obj, int64_t value){
3599
3864
  int64_t offset=0;
3600
- offset+=200;
3601
- *( double*)(( char*) obj+offset)=value;
3865
+ offset+=32;
3866
+ *( int64_t*)(( char*) obj+offset)=value;
3602
3867
  }
3603
- static inline double* ParticlesMonitorData_getp_data_mass0(ParticlesMonitorData restrict obj){
3868
+ static inline int64_t* ParticlesMonitorData_getp_part_id_end(ParticlesMonitorData restrict obj){
3604
3869
  int64_t offset=0;
3605
- offset+=200;
3606
- return ( double*)(( char*) obj+offset);
3870
+ offset+=32;
3871
+ return ( int64_t*)(( char*) obj+offset);
3607
3872
  }
3608
- static inline double ParticlesMonitorData_get_data_t_sim(const ParticlesMonitorData restrict obj){
3873
+ static inline int64_t ParticlesMonitorData_get_ebe_mode(const ParticlesMonitorData restrict obj){
3874
+ int64_t offset=0;
3875
+ offset+=40;
3876
+ return *( int64_t*)(( char*) obj+offset);
3877
+ }
3878
+ static inline void ParticlesMonitorData_set_ebe_mode(ParticlesMonitorData restrict obj, int64_t value){
3879
+ int64_t offset=0;
3880
+ offset+=40;
3881
+ *( int64_t*)(( char*) obj+offset)=value;
3882
+ }
3883
+ static inline int64_t* ParticlesMonitorData_getp_ebe_mode(ParticlesMonitorData restrict obj){
3884
+ int64_t offset=0;
3885
+ offset+=40;
3886
+ return ( int64_t*)(( char*) obj+offset);
3887
+ }
3888
+ static inline int64_t ParticlesMonitorData_get_n_records(const ParticlesMonitorData restrict obj){
3889
+ int64_t offset=0;
3890
+ offset+=48;
3891
+ return *( int64_t*)(( char*) obj+offset);
3892
+ }
3893
+ static inline void ParticlesMonitorData_set_n_records(ParticlesMonitorData restrict obj, int64_t value){
3894
+ int64_t offset=0;
3895
+ offset+=48;
3896
+ *( int64_t*)(( char*) obj+offset)=value;
3897
+ }
3898
+ static inline int64_t* ParticlesMonitorData_getp_n_records(ParticlesMonitorData restrict obj){
3899
+ int64_t offset=0;
3900
+ offset+=48;
3901
+ return ( int64_t*)(( char*) obj+offset);
3902
+ }
3903
+ static inline int64_t ParticlesMonitorData_get_n_repetitions(const ParticlesMonitorData restrict obj){
3904
+ int64_t offset=0;
3905
+ offset+=56;
3906
+ return *( int64_t*)(( char*) obj+offset);
3907
+ }
3908
+ static inline void ParticlesMonitorData_set_n_repetitions(ParticlesMonitorData restrict obj, int64_t value){
3909
+ int64_t offset=0;
3910
+ offset+=56;
3911
+ *( int64_t*)(( char*) obj+offset)=value;
3912
+ }
3913
+ static inline int64_t* ParticlesMonitorData_getp_n_repetitions(ParticlesMonitorData restrict obj){
3914
+ int64_t offset=0;
3915
+ offset+=56;
3916
+ return ( int64_t*)(( char*) obj+offset);
3917
+ }
3918
+ static inline int64_t ParticlesMonitorData_get_repetition_period(const ParticlesMonitorData restrict obj){
3919
+ int64_t offset=0;
3920
+ offset+=64;
3921
+ return *( int64_t*)(( char*) obj+offset);
3922
+ }
3923
+ static inline void ParticlesMonitorData_set_repetition_period(ParticlesMonitorData restrict obj, int64_t value){
3924
+ int64_t offset=0;
3925
+ offset+=64;
3926
+ *( int64_t*)(( char*) obj+offset)=value;
3927
+ }
3928
+ static inline int64_t* ParticlesMonitorData_getp_repetition_period(ParticlesMonitorData restrict obj){
3929
+ int64_t offset=0;
3930
+ offset+=64;
3931
+ return ( int64_t*)(( char*) obj+offset);
3932
+ }
3933
+ static inline int64_t ParticlesMonitorData_get_flag_auto_to_numpy(const ParticlesMonitorData restrict obj){
3934
+ int64_t offset=0;
3935
+ offset+=72;
3936
+ return *( int64_t*)(( char*) obj+offset);
3937
+ }
3938
+ static inline void ParticlesMonitorData_set_flag_auto_to_numpy(ParticlesMonitorData restrict obj, int64_t value){
3939
+ int64_t offset=0;
3940
+ offset+=72;
3941
+ *( int64_t*)(( char*) obj+offset)=value;
3942
+ }
3943
+ static inline int64_t* ParticlesMonitorData_getp_flag_auto_to_numpy(ParticlesMonitorData restrict obj){
3944
+ int64_t offset=0;
3945
+ offset+=72;
3946
+ return ( int64_t*)(( char*) obj+offset);
3947
+ }
3948
+ static inline ParticlesData ParticlesMonitorData_getp_data(ParticlesMonitorData restrict obj){
3949
+ int64_t offset=0;
3950
+ offset+=152;
3951
+ return (ParticlesData)(( char*) obj+offset);
3952
+ }
3953
+ static inline int64_t ParticlesMonitorData_get_data__capacity(const ParticlesMonitorData restrict obj){
3954
+ int64_t offset=0;
3955
+ offset+=160;
3956
+ return *( int64_t*)(( char*) obj+offset);
3957
+ }
3958
+ static inline void ParticlesMonitorData_set_data__capacity(ParticlesMonitorData restrict obj, int64_t value){
3959
+ int64_t offset=0;
3960
+ offset+=160;
3961
+ *( int64_t*)(( char*) obj+offset)=value;
3962
+ }
3963
+ static inline int64_t* ParticlesMonitorData_getp_data__capacity(ParticlesMonitorData restrict obj){
3964
+ int64_t offset=0;
3965
+ offset+=160;
3966
+ return ( int64_t*)(( char*) obj+offset);
3967
+ }
3968
+ static inline int64_t ParticlesMonitorData_get_data__num_active_particles(const ParticlesMonitorData restrict obj){
3969
+ int64_t offset=0;
3970
+ offset+=168;
3971
+ return *( int64_t*)(( char*) obj+offset);
3972
+ }
3973
+ static inline void ParticlesMonitorData_set_data__num_active_particles(ParticlesMonitorData restrict obj, int64_t value){
3974
+ int64_t offset=0;
3975
+ offset+=168;
3976
+ *( int64_t*)(( char*) obj+offset)=value;
3977
+ }
3978
+ static inline int64_t* ParticlesMonitorData_getp_data__num_active_particles(ParticlesMonitorData restrict obj){
3979
+ int64_t offset=0;
3980
+ offset+=168;
3981
+ return ( int64_t*)(( char*) obj+offset);
3982
+ }
3983
+ static inline int64_t ParticlesMonitorData_get_data__num_lost_particles(const ParticlesMonitorData restrict obj){
3984
+ int64_t offset=0;
3985
+ offset+=176;
3986
+ return *( int64_t*)(( char*) obj+offset);
3987
+ }
3988
+ static inline void ParticlesMonitorData_set_data__num_lost_particles(ParticlesMonitorData restrict obj, int64_t value){
3989
+ int64_t offset=0;
3990
+ offset+=176;
3991
+ *( int64_t*)(( char*) obj+offset)=value;
3992
+ }
3993
+ static inline int64_t* ParticlesMonitorData_getp_data__num_lost_particles(ParticlesMonitorData restrict obj){
3994
+ int64_t offset=0;
3995
+ offset+=176;
3996
+ return ( int64_t*)(( char*) obj+offset);
3997
+ }
3998
+ static inline int64_t ParticlesMonitorData_get_data_start_tracking_at_element(const ParticlesMonitorData restrict obj){
3999
+ int64_t offset=0;
4000
+ offset+=184;
4001
+ return *( int64_t*)(( char*) obj+offset);
4002
+ }
4003
+ static inline void ParticlesMonitorData_set_data_start_tracking_at_element(ParticlesMonitorData restrict obj, int64_t value){
4004
+ int64_t offset=0;
4005
+ offset+=184;
4006
+ *( int64_t*)(( char*) obj+offset)=value;
4007
+ }
4008
+ static inline int64_t* ParticlesMonitorData_getp_data_start_tracking_at_element(ParticlesMonitorData restrict obj){
4009
+ int64_t offset=0;
4010
+ offset+=184;
4011
+ return ( int64_t*)(( char*) obj+offset);
4012
+ }
4013
+ static inline double ParticlesMonitorData_get_data_q0(const ParticlesMonitorData restrict obj){
4014
+ int64_t offset=0;
4015
+ offset+=192;
4016
+ return *( double*)(( char*) obj+offset);
4017
+ }
4018
+ static inline void ParticlesMonitorData_set_data_q0(ParticlesMonitorData restrict obj, double value){
4019
+ int64_t offset=0;
4020
+ offset+=192;
4021
+ *( double*)(( char*) obj+offset)=value;
4022
+ }
4023
+ static inline double* ParticlesMonitorData_getp_data_q0(ParticlesMonitorData restrict obj){
4024
+ int64_t offset=0;
4025
+ offset+=192;
4026
+ return ( double*)(( char*) obj+offset);
4027
+ }
4028
+ static inline double ParticlesMonitorData_get_data_mass0(const ParticlesMonitorData restrict obj){
4029
+ int64_t offset=0;
4030
+ offset+=200;
4031
+ return *( double*)(( char*) obj+offset);
4032
+ }
4033
+ static inline void ParticlesMonitorData_set_data_mass0(ParticlesMonitorData restrict obj, double value){
4034
+ int64_t offset=0;
4035
+ offset+=200;
4036
+ *( double*)(( char*) obj+offset)=value;
4037
+ }
4038
+ static inline double* ParticlesMonitorData_getp_data_mass0(ParticlesMonitorData restrict obj){
4039
+ int64_t offset=0;
4040
+ offset+=200;
4041
+ return ( double*)(( char*) obj+offset);
4042
+ }
4043
+ static inline double ParticlesMonitorData_get_data_t_sim(const ParticlesMonitorData restrict obj){
3609
4044
  int64_t offset=0;
3610
4045
  offset+=208;
3611
4046
  return *( double*)(( char*) obj+offset);
@@ -4621,857 +5056,221 @@ typedef struct ParticlesMonitorData_s * ParticlesMonitorData;
4621
5056
  offset+=16+i0*4;
4622
5057
  return *( uint32_t*)(( char*) obj+offset);
4623
5058
  }
4624
- static inline void ParticlesMonitorData_set_data__rng_s2(ParticlesMonitorData restrict obj, int64_t i0, uint32_t value){
4625
- int64_t offset=0;
4626
- offset+=152;
4627
- offset+=*( int64_t*)(( char*) obj+offset+288);
4628
- offset+=16+i0*4;
4629
- *( uint32_t*)(( char*) obj+offset)=value;
4630
- }
4631
- static inline uint32_t* ParticlesMonitorData_getp1_data__rng_s2(ParticlesMonitorData restrict obj, int64_t i0){
4632
- int64_t offset=0;
4633
- offset+=152;
4634
- offset+=*( int64_t*)(( char*) obj+offset+288);
4635
- offset+=16+i0*4;
4636
- return ( uint32_t*)(( char*) obj+offset);
4637
- }
4638
- static inline ArrNUint32 ParticlesMonitorData_getp_data__rng_s3(ParticlesMonitorData restrict obj){
4639
- int64_t offset=0;
4640
- offset+=152;
4641
- offset+=*( int64_t*)(( char*) obj+offset+296);
4642
- return (ArrNUint32)(( char*) obj+offset);
4643
- }
4644
- static inline int64_t ParticlesMonitorData_len_data__rng_s3(ParticlesMonitorData restrict obj){
4645
- int64_t offset=0;
4646
- offset+=152;
4647
- offset+=*( int64_t*)(( char*) obj+offset+296);
4648
- int64_t* arr = ( int64_t*)(( char*) obj+offset);
4649
- return arr[1];
4650
- }
4651
- static inline uint32_t ParticlesMonitorData_get_data__rng_s3(const ParticlesMonitorData restrict obj, int64_t i0){
4652
- int64_t offset=0;
4653
- offset+=152;
4654
- offset+=*( int64_t*)(( char*) obj+offset+296);
4655
- offset+=16+i0*4;
4656
- return *( uint32_t*)(( char*) obj+offset);
4657
- }
4658
- static inline void ParticlesMonitorData_set_data__rng_s3(ParticlesMonitorData restrict obj, int64_t i0, uint32_t value){
4659
- int64_t offset=0;
4660
- offset+=152;
4661
- offset+=*( int64_t*)(( char*) obj+offset+296);
4662
- offset+=16+i0*4;
4663
- *( uint32_t*)(( char*) obj+offset)=value;
4664
- }
4665
- static inline uint32_t* ParticlesMonitorData_getp1_data__rng_s3(ParticlesMonitorData restrict obj, int64_t i0){
4666
- int64_t offset=0;
4667
- offset+=152;
4668
- offset+=*( int64_t*)(( char*) obj+offset+296);
4669
- offset+=16+i0*4;
4670
- return ( uint32_t*)(( char*) obj+offset);
4671
- }
4672
- static inline ArrNUint32 ParticlesMonitorData_getp_data__rng_s4(ParticlesMonitorData restrict obj){
4673
- int64_t offset=0;
4674
- offset+=152;
4675
- offset+=*( int64_t*)(( char*) obj+offset+304);
4676
- return (ArrNUint32)(( char*) obj+offset);
4677
- }
4678
- static inline int64_t ParticlesMonitorData_len_data__rng_s4(ParticlesMonitorData restrict obj){
4679
- int64_t offset=0;
4680
- offset+=152;
4681
- offset+=*( int64_t*)(( char*) obj+offset+304);
4682
- int64_t* arr = ( int64_t*)(( char*) obj+offset);
4683
- return arr[1];
4684
- }
4685
- static inline uint32_t ParticlesMonitorData_get_data__rng_s4(const ParticlesMonitorData restrict obj, int64_t i0){
4686
- int64_t offset=0;
4687
- offset+=152;
4688
- offset+=*( int64_t*)(( char*) obj+offset+304);
4689
- offset+=16+i0*4;
4690
- return *( uint32_t*)(( char*) obj+offset);
4691
- }
4692
- static inline void ParticlesMonitorData_set_data__rng_s4(ParticlesMonitorData restrict obj, int64_t i0, uint32_t value){
4693
- int64_t offset=0;
4694
- offset+=152;
4695
- offset+=*( int64_t*)(( char*) obj+offset+304);
4696
- offset+=16+i0*4;
4697
- *( uint32_t*)(( char*) obj+offset)=value;
4698
- }
4699
- static inline uint32_t* ParticlesMonitorData_getp1_data__rng_s4(ParticlesMonitorData restrict obj, int64_t i0){
4700
- int64_t offset=0;
4701
- offset+=152;
4702
- offset+=*( int64_t*)(( char*) obj+offset+304);
4703
- offset+=16+i0*4;
4704
- return ( uint32_t*)(( char*) obj+offset);
4705
- }
4706
- static inline double ParticlesMonitorData_get__sin_rot_s(const ParticlesMonitorData restrict obj){
4707
- int64_t offset=0;
4708
- offset+=80;
4709
- return *( double*)(( char*) obj+offset);
4710
- }
4711
- static inline void ParticlesMonitorData_set__sin_rot_s(ParticlesMonitorData restrict obj, double value){
4712
- int64_t offset=0;
4713
- offset+=80;
4714
- *( double*)(( char*) obj+offset)=value;
4715
- }
4716
- static inline double* ParticlesMonitorData_getp__sin_rot_s(ParticlesMonitorData restrict obj){
4717
- int64_t offset=0;
4718
- offset+=80;
4719
- return ( double*)(( char*) obj+offset);
4720
- }
4721
- static inline double ParticlesMonitorData_get__cos_rot_s(const ParticlesMonitorData restrict obj){
4722
- int64_t offset=0;
4723
- offset+=88;
4724
- return *( double*)(( char*) obj+offset);
4725
- }
4726
- static inline void ParticlesMonitorData_set__cos_rot_s(ParticlesMonitorData restrict obj, double value){
4727
- int64_t offset=0;
4728
- offset+=88;
4729
- *( double*)(( char*) obj+offset)=value;
4730
- }
4731
- static inline double* ParticlesMonitorData_getp__cos_rot_s(ParticlesMonitorData restrict obj){
4732
- int64_t offset=0;
4733
- offset+=88;
4734
- return ( double*)(( char*) obj+offset);
4735
- }
4736
- static inline double ParticlesMonitorData_get__shift_x(const ParticlesMonitorData restrict obj){
4737
- int64_t offset=0;
4738
- offset+=96;
4739
- return *( double*)(( char*) obj+offset);
4740
- }
4741
- static inline void ParticlesMonitorData_set__shift_x(ParticlesMonitorData restrict obj, double value){
4742
- int64_t offset=0;
4743
- offset+=96;
4744
- *( double*)(( char*) obj+offset)=value;
4745
- }
4746
- static inline double* ParticlesMonitorData_getp__shift_x(ParticlesMonitorData restrict obj){
4747
- int64_t offset=0;
4748
- offset+=96;
4749
- return ( double*)(( char*) obj+offset);
4750
- }
4751
- static inline double ParticlesMonitorData_get__shift_y(const ParticlesMonitorData restrict obj){
4752
- int64_t offset=0;
4753
- offset+=104;
4754
- return *( double*)(( char*) obj+offset);
4755
- }
4756
- static inline void ParticlesMonitorData_set__shift_y(ParticlesMonitorData restrict obj, double value){
4757
- int64_t offset=0;
4758
- offset+=104;
4759
- *( double*)(( char*) obj+offset)=value;
4760
- }
4761
- static inline double* ParticlesMonitorData_getp__shift_y(ParticlesMonitorData restrict obj){
4762
- int64_t offset=0;
4763
- offset+=104;
4764
- return ( double*)(( char*) obj+offset);
4765
- }
4766
- static inline double ParticlesMonitorData_get__shift_s(const ParticlesMonitorData restrict obj){
4767
- int64_t offset=0;
4768
- offset+=112;
4769
- return *( double*)(( char*) obj+offset);
4770
- }
4771
- static inline void ParticlesMonitorData_set__shift_s(ParticlesMonitorData restrict obj, double value){
4772
- int64_t offset=0;
4773
- offset+=112;
4774
- *( double*)(( char*) obj+offset)=value;
4775
- }
4776
- static inline double* ParticlesMonitorData_getp__shift_s(ParticlesMonitorData restrict obj){
4777
- int64_t offset=0;
4778
- offset+=112;
4779
- return ( double*)(( char*) obj+offset);
4780
- }
4781
- static inline double ParticlesMonitorData_get__rot_x_rad(const ParticlesMonitorData restrict obj){
4782
- int64_t offset=0;
4783
- offset+=120;
4784
- return *( double*)(( char*) obj+offset);
4785
- }
4786
- static inline void ParticlesMonitorData_set__rot_x_rad(ParticlesMonitorData restrict obj, double value){
4787
- int64_t offset=0;
4788
- offset+=120;
4789
- *( double*)(( char*) obj+offset)=value;
4790
- }
4791
- static inline double* ParticlesMonitorData_getp__rot_x_rad(ParticlesMonitorData restrict obj){
4792
- int64_t offset=0;
4793
- offset+=120;
4794
- return ( double*)(( char*) obj+offset);
4795
- }
4796
- static inline double ParticlesMonitorData_get__rot_y_rad(const ParticlesMonitorData restrict obj){
4797
- int64_t offset=0;
4798
- offset+=128;
4799
- return *( double*)(( char*) obj+offset);
4800
- }
4801
- static inline void ParticlesMonitorData_set__rot_y_rad(ParticlesMonitorData restrict obj, double value){
4802
- int64_t offset=0;
4803
- offset+=128;
4804
- *( double*)(( char*) obj+offset)=value;
4805
- }
4806
- static inline double* ParticlesMonitorData_getp__rot_y_rad(ParticlesMonitorData restrict obj){
4807
- int64_t offset=0;
4808
- offset+=128;
4809
- return ( double*)(( char*) obj+offset);
4810
- }
4811
- static inline double ParticlesMonitorData_get__rot_s_rad_no_frame(const ParticlesMonitorData restrict obj){
4812
- int64_t offset=0;
4813
- offset+=136;
4814
- return *( double*)(( char*) obj+offset);
4815
- }
4816
- static inline void ParticlesMonitorData_set__rot_s_rad_no_frame(ParticlesMonitorData restrict obj, double value){
4817
- int64_t offset=0;
4818
- offset+=136;
4819
- *( double*)(( char*) obj+offset)=value;
4820
- }
4821
- static inline double* ParticlesMonitorData_getp__rot_s_rad_no_frame(ParticlesMonitorData restrict obj){
4822
- int64_t offset=0;
4823
- offset+=136;
4824
- return ( double*)(( char*) obj+offset);
4825
- }
4826
- static inline double ParticlesMonitorData_get_rot_shift_anchor(const ParticlesMonitorData restrict obj){
4827
- int64_t offset=0;
4828
- offset+=144;
4829
- return *( double*)(( char*) obj+offset);
4830
- }
4831
- static inline void ParticlesMonitorData_set_rot_shift_anchor(ParticlesMonitorData restrict obj, double value){
4832
- int64_t offset=0;
4833
- offset+=144;
4834
- *( double*)(( char*) obj+offset)=value;
4835
- }
4836
- static inline double* ParticlesMonitorData_getp_rot_shift_anchor(ParticlesMonitorData restrict obj){
4837
- int64_t offset=0;
4838
- offset+=144;
4839
- return ( double*)(( char*) obj+offset);
4840
- }
4841
- #endif
4842
- // copyright ############################### //
4843
- // This file is part of the Xtrack Package. //
4844
- // Copyright (c) CERN, 2021. //
4845
- // ######################################### //
4846
-
4847
- #ifndef XTRACK_CONSTANTS_H
4848
- #define XTRACK_CONSTANTS_H
4849
-
4850
- #if !defined( C_LIGHT )
4851
- #define C_LIGHT ( 299792458.0 )
4852
- #endif /* !defined( C_LIGHT ) */
4853
-
4854
- #if !defined( EPSILON_0 )
4855
- #define EPSILON_0 (8.854187817620e-12)
4856
- #endif /* !defined( EPSILON_0 ) */
4857
-
4858
- #if !defined( PI )
4859
- #define PI (3.1415926535897932384626433832795028841971693993751)
4860
- #endif /* !defined( PI ) */
4861
-
4862
- #if !defined( MU_0 )
4863
- #define MU_0 (PI*4.0e-7)
4864
- #endif /* !defined( MU_0 ) */
4865
-
4866
- #if !defined( DEG2RAD )
4867
- #define DEG2RAD (0.0174532925199432957692369076848861271344287188854)
4868
- #endif /* !defiend( DEG2RAD ) */
4869
-
4870
- #if !defined( RAD2DEG )
4871
- #define RAD2DEG (57.29577951308232087679815481410517033240547246656442)
4872
- #endif /* !defiend( RAD2DEG ) */
4873
-
4874
- #if !defined( SQRT_PI )
4875
- #define SQRT_PI (1.7724538509055160272981674833411451827975494561224)
4876
- #endif /* !defined( SQRT_PI ) */
4877
-
4878
- #if !defined( QELEM )
4879
- #define QELEM (1.60217662e-19)
4880
- #endif /* !defined( QELEM ) */
4881
-
4882
- #if !defined( DBL_MAX )
4883
- #define DBL_MAX (1.7976931348623158e+308)
4884
- #endif /* !defined( DBL_MAX ) */
4885
-
4886
- #if !defined( DBL_MIN )
4887
- #define DBL_MIN (2.2250738585072014e-308)
4888
- #endif /* !defined( DBL_MIN ) */
4889
-
4890
- #if !defined( DBL_EPSILON )
4891
- #define DBL_EPSILON (2.2204460492503131e-16)
4892
- #endif /* !defined( DBL_EPSILON ) */
4893
-
4894
- #if !defined( RADIUS_ELECTRON )
4895
- #define RADIUS_ELECTRON (2.8179403262e-15)
4896
- #endif /* !defined( RADIUS_ELECTRON ) */
4897
-
4898
- #if !defined( MASS_ELECTRON )
4899
- #define MASS_ELECTRON (9.1093837e-31)
4900
- #endif /* !defined( MASS_ELECTRON ) */
4901
-
4902
- #endif /* XTRACK_CONSTANTS_H */
4903
-
4904
- // copyright ############################### //
4905
- // This file is part of the Xtrack Package. //
4906
- // Copyright (c) CERN, 2023. //
4907
- // ######################################### //
4908
-
4909
- #ifndef XTRACK_FUNCTIONS_H
4910
- #define XTRACK_FUNCTIONS_H
4911
-
4912
- #include <headers/track.h>
4913
-
4914
-
4915
- GPUFUN
4916
- void kill_all_particles(LocalParticle* part0, int64_t kill_state) {
4917
- START_PER_PARTICLE_BLOCK(part0, part);
4918
- LocalParticle_kill_particle(part, kill_state);
4919
- END_PER_PARTICLE_BLOCK;
4920
- }
4921
-
4922
-
4923
- GPUFUN
4924
- int8_t assert_tracking(LocalParticle* part, int64_t kill_state){
4925
- // Whenever we are not tracking, e.g. in a twiss, the particle will be at_turn < 0.
4926
- // We test this to distinguish genuine tracking from twiss.
4927
- if (LocalParticle_get_at_turn(part) < 0){
4928
- LocalParticle_kill_particle(part, kill_state);
4929
- return 0;
4930
- }
4931
- return 1;
4932
- }
4933
-
4934
- #endif /* XTRACK_FUNCTIONS_H */
4935
-
4936
- // copyright ############################### //
4937
- // This file is part of the Xtrack Package. //
4938
- // Copyright (c) CERN, 2023. //
4939
- // ######################################### //
4940
-
4941
- #ifndef XTRACK_PARTICLE_STATES_H
4942
- #define XTRACK_PARTICLE_STATES_H
4943
-
4944
- #define XT_LOST_ON_APERTURE 0
4945
- #define XT_LOST_ON_LONG_CUT -2
4946
- #define XT_LOST_ALL_E_IN_SYNRAD -10
4947
- #define RNG_ERR_SEEDS_NOT_SET -20
4948
- #define RNG_ERR_INVALID_TRACK -21
4949
- #define RNG_ERR_RUTH_NOT_SET -22
4950
- #define XT_INVALID_SLICE_TRANSFORM -40
4951
- #define XT_INVALID_CURVED_SLICE_TRANSFORM -41
4952
-
4953
- #endif /* XTRACK_PARTICLE_STATES_H */
4954
-
4955
- // copyright ############################### //
4956
- // This file is part of the Xtrack Package. //
4957
- // Copyright (c) CERN, 2025. //
4958
- // ######################################### //
4959
- #ifndef XTRACK_TRACK_SROTATION_H
4960
- #define XTRACK_TRACK_SROTATION_H
4961
-
4962
- #include <headers/track.h>
4963
-
4964
-
4965
- GPUFUN
4966
- void SRotation_single_particle(LocalParticle* part, double sin_z, double cos_z)
4967
- {
4968
- double const x = LocalParticle_get_x(part);
4969
- double const y = LocalParticle_get_y(part);
4970
- double const px = LocalParticle_get_px(part);
4971
- double const py = LocalParticle_get_py(part);
4972
-
4973
- double const x_hat = cos_z * x + sin_z * y;
4974
- double const y_hat = -sin_z * x + cos_z * y;
4975
- double const px_hat = cos_z * px + sin_z * py;
4976
- double const py_hat = -sin_z * px + cos_z * py;
4977
-
4978
- LocalParticle_set_x(part, x_hat);
4979
- LocalParticle_set_y(part, y_hat);
4980
- LocalParticle_set_px(part, px_hat);
4981
- LocalParticle_set_py(part, py_hat);
4982
- }
4983
-
4984
- #endif
4985
- // copyright ############################### //
4986
- // This file is part of the Xtrack Package. //
4987
- // Copyright (c) CERN, 2021. //
4988
- // ######################################### //
4989
-
4990
- #ifndef XTRACK_TRACK_DRIFT_H
4991
- #define XTRACK_TRACK_DRIFT_H
4992
-
4993
-
4994
- GPUFUN
4995
- void Drift_single_particle_expanded(LocalParticle* part, double length){
4996
- double const rpp = LocalParticle_get_rpp(part);
4997
- double const rv0v = 1./LocalParticle_get_rvv(part);
4998
- double const xp = LocalParticle_get_px(part) * rpp;
4999
- double const yp = LocalParticle_get_py(part) * rpp;
5000
- double const dzeta = 1 - rv0v * ( 1. + ( xp*xp + yp*yp ) / 2. );
5001
-
5002
- LocalParticle_add_to_x(part, xp * length );
5003
- LocalParticle_add_to_y(part, yp * length );
5004
- LocalParticle_add_to_s(part, length);
5005
- LocalParticle_add_to_zeta(part, length * dzeta );
5006
- }
5007
-
5008
-
5009
- GPUFUN
5010
- void Drift_single_particle_exact(LocalParticle* part, double length){
5011
- double const px = LocalParticle_get_px(part);
5012
- double const py = LocalParticle_get_py(part);
5013
- double const rv0v = 1./LocalParticle_get_rvv(part);
5014
- double const one_plus_delta = 1. + LocalParticle_get_delta(part);
5015
-
5016
- double const one_over_pz = 1./sqrt(one_plus_delta*one_plus_delta
5017
- - px * px - py * py);
5018
- double const dzeta = 1 - rv0v * one_plus_delta * one_over_pz;
5019
-
5020
- LocalParticle_add_to_x(part, px * one_over_pz * length);
5021
- LocalParticle_add_to_y(part, py * one_over_pz * length);
5022
- LocalParticle_add_to_zeta(part, dzeta * length);
5023
- LocalParticle_add_to_s(part, length);
5024
- }
5025
-
5026
-
5027
- GPUFUN
5028
- void Drift_single_particle(LocalParticle* part, double length){
5029
- #ifndef XTRACK_USE_EXACT_DRIFTS
5030
- Drift_single_particle_expanded(part, length);
5031
- #else
5032
- Drift_single_particle_exact(part, length);
5033
- #endif
5034
- }
5035
-
5036
-
5037
- #endif /* XTRACK_TRACK_DRIFT_H */
5038
-
5039
-
5040
- #ifndef XSTUITE_TRACK_FLAGS_H
5041
- #define XSTUITE_TRACK_FLAGS_H
5042
- #define XS_FLAG_BACKTRACK (0)
5043
- #define XS_FLAG_KILL_CAVITY_KICK (2)
5044
- #define XS_FLAG_IGNORE_GLOBAL_APERTURE (3)
5045
- #define XS_FLAG_IGNORE_LOCAL_APERTURE (4)
5046
- #define XS_FLAG_SR_TAPER (5)
5047
- #define XS_FLAG_SR_KICK_SAME_AS_FIRST (6)
5048
-
5049
- #endif // XSTUITE_TRACK_FLAGS_H
5050
-
5051
- // copyright ############################### //
5052
- // This file is part of the Xtrack Package. //
5053
- // Copyright (c) CERN, 2021. //
5054
- // ######################################### //
5055
-
5056
- #ifndef XTRACK_MONITORS_H
5057
- #define XTRACK_MONITORS_H
5058
-
5059
- #include <headers/track.h>
5060
-
5061
-
5062
- GPUFUN
5063
- void ParticlesMonitor_track_local_particle(ParticlesMonitorData el,
5064
- LocalParticle* part0){
5065
-
5066
- int64_t const start_at_turn = ParticlesMonitorData_get_start_at_turn(el);
5067
- int64_t const stop_at_turn = ParticlesMonitorData_get_stop_at_turn(el);
5068
- int64_t const part_id_start = ParticlesMonitorData_get_part_id_start(el);
5069
- int64_t const part_id_end= ParticlesMonitorData_get_part_id_end(el);
5070
- int64_t const ebe_mode = ParticlesMonitorData_get_ebe_mode(el);
5071
- int64_t const n_repetitions = ParticlesMonitorData_get_n_repetitions(el);
5072
- int64_t const repetition_period = ParticlesMonitorData_get_repetition_period(el);
5073
- ParticlesData data = ParticlesMonitorData_getp_data(el);
5074
-
5075
- int64_t n_turns_record = stop_at_turn - start_at_turn;
5076
-
5077
- START_PER_PARTICLE_BLOCK(part0, part);
5078
- int64_t at_turn;
5079
- if (ebe_mode){
5080
- at_turn = LocalParticle_get_at_element(part);
5081
- }
5082
- else{
5083
- if (LocalParticle_check_track_flag(part, XS_FLAG_BACKTRACK)) {
5084
- return; // do not log (only ebe monitor supported for now in backtrack)
5085
- }
5086
- at_turn = LocalParticle_get_at_turn(part);
5087
- }
5088
- if (n_repetitions == 1){
5089
- if (at_turn>=start_at_turn && at_turn<stop_at_turn){
5090
- int64_t const particle_id = LocalParticle_get_particle_id(part);
5091
- if (particle_id<part_id_end && particle_id>=part_id_start){
5092
- int64_t const store_at =
5093
- n_turns_record * (particle_id - part_id_start)
5094
- + at_turn - start_at_turn;
5095
- LocalParticle_to_Particles(part, data, store_at, 0);
5096
- }
5097
- }
5098
- }
5099
- else if (n_repetitions > 1){
5100
- if (at_turn < start_at_turn){
5101
- // return; //only_for_context cuda opencl
5102
- break; //only_for_context cpu_serial cpu_openmp
5103
- }
5104
- int64_t const i_frame = (at_turn - start_at_turn) / repetition_period;
5105
- if (i_frame < n_repetitions
5106
- && at_turn >= start_at_turn + i_frame*repetition_period
5107
- && at_turn < stop_at_turn + i_frame*repetition_period
5108
- ){
5109
- int64_t const particle_id = LocalParticle_get_particle_id(part);
5110
- if (particle_id<part_id_end && particle_id>=part_id_start){
5111
- int64_t const store_at =
5112
- n_turns_record * (part_id_end - part_id_start) * i_frame
5113
- + n_turns_record * (particle_id - part_id_start)
5114
- + (at_turn - i_frame * repetition_period) - start_at_turn;
5115
- LocalParticle_to_Particles(part, data, store_at, 0);
5116
- }
5117
- }
5118
- }
5119
-
5120
- #ifdef XSUITE_RESTORE_LOSS
5121
- LocalParticle_set_state(part, 1);
5122
- #endif
5123
- END_PER_PARTICLE_BLOCK;
5124
- }
5125
-
5126
- #endif
5127
-
5128
-
5129
-
5130
- #include <headers/track.h>
5131
- #include <headers/particle_states.h>
5132
- #include <beam_elements/elements_src/track_misalignments.h>
5133
- GPUFUN void ParticlesMonitor_track_local_particle_with_transformations(ParticlesMonitorData el, LocalParticle* part0){
5134
- // Transform to local frame
5135
- double const _sin_rot_s = ParticlesMonitorData_get__sin_rot_s(el);
5136
- if (_sin_rot_s > -2.) {
5137
- double const _cos_rot_s = ParticlesMonitorData_get__cos_rot_s(el);
5138
- double const rot_s_rad = atan2(_sin_rot_s, _cos_rot_s);
5139
- double const shift_x = ParticlesMonitorData_get__shift_x(el);
5140
- double const shift_y = ParticlesMonitorData_get__shift_y(el);
5141
- double const shift_s = ParticlesMonitorData_get__shift_s(el);
5142
- double const rot_x_rad = ParticlesMonitorData_get__rot_x_rad(el);
5143
- double const rot_y_rad = ParticlesMonitorData_get__rot_y_rad(el);
5144
- double const rot_s_rad_no_frame = ParticlesMonitorData_get__rot_s_rad_no_frame(el);
5145
- double const length = 0.;
5146
- ;
5147
- double const anchor = ParticlesMonitorData_get_rot_shift_anchor(el);
5148
- int8_t const backtrack = LocalParticle_check_track_flag(part0, XS_FLAG_BACKTRACK);
5149
-
5150
- if (!backtrack) {
5151
- track_misalignment_entry_straight(part0, shift_x, shift_y, shift_s, rot_y_rad, rot_x_rad, rot_s_rad_no_frame, anchor, length, rot_s_rad, backtrack); } else {
5152
- track_misalignment_exit_straight(part0, shift_x, shift_y, shift_s, rot_y_rad, rot_x_rad, rot_s_rad_no_frame, anchor, length, rot_s_rad, backtrack);
5153
- }
5154
-
5155
- /* Spin tracking is disabled by the synrad compile flag */
5156
- #ifndef XTRACK_MULTIPOLE_NO_SYNRAD
5157
- // Rotate spin
5158
-
5159
- {
5160
- // const int64_t XT_part_block_start_idx = part0->ipart; //only_for_context cpu_openmp
5161
- // const int64_t XT_part_block_end_idx = part0->endpart; //only_for_context cpu_openmp
5162
-
5163
- const int64_t XT_part_block_start_idx = 0; //only_for_context cpu_serial
5164
- const int64_t XT_part_block_end_idx = LocalParticle_get__num_active_particles(part0); //only_for_context cpu_serial
5165
-
5166
- //#pragma omp simd // TODO: currently does not work, needs investigating
5167
- for (int64_t XT_part_block_ii = XT_part_block_start_idx; XT_part_block_ii<XT_part_block_end_idx; XT_part_block_ii++) { //only_for_context cpu_openmp cpu_serial
5168
-
5169
- LocalParticle lpart = *part0; //only_for_context cpu_serial cpu_openmp
5170
- LocalParticle* part = &lpart; //only_for_context cpu_serial cpu_openmp
5171
- part->ipart = XT_part_block_ii; //only_for_context cpu_serial cpu_openmp
5172
-
5173
- // LocalParticle* part = part0; //only_for_context opencl cuda
5174
-
5175
- // if (LocalParticle_get_state(part) > 0) { //only_for_context cpu_openmp
5176
-
5177
- double const spin_x_0 = LocalParticle_get_spin_x(part);
5178
- double const spin_y_0 = LocalParticle_get_spin_y(part);
5179
- if ((spin_x_0 != 0) || (spin_y_0 != 0)){
5180
- double const spin_x_1 = _cos_rot_s*spin_x_0 + _sin_rot_s*spin_y_0;
5181
- double const spin_y_1 = -_sin_rot_s*spin_x_0 + _cos_rot_s*spin_y_0;
5182
- LocalParticle_set_spin_x(part, spin_x_1);
5183
- LocalParticle_set_spin_y(part, spin_y_1);
5184
- }
5185
-
5186
- // } //only_for_context cpu_openmp
5187
- } //only_for_context cpu_serial cpu_openmp
5188
- }
5189
-
5190
- #endif
5191
-
5192
- }
5193
- ParticlesMonitor_track_local_particle(el, part0);
5194
- // Transform back to global frame
5195
- if (_sin_rot_s > -2.) {
5196
- double const _cos_rot_s = ParticlesMonitorData_get__cos_rot_s(el);
5197
- double const rot_s_rad = atan2(_sin_rot_s, _cos_rot_s);
5198
- double const shift_x = ParticlesMonitorData_get__shift_x(el);
5199
- double const shift_y = ParticlesMonitorData_get__shift_y(el);
5200
- double const shift_s = ParticlesMonitorData_get__shift_s(el);
5201
- double const rot_x_rad = ParticlesMonitorData_get__rot_x_rad(el);
5202
- double const rot_y_rad = ParticlesMonitorData_get__rot_y_rad(el);
5203
- double const rot_s_rad_no_frame = ParticlesMonitorData_get__rot_s_rad_no_frame(el);
5204
- double const length = 0.;
5205
- ;
5206
- double const anchor = ParticlesMonitorData_get_rot_shift_anchor(el);
5207
- int8_t const backtrack = LocalParticle_check_track_flag(part0, XS_FLAG_BACKTRACK);
5208
-
5209
- /* Spin tracking is disabled by the synrad compile flag */
5210
- #ifndef XTRACK_MULTIPOLE_NO_SYNRAD
5211
- // Rotate spin
5212
-
5213
- {
5214
- // const int64_t XT_part_block_start_idx = part0->ipart; //only_for_context cpu_openmp
5215
- // const int64_t XT_part_block_end_idx = part0->endpart; //only_for_context cpu_openmp
5216
-
5217
- const int64_t XT_part_block_start_idx = 0; //only_for_context cpu_serial
5218
- const int64_t XT_part_block_end_idx = LocalParticle_get__num_active_particles(part0); //only_for_context cpu_serial
5219
-
5220
- //#pragma omp simd // TODO: currently does not work, needs investigating
5221
- for (int64_t XT_part_block_ii = XT_part_block_start_idx; XT_part_block_ii<XT_part_block_end_idx; XT_part_block_ii++) { //only_for_context cpu_openmp cpu_serial
5222
-
5223
- LocalParticle lpart = *part0; //only_for_context cpu_serial cpu_openmp
5224
- LocalParticle* part = &lpart; //only_for_context cpu_serial cpu_openmp
5225
- part->ipart = XT_part_block_ii; //only_for_context cpu_serial cpu_openmp
5226
-
5227
- // LocalParticle* part = part0; //only_for_context opencl cuda
5228
-
5229
- // if (LocalParticle_get_state(part) > 0) { //only_for_context cpu_openmp
5230
-
5231
- double const spin_x_0 = LocalParticle_get_spin_x(part);
5232
- double const spin_y_0 = LocalParticle_get_spin_y(part);
5233
- if ((spin_x_0 != 0) || (spin_y_0 != 0)){
5234
- double const spin_x_1 = _cos_rot_s*spin_x_0 - _sin_rot_s*spin_y_0;
5235
- double const spin_y_1 = _sin_rot_s*spin_x_0 + _cos_rot_s*spin_y_0;
5236
- LocalParticle_set_spin_x(part, spin_x_1);
5237
- LocalParticle_set_spin_y(part, spin_y_1);
5238
- }
5239
-
5240
- // } //only_for_context cpu_openmp
5241
- } //only_for_context cpu_serial cpu_openmp
5242
- }
5243
-
5244
- #endif
5245
-
5246
- if (!backtrack) {
5247
- track_misalignment_exit_straight(part0, shift_x, shift_y, shift_s, rot_y_rad, rot_x_rad, rot_s_rad_no_frame, anchor, length, rot_s_rad, backtrack); } else {
5248
- track_misalignment_entry_straight(part0, shift_x, shift_y, shift_s, rot_y_rad, rot_x_rad, rot_s_rad_no_frame, anchor, length, rot_s_rad, backtrack);
5249
- }
5250
- }
5059
+ static inline void ParticlesMonitorData_set_data__rng_s2(ParticlesMonitorData restrict obj, int64_t i0, uint32_t value){
5060
+ int64_t offset=0;
5061
+ offset+=152;
5062
+ offset+=*( int64_t*)(( char*) obj+offset+288);
5063
+ offset+=16+i0*4;
5064
+ *( uint32_t*)(( char*) obj+offset)=value;
5251
5065
  }
5252
-
5253
-
5254
-
5255
- void ParticlesMonitor_track_particles(
5256
- ParticlesMonitorData el,
5257
-
5258
- ParticlesData particles,
5259
-
5260
- int64_t flag_increment_at_element,
5261
- int8_t* io_buffer){
5262
-
5263
- // #define CONTEXT_OPENMP //only_for_context cpu_openmp
5264
- #ifdef CONTEXT_OPENMP
5265
- const int64_t capacity = ParticlesData_get__capacity(particles);
5266
- const int num_threads = omp_get_max_threads();
5267
-
5268
- #ifndef XT_OMP_SKIP_REORGANIZE
5269
- const int64_t num_particles_to_track = ParticlesData_get__num_active_particles(particles);
5270
-
5271
- {
5272
- LocalParticle lpart;
5273
- lpart.io_buffer = io_buffer;
5274
- Particles_to_LocalParticle(particles, &lpart, 0, capacity);
5275
- check_is_active(&lpart);
5276
- count_reorganized_particles(&lpart);
5277
- LocalParticle_to_Particles(&lpart, particles, 0, capacity);
5278
- }
5279
- #else // When we skip reorganize, we cannot just batch active particles
5280
- const int64_t num_particles_to_track = capacity;
5281
- #endif
5282
-
5283
- const int64_t chunk_size = (num_particles_to_track + num_threads - 1)/num_threads; // ceil division
5284
- #endif // CONTEXT_OPENMP
5285
-
5286
- // #pragma omp parallel for //only_for_context cpu_openmp
5287
- // for (int64_t batch_id = 0; batch_id < num_threads; batch_id++) { //only_for_context cpu_openmp
5288
- LocalParticle lpart;
5289
- lpart.io_buffer = io_buffer;
5290
- lpart.track_flags = 0;
5291
- // int64_t part_id = batch_id * chunk_size; //only_for_context cpu_openmp
5292
- // int64_t end_id = (batch_id + 1) * chunk_size; //only_for_context cpu_openmp
5293
- // if (end_id > num_particles_to_track) end_id = num_particles_to_track; //only_for_context cpu_openmp
5294
-
5295
- int64_t part_id = 0; //only_for_context cpu_serial
5296
- // int64_t part_id = blockDim.x * blockIdx.x + threadIdx.x; //only_for_context cuda
5297
- // int64_t part_id = get_global_id(0); //only_for_context opencl
5298
- int64_t end_id = 0; // unused outside of openmp //only_for_context cpu_serial cuda opencl
5299
-
5300
- int64_t part_capacity = ParticlesData_get__capacity(particles);
5301
- if (part_id<part_capacity){
5302
- Particles_to_LocalParticle(particles, &lpart, part_id, end_id);
5303
- if (check_is_active(&lpart)>0){
5304
- ParticlesMonitor_track_local_particle_with_transformations(el, &lpart);
5305
-
5306
- }
5307
- if (check_is_active(&lpart)>0 && flag_increment_at_element){
5308
- increment_at_element(&lpart, 1);
5309
- }
5310
- }
5311
- // } //only_for_context cpu_openmp
5312
-
5313
- // On OpenMP we want to additionally by default reorganize all
5314
- // the particles.
5315
- // #ifndef XT_OMP_SKIP_REORGANIZE //only_for_context cpu_openmp
5316
- // LocalParticle lpart; //only_for_context cpu_openmp
5317
- // lpart.io_buffer = io_buffer; //only_for_context cpu_openmp
5318
- // Particles_to_LocalParticle(particles, &lpart, 0, capacity);//only_for_context cpu_openmp
5319
- // check_is_active(&lpart); //only_for_context cpu_openmp
5320
- // #endif //only_for_context cpu_openmp
5321
- }
5322
-
5323
- #ifndef XOBJ_TYPEDEF_RandomUniformData
5324
- #define XOBJ_TYPEDEF_RandomUniformData
5325
- typedef struct RandomUniformData_s * RandomUniformData;
5326
- static inline RandomUniformData RandomUniformData_getp(RandomUniformData restrict obj){
5066
+ static inline uint32_t* ParticlesMonitorData_getp1_data__rng_s2(ParticlesMonitorData restrict obj, int64_t i0){
5327
5067
  int64_t offset=0;
5328
- return (RandomUniformData)(( char*) obj+offset);
5068
+ offset+=152;
5069
+ offset+=*( int64_t*)(( char*) obj+offset+288);
5070
+ offset+=16+i0*4;
5071
+ return ( uint32_t*)(( char*) obj+offset);
5329
5072
  }
5330
- static inline uint8_t RandomUniformData_get__dummy(const RandomUniformData restrict obj){
5073
+ static inline ArrNUint32 ParticlesMonitorData_getp_data__rng_s3(ParticlesMonitorData restrict obj){
5331
5074
  int64_t offset=0;
5332
- return *(( uint8_t*) obj+offset);
5075
+ offset+=152;
5076
+ offset+=*( int64_t*)(( char*) obj+offset+296);
5077
+ return (ArrNUint32)(( char*) obj+offset);
5333
5078
  }
5334
- static inline void RandomUniformData_set__dummy(RandomUniformData restrict obj, uint8_t value){
5079
+ static inline int64_t ParticlesMonitorData_len_data__rng_s3(ParticlesMonitorData restrict obj){
5335
5080
  int64_t offset=0;
5336
- *(( uint8_t*) obj+offset)=value;
5081
+ offset+=152;
5082
+ offset+=*( int64_t*)(( char*) obj+offset+296);
5083
+ int64_t* arr = ( int64_t*)(( char*) obj+offset);
5084
+ return arr[1];
5337
5085
  }
5338
- static inline uint8_t* RandomUniformData_getp__dummy(RandomUniformData restrict obj){
5086
+ static inline uint32_t ParticlesMonitorData_get_data__rng_s3(const ParticlesMonitorData restrict obj, int64_t i0){
5339
5087
  int64_t offset=0;
5340
- return ( uint8_t*)(( char*) obj+offset);
5088
+ offset+=152;
5089
+ offset+=*( int64_t*)(( char*) obj+offset+296);
5090
+ offset+=16+i0*4;
5091
+ return *( uint32_t*)(( char*) obj+offset);
5341
5092
  }
5342
- static inline double RandomUniformData_get__sin_rot_s(const RandomUniformData restrict obj){
5093
+ static inline void ParticlesMonitorData_set_data__rng_s3(ParticlesMonitorData restrict obj, int64_t i0, uint32_t value){
5343
5094
  int64_t offset=0;
5344
- offset+=8;
5095
+ offset+=152;
5096
+ offset+=*( int64_t*)(( char*) obj+offset+296);
5097
+ offset+=16+i0*4;
5098
+ *( uint32_t*)(( char*) obj+offset)=value;
5099
+ }
5100
+ static inline uint32_t* ParticlesMonitorData_getp1_data__rng_s3(ParticlesMonitorData restrict obj, int64_t i0){
5101
+ int64_t offset=0;
5102
+ offset+=152;
5103
+ offset+=*( int64_t*)(( char*) obj+offset+296);
5104
+ offset+=16+i0*4;
5105
+ return ( uint32_t*)(( char*) obj+offset);
5106
+ }
5107
+ static inline ArrNUint32 ParticlesMonitorData_getp_data__rng_s4(ParticlesMonitorData restrict obj){
5108
+ int64_t offset=0;
5109
+ offset+=152;
5110
+ offset+=*( int64_t*)(( char*) obj+offset+304);
5111
+ return (ArrNUint32)(( char*) obj+offset);
5112
+ }
5113
+ static inline int64_t ParticlesMonitorData_len_data__rng_s4(ParticlesMonitorData restrict obj){
5114
+ int64_t offset=0;
5115
+ offset+=152;
5116
+ offset+=*( int64_t*)(( char*) obj+offset+304);
5117
+ int64_t* arr = ( int64_t*)(( char*) obj+offset);
5118
+ return arr[1];
5119
+ }
5120
+ static inline uint32_t ParticlesMonitorData_get_data__rng_s4(const ParticlesMonitorData restrict obj, int64_t i0){
5121
+ int64_t offset=0;
5122
+ offset+=152;
5123
+ offset+=*( int64_t*)(( char*) obj+offset+304);
5124
+ offset+=16+i0*4;
5125
+ return *( uint32_t*)(( char*) obj+offset);
5126
+ }
5127
+ static inline void ParticlesMonitorData_set_data__rng_s4(ParticlesMonitorData restrict obj, int64_t i0, uint32_t value){
5128
+ int64_t offset=0;
5129
+ offset+=152;
5130
+ offset+=*( int64_t*)(( char*) obj+offset+304);
5131
+ offset+=16+i0*4;
5132
+ *( uint32_t*)(( char*) obj+offset)=value;
5133
+ }
5134
+ static inline uint32_t* ParticlesMonitorData_getp1_data__rng_s4(ParticlesMonitorData restrict obj, int64_t i0){
5135
+ int64_t offset=0;
5136
+ offset+=152;
5137
+ offset+=*( int64_t*)(( char*) obj+offset+304);
5138
+ offset+=16+i0*4;
5139
+ return ( uint32_t*)(( char*) obj+offset);
5140
+ }
5141
+ static inline double ParticlesMonitorData_get__sin_rot_s(const ParticlesMonitorData restrict obj){
5142
+ int64_t offset=0;
5143
+ offset+=80;
5345
5144
  return *( double*)(( char*) obj+offset);
5346
5145
  }
5347
- static inline void RandomUniformData_set__sin_rot_s(RandomUniformData restrict obj, double value){
5146
+ static inline void ParticlesMonitorData_set__sin_rot_s(ParticlesMonitorData restrict obj, double value){
5348
5147
  int64_t offset=0;
5349
- offset+=8;
5148
+ offset+=80;
5350
5149
  *( double*)(( char*) obj+offset)=value;
5351
5150
  }
5352
- static inline double* RandomUniformData_getp__sin_rot_s(RandomUniformData restrict obj){
5151
+ static inline double* ParticlesMonitorData_getp__sin_rot_s(ParticlesMonitorData restrict obj){
5353
5152
  int64_t offset=0;
5354
- offset+=8;
5153
+ offset+=80;
5355
5154
  return ( double*)(( char*) obj+offset);
5356
5155
  }
5357
- static inline double RandomUniformData_get__cos_rot_s(const RandomUniformData restrict obj){
5156
+ static inline double ParticlesMonitorData_get__cos_rot_s(const ParticlesMonitorData restrict obj){
5358
5157
  int64_t offset=0;
5359
- offset+=16;
5158
+ offset+=88;
5360
5159
  return *( double*)(( char*) obj+offset);
5361
5160
  }
5362
- static inline void RandomUniformData_set__cos_rot_s(RandomUniformData restrict obj, double value){
5161
+ static inline void ParticlesMonitorData_set__cos_rot_s(ParticlesMonitorData restrict obj, double value){
5363
5162
  int64_t offset=0;
5364
- offset+=16;
5163
+ offset+=88;
5365
5164
  *( double*)(( char*) obj+offset)=value;
5366
5165
  }
5367
- static inline double* RandomUniformData_getp__cos_rot_s(RandomUniformData restrict obj){
5166
+ static inline double* ParticlesMonitorData_getp__cos_rot_s(ParticlesMonitorData restrict obj){
5368
5167
  int64_t offset=0;
5369
- offset+=16;
5168
+ offset+=88;
5370
5169
  return ( double*)(( char*) obj+offset);
5371
5170
  }
5372
- static inline double RandomUniformData_get__shift_x(const RandomUniformData restrict obj){
5171
+ static inline double ParticlesMonitorData_get__shift_x(const ParticlesMonitorData restrict obj){
5373
5172
  int64_t offset=0;
5374
- offset+=24;
5173
+ offset+=96;
5375
5174
  return *( double*)(( char*) obj+offset);
5376
5175
  }
5377
- static inline void RandomUniformData_set__shift_x(RandomUniformData restrict obj, double value){
5176
+ static inline void ParticlesMonitorData_set__shift_x(ParticlesMonitorData restrict obj, double value){
5378
5177
  int64_t offset=0;
5379
- offset+=24;
5178
+ offset+=96;
5380
5179
  *( double*)(( char*) obj+offset)=value;
5381
5180
  }
5382
- static inline double* RandomUniformData_getp__shift_x(RandomUniformData restrict obj){
5181
+ static inline double* ParticlesMonitorData_getp__shift_x(ParticlesMonitorData restrict obj){
5383
5182
  int64_t offset=0;
5384
- offset+=24;
5183
+ offset+=96;
5385
5184
  return ( double*)(( char*) obj+offset);
5386
5185
  }
5387
- static inline double RandomUniformData_get__shift_y(const RandomUniformData restrict obj){
5186
+ static inline double ParticlesMonitorData_get__shift_y(const ParticlesMonitorData restrict obj){
5388
5187
  int64_t offset=0;
5389
- offset+=32;
5188
+ offset+=104;
5390
5189
  return *( double*)(( char*) obj+offset);
5391
5190
  }
5392
- static inline void RandomUniformData_set__shift_y(RandomUniformData restrict obj, double value){
5191
+ static inline void ParticlesMonitorData_set__shift_y(ParticlesMonitorData restrict obj, double value){
5393
5192
  int64_t offset=0;
5394
- offset+=32;
5193
+ offset+=104;
5395
5194
  *( double*)(( char*) obj+offset)=value;
5396
5195
  }
5397
- static inline double* RandomUniformData_getp__shift_y(RandomUniformData restrict obj){
5196
+ static inline double* ParticlesMonitorData_getp__shift_y(ParticlesMonitorData restrict obj){
5398
5197
  int64_t offset=0;
5399
- offset+=32;
5198
+ offset+=104;
5400
5199
  return ( double*)(( char*) obj+offset);
5401
5200
  }
5402
- static inline double RandomUniformData_get__shift_s(const RandomUniformData restrict obj){
5201
+ static inline double ParticlesMonitorData_get__shift_s(const ParticlesMonitorData restrict obj){
5403
5202
  int64_t offset=0;
5404
- offset+=40;
5203
+ offset+=112;
5405
5204
  return *( double*)(( char*) obj+offset);
5406
5205
  }
5407
- static inline void RandomUniformData_set__shift_s(RandomUniformData restrict obj, double value){
5206
+ static inline void ParticlesMonitorData_set__shift_s(ParticlesMonitorData restrict obj, double value){
5408
5207
  int64_t offset=0;
5409
- offset+=40;
5208
+ offset+=112;
5410
5209
  *( double*)(( char*) obj+offset)=value;
5411
5210
  }
5412
- static inline double* RandomUniformData_getp__shift_s(RandomUniformData restrict obj){
5211
+ static inline double* ParticlesMonitorData_getp__shift_s(ParticlesMonitorData restrict obj){
5413
5212
  int64_t offset=0;
5414
- offset+=40;
5213
+ offset+=112;
5415
5214
  return ( double*)(( char*) obj+offset);
5416
5215
  }
5417
- static inline double RandomUniformData_get__rot_x_rad(const RandomUniformData restrict obj){
5216
+ static inline double ParticlesMonitorData_get__rot_x_rad(const ParticlesMonitorData restrict obj){
5418
5217
  int64_t offset=0;
5419
- offset+=48;
5218
+ offset+=120;
5420
5219
  return *( double*)(( char*) obj+offset);
5421
5220
  }
5422
- static inline void RandomUniformData_set__rot_x_rad(RandomUniformData restrict obj, double value){
5221
+ static inline void ParticlesMonitorData_set__rot_x_rad(ParticlesMonitorData restrict obj, double value){
5423
5222
  int64_t offset=0;
5424
- offset+=48;
5223
+ offset+=120;
5425
5224
  *( double*)(( char*) obj+offset)=value;
5426
5225
  }
5427
- static inline double* RandomUniformData_getp__rot_x_rad(RandomUniformData restrict obj){
5226
+ static inline double* ParticlesMonitorData_getp__rot_x_rad(ParticlesMonitorData restrict obj){
5428
5227
  int64_t offset=0;
5429
- offset+=48;
5228
+ offset+=120;
5430
5229
  return ( double*)(( char*) obj+offset);
5431
5230
  }
5432
- static inline double RandomUniformData_get__rot_y_rad(const RandomUniformData restrict obj){
5231
+ static inline double ParticlesMonitorData_get__rot_y_rad(const ParticlesMonitorData restrict obj){
5433
5232
  int64_t offset=0;
5434
- offset+=56;
5233
+ offset+=128;
5435
5234
  return *( double*)(( char*) obj+offset);
5436
5235
  }
5437
- static inline void RandomUniformData_set__rot_y_rad(RandomUniformData restrict obj, double value){
5236
+ static inline void ParticlesMonitorData_set__rot_y_rad(ParticlesMonitorData restrict obj, double value){
5438
5237
  int64_t offset=0;
5439
- offset+=56;
5238
+ offset+=128;
5440
5239
  *( double*)(( char*) obj+offset)=value;
5441
5240
  }
5442
- static inline double* RandomUniformData_getp__rot_y_rad(RandomUniformData restrict obj){
5241
+ static inline double* ParticlesMonitorData_getp__rot_y_rad(ParticlesMonitorData restrict obj){
5443
5242
  int64_t offset=0;
5444
- offset+=56;
5243
+ offset+=128;
5445
5244
  return ( double*)(( char*) obj+offset);
5446
5245
  }
5447
- static inline double RandomUniformData_get__rot_s_rad_no_frame(const RandomUniformData restrict obj){
5246
+ static inline double ParticlesMonitorData_get__rot_s_rad_no_frame(const ParticlesMonitorData restrict obj){
5448
5247
  int64_t offset=0;
5449
- offset+=64;
5248
+ offset+=136;
5450
5249
  return *( double*)(( char*) obj+offset);
5451
5250
  }
5452
- static inline void RandomUniformData_set__rot_s_rad_no_frame(RandomUniformData restrict obj, double value){
5251
+ static inline void ParticlesMonitorData_set__rot_s_rad_no_frame(ParticlesMonitorData restrict obj, double value){
5453
5252
  int64_t offset=0;
5454
- offset+=64;
5253
+ offset+=136;
5455
5254
  *( double*)(( char*) obj+offset)=value;
5456
5255
  }
5457
- static inline double* RandomUniformData_getp__rot_s_rad_no_frame(RandomUniformData restrict obj){
5256
+ static inline double* ParticlesMonitorData_getp__rot_s_rad_no_frame(ParticlesMonitorData restrict obj){
5458
5257
  int64_t offset=0;
5459
- offset+=64;
5258
+ offset+=136;
5460
5259
  return ( double*)(( char*) obj+offset);
5461
5260
  }
5462
- static inline double RandomUniformData_get_rot_shift_anchor(const RandomUniformData restrict obj){
5261
+ static inline double ParticlesMonitorData_get_rot_shift_anchor(const ParticlesMonitorData restrict obj){
5463
5262
  int64_t offset=0;
5464
- offset+=72;
5263
+ offset+=144;
5465
5264
  return *( double*)(( char*) obj+offset);
5466
5265
  }
5467
- static inline void RandomUniformData_set_rot_shift_anchor(RandomUniformData restrict obj, double value){
5266
+ static inline void ParticlesMonitorData_set_rot_shift_anchor(ParticlesMonitorData restrict obj, double value){
5468
5267
  int64_t offset=0;
5469
- offset+=72;
5268
+ offset+=144;
5470
5269
  *( double*)(( char*) obj+offset)=value;
5471
5270
  }
5472
- static inline double* RandomUniformData_getp_rot_shift_anchor(RandomUniformData restrict obj){
5271
+ static inline double* ParticlesMonitorData_getp_rot_shift_anchor(ParticlesMonitorData restrict obj){
5473
5272
  int64_t offset=0;
5474
- offset+=72;
5273
+ offset+=144;
5475
5274
  return ( double*)(( char*) obj+offset);
5476
5275
  }
5477
5276
  #endif
@@ -5684,14 +5483,215 @@ void Drift_single_particle(LocalParticle* part, double length){
5684
5483
 
5685
5484
  #endif // XSTUITE_TRACK_FLAGS_H
5686
5485
 
5687
- #include <random/random_src/uniform.h>
5486
+ // copyright ############################### //
5487
+ // This file is part of the Xtrack Package. //
5488
+ // Copyright (c) CERN, 2021. //
5489
+ // ######################################### //
5490
+
5491
+ #ifndef XTRACK_MONITORS_H
5492
+ #define XTRACK_MONITORS_H
5493
+
5494
+ #include <headers/track.h>
5495
+
5496
+
5497
+ GPUFUN
5498
+ void ParticlesMonitor_track_local_particle(ParticlesMonitorData el,
5499
+ LocalParticle* part0){
5500
+
5501
+ int64_t const start_at_turn = ParticlesMonitorData_get_start_at_turn(el);
5502
+ int64_t const stop_at_turn = ParticlesMonitorData_get_stop_at_turn(el);
5503
+ int64_t const part_id_start = ParticlesMonitorData_get_part_id_start(el);
5504
+ int64_t const part_id_end= ParticlesMonitorData_get_part_id_end(el);
5505
+ int64_t const ebe_mode = ParticlesMonitorData_get_ebe_mode(el);
5506
+ int64_t const n_repetitions = ParticlesMonitorData_get_n_repetitions(el);
5507
+ int64_t const repetition_period = ParticlesMonitorData_get_repetition_period(el);
5508
+ ParticlesData data = ParticlesMonitorData_getp_data(el);
5509
+
5510
+ int64_t n_turns_record = stop_at_turn - start_at_turn;
5511
+
5512
+ START_PER_PARTICLE_BLOCK(part0, part);
5513
+ int64_t at_turn;
5514
+ if (ebe_mode){
5515
+ at_turn = LocalParticle_get_at_element(part);
5516
+ }
5517
+ else{
5518
+ if (LocalParticle_check_track_flag(part, XS_FLAG_BACKTRACK)) {
5519
+ return; // do not log (only ebe monitor supported for now in backtrack)
5520
+ }
5521
+ at_turn = LocalParticle_get_at_turn(part);
5522
+ }
5523
+ if (n_repetitions == 1){
5524
+ if (at_turn>=start_at_turn && at_turn<stop_at_turn){
5525
+ int64_t const particle_id = LocalParticle_get_particle_id(part);
5526
+ if (particle_id<part_id_end && particle_id>=part_id_start){
5527
+ int64_t const store_at =
5528
+ n_turns_record * (particle_id - part_id_start)
5529
+ + at_turn - start_at_turn;
5530
+ LocalParticle_to_Particles(part, data, store_at, 0);
5531
+ }
5532
+ }
5533
+ }
5534
+ else if (n_repetitions > 1){
5535
+ if (at_turn < start_at_turn){
5536
+ // return; //only_for_context cuda opencl
5537
+ break; //only_for_context cpu_serial cpu_openmp
5538
+ }
5539
+ int64_t const i_frame = (at_turn - start_at_turn) / repetition_period;
5540
+ if (i_frame < n_repetitions
5541
+ && at_turn >= start_at_turn + i_frame*repetition_period
5542
+ && at_turn < stop_at_turn + i_frame*repetition_period
5543
+ ){
5544
+ int64_t const particle_id = LocalParticle_get_particle_id(part);
5545
+ if (particle_id<part_id_end && particle_id>=part_id_start){
5546
+ int64_t const store_at =
5547
+ n_turns_record * (part_id_end - part_id_start) * i_frame
5548
+ + n_turns_record * (particle_id - part_id_start)
5549
+ + (at_turn - i_frame * repetition_period) - start_at_turn;
5550
+ LocalParticle_to_Particles(part, data, store_at, 0);
5551
+ }
5552
+ }
5553
+ }
5554
+
5555
+ #ifdef XSUITE_RESTORE_LOSS
5556
+ LocalParticle_set_state(part, 1);
5557
+ #endif
5558
+ END_PER_PARTICLE_BLOCK;
5559
+ }
5560
+
5561
+ #endif
5562
+
5563
+
5564
+
5565
+ #include <headers/track.h>
5566
+ #include <headers/particle_states.h>
5567
+ #include <beam_elements/elements_src/track_misalignments.h>
5568
+ GPUFUN void ParticlesMonitor_track_local_particle_with_transformations(ParticlesMonitorData el, LocalParticle* part0){
5569
+ // Transform to local frame
5570
+ double const _sin_rot_s = ParticlesMonitorData_get__sin_rot_s(el);
5571
+ if (_sin_rot_s > -2.) {
5572
+ double const _cos_rot_s = ParticlesMonitorData_get__cos_rot_s(el);
5573
+ double const rot_s_rad = atan2(_sin_rot_s, _cos_rot_s);
5574
+ double const shift_x = ParticlesMonitorData_get__shift_x(el);
5575
+ double const shift_y = ParticlesMonitorData_get__shift_y(el);
5576
+ double const shift_s = ParticlesMonitorData_get__shift_s(el);
5577
+ double const rot_x_rad = ParticlesMonitorData_get__rot_x_rad(el);
5578
+ double const rot_y_rad = ParticlesMonitorData_get__rot_y_rad(el);
5579
+ double const rot_s_rad_no_frame = ParticlesMonitorData_get__rot_s_rad_no_frame(el);
5580
+ double const length = 0.;
5581
+ ;
5582
+ double const anchor = ParticlesMonitorData_get_rot_shift_anchor(el);
5583
+ int8_t const backtrack = LocalParticle_check_track_flag(part0, XS_FLAG_BACKTRACK);
5584
+
5585
+ if (!backtrack) {
5586
+ track_misalignment_entry_straight(part0, shift_x, shift_y, shift_s, rot_y_rad, rot_x_rad, rot_s_rad_no_frame, anchor, length, rot_s_rad, backtrack); } else {
5587
+ track_misalignment_exit_straight(part0, shift_x, shift_y, shift_s, rot_y_rad, rot_x_rad, rot_s_rad_no_frame, anchor, length, rot_s_rad, backtrack);
5588
+ }
5589
+
5590
+ /* Spin tracking is disabled by the synrad compile flag */
5591
+ #ifndef XTRACK_MULTIPOLE_NO_SYNRAD
5592
+ // Rotate spin
5593
+
5594
+ {
5595
+ // const int64_t XT_part_block_start_idx = part0->ipart; //only_for_context cpu_openmp
5596
+ // const int64_t XT_part_block_end_idx = part0->endpart; //only_for_context cpu_openmp
5597
+
5598
+ const int64_t XT_part_block_start_idx = 0; //only_for_context cpu_serial
5599
+ const int64_t XT_part_block_end_idx = LocalParticle_get__num_active_particles(part0); //only_for_context cpu_serial
5600
+
5601
+ //#pragma omp simd // TODO: currently does not work, needs investigating
5602
+ for (int64_t XT_part_block_ii = XT_part_block_start_idx; XT_part_block_ii<XT_part_block_end_idx; XT_part_block_ii++) { //only_for_context cpu_openmp cpu_serial
5603
+
5604
+ LocalParticle lpart = *part0; //only_for_context cpu_serial cpu_openmp
5605
+ LocalParticle* part = &lpart; //only_for_context cpu_serial cpu_openmp
5606
+ part->ipart = XT_part_block_ii; //only_for_context cpu_serial cpu_openmp
5607
+
5608
+ // LocalParticle* part = part0; //only_for_context opencl cuda
5609
+
5610
+ // if (LocalParticle_get_state(part) > 0) { //only_for_context cpu_openmp
5611
+
5612
+ double const spin_x_0 = LocalParticle_get_spin_x(part);
5613
+ double const spin_y_0 = LocalParticle_get_spin_y(part);
5614
+ if ((spin_x_0 != 0) || (spin_y_0 != 0)){
5615
+ double const spin_x_1 = _cos_rot_s*spin_x_0 + _sin_rot_s*spin_y_0;
5616
+ double const spin_y_1 = -_sin_rot_s*spin_x_0 + _cos_rot_s*spin_y_0;
5617
+ LocalParticle_set_spin_x(part, spin_x_1);
5618
+ LocalParticle_set_spin_y(part, spin_y_1);
5619
+ }
5620
+
5621
+ // } //only_for_context cpu_openmp
5622
+ } //only_for_context cpu_serial cpu_openmp
5623
+ }
5624
+
5625
+ #endif
5626
+
5627
+ }
5628
+ ParticlesMonitor_track_local_particle(el, part0);
5629
+ // Transform back to global frame
5630
+ if (_sin_rot_s > -2.) {
5631
+ double const _cos_rot_s = ParticlesMonitorData_get__cos_rot_s(el);
5632
+ double const rot_s_rad = atan2(_sin_rot_s, _cos_rot_s);
5633
+ double const shift_x = ParticlesMonitorData_get__shift_x(el);
5634
+ double const shift_y = ParticlesMonitorData_get__shift_y(el);
5635
+ double const shift_s = ParticlesMonitorData_get__shift_s(el);
5636
+ double const rot_x_rad = ParticlesMonitorData_get__rot_x_rad(el);
5637
+ double const rot_y_rad = ParticlesMonitorData_get__rot_y_rad(el);
5638
+ double const rot_s_rad_no_frame = ParticlesMonitorData_get__rot_s_rad_no_frame(el);
5639
+ double const length = 0.;
5640
+ ;
5641
+ double const anchor = ParticlesMonitorData_get_rot_shift_anchor(el);
5642
+ int8_t const backtrack = LocalParticle_check_track_flag(part0, XS_FLAG_BACKTRACK);
5643
+
5644
+ /* Spin tracking is disabled by the synrad compile flag */
5645
+ #ifndef XTRACK_MULTIPOLE_NO_SYNRAD
5646
+ // Rotate spin
5647
+
5648
+ {
5649
+ // const int64_t XT_part_block_start_idx = part0->ipart; //only_for_context cpu_openmp
5650
+ // const int64_t XT_part_block_end_idx = part0->endpart; //only_for_context cpu_openmp
5651
+
5652
+ const int64_t XT_part_block_start_idx = 0; //only_for_context cpu_serial
5653
+ const int64_t XT_part_block_end_idx = LocalParticle_get__num_active_particles(part0); //only_for_context cpu_serial
5654
+
5655
+ //#pragma omp simd // TODO: currently does not work, needs investigating
5656
+ for (int64_t XT_part_block_ii = XT_part_block_start_idx; XT_part_block_ii<XT_part_block_end_idx; XT_part_block_ii++) { //only_for_context cpu_openmp cpu_serial
5657
+
5658
+ LocalParticle lpart = *part0; //only_for_context cpu_serial cpu_openmp
5659
+ LocalParticle* part = &lpart; //only_for_context cpu_serial cpu_openmp
5660
+ part->ipart = XT_part_block_ii; //only_for_context cpu_serial cpu_openmp
5661
+
5662
+ // LocalParticle* part = part0; //only_for_context opencl cuda
5663
+
5664
+ // if (LocalParticle_get_state(part) > 0) { //only_for_context cpu_openmp
5665
+
5666
+ double const spin_x_0 = LocalParticle_get_spin_x(part);
5667
+ double const spin_y_0 = LocalParticle_get_spin_y(part);
5668
+ if ((spin_x_0 != 0) || (spin_y_0 != 0)){
5669
+ double const spin_x_1 = _cos_rot_s*spin_x_0 - _sin_rot_s*spin_y_0;
5670
+ double const spin_y_1 = _sin_rot_s*spin_x_0 + _cos_rot_s*spin_y_0;
5671
+ LocalParticle_set_spin_x(part, spin_x_1);
5672
+ LocalParticle_set_spin_y(part, spin_y_1);
5673
+ }
5674
+
5675
+ // } //only_for_context cpu_openmp
5676
+ } //only_for_context cpu_serial cpu_openmp
5677
+ }
5678
+
5679
+ #endif
5680
+
5681
+ if (!backtrack) {
5682
+ track_misalignment_exit_straight(part0, shift_x, shift_y, shift_s, rot_y_rad, rot_x_rad, rot_s_rad_no_frame, anchor, length, rot_s_rad, backtrack); } else {
5683
+ track_misalignment_entry_straight(part0, shift_x, shift_y, shift_s, rot_y_rad, rot_x_rad, rot_s_rad_no_frame, anchor, length, rot_s_rad, backtrack);
5684
+ }
5685
+ }
5686
+ }
5687
+
5688
5688
 
5689
5689
 
5690
- void sample_uniform(
5691
- RandomUniformData el,
5690
+ void ParticlesMonitor_track_particles(
5691
+ ParticlesMonitorData el,
5692
5692
 
5693
5693
  ParticlesData particles,
5694
- double* samples, int64_t n_samples_per_seed,
5694
+
5695
5695
  int64_t flag_increment_at_element,
5696
5696
  int8_t* io_buffer){
5697
5697
 
@@ -5736,7 +5736,7 @@ void Drift_single_particle(LocalParticle* part, double length){
5736
5736
  if (part_id<part_capacity){
5737
5737
  Particles_to_LocalParticle(particles, &lpart, part_id, end_id);
5738
5738
  if (check_is_active(&lpart)>0){
5739
- RandomUniform_sample(el, &lpart, samples, n_samples_per_seed);
5739
+ ParticlesMonitor_track_local_particle_with_transformations(el, &lpart);
5740
5740
 
5741
5741
  }
5742
5742
  if (check_is_active(&lpart)>0 && flag_increment_at_element){
@@ -5755,25 +5755,6 @@ void Drift_single_particle(LocalParticle* part, double length){
5755
5755
  // #endif //only_for_context cpu_openmp
5756
5756
  }
5757
5757
 
5758
- #ifndef XOBJ_TYPEDEF_ElementRefClass
5759
- #define XOBJ_TYPEDEF_ElementRefClass
5760
- typedef struct ElementRefClass_s * ElementRefClass;
5761
- enum ElementRefClass_e{ElementRefClass_ParticlesMonitorData_t};
5762
- static inline ElementRefClass ElementRefClass_getp(ElementRefClass restrict obj){
5763
- int64_t offset=0;
5764
- return (ElementRefClass)(( char*) obj+offset);
5765
- }
5766
- static inline int64_t ElementRefClass_typeid(const ElementRefClass restrict obj){
5767
- int64_t offset=0;
5768
- offset+=8;
5769
- return *( int64_t*)(( char*) obj+offset);
5770
- }
5771
- static inline void* ElementRefClass_member(const ElementRefClass restrict obj){
5772
- int64_t offset=0;
5773
- offset+=*( int64_t*)(( char*) obj+offset);
5774
- return ( void*)(( char*) obj+offset);
5775
- }
5776
- #endif
5777
5758
  #ifndef XOBJ_TYPEDEF_RandomExponentialData
5778
5759
  #define XOBJ_TYPEDEF_RandomExponentialData
5779
5760
  typedef struct RandomExponentialData_s * RandomExponentialData;
@@ -7139,6 +7120,25 @@ void Drift_single_particle(LocalParticle* part, double length){
7139
7120
  // #endif //only_for_context cpu_openmp
7140
7121
  }
7141
7122
 
7123
+ #ifndef XOBJ_TYPEDEF_ElementRefClass
7124
+ #define XOBJ_TYPEDEF_ElementRefClass
7125
+ typedef struct ElementRefClass_s * ElementRefClass;
7126
+ enum ElementRefClass_e{ElementRefClass_ParticlesMonitorData_t};
7127
+ static inline ElementRefClass ElementRefClass_getp(ElementRefClass restrict obj){
7128
+ int64_t offset=0;
7129
+ return (ElementRefClass)(( char*) obj+offset);
7130
+ }
7131
+ static inline int64_t ElementRefClass_typeid(const ElementRefClass restrict obj){
7132
+ int64_t offset=0;
7133
+ offset+=8;
7134
+ return *( int64_t*)(( char*) obj+offset);
7135
+ }
7136
+ static inline void* ElementRefClass_member(const ElementRefClass restrict obj){
7137
+ int64_t offset=0;
7138
+ offset+=*( int64_t*)(( char*) obj+offset);
7139
+ return ( void*)(( char*) obj+offset);
7140
+ }
7141
+ #endif
7142
7142
  #ifndef XOBJ_TYPEDEF_ArrNElementRefClass
7143
7143
  #define XOBJ_TYPEDEF_ArrNElementRefClass
7144
7144
  typedef struct ArrNElementRefClass_s * ArrNElementRefClass;