00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef PARTICLEDATABASE_HPP
00044 #define PARTICLEDATABASE_HPP 1
00045
00046
00047 #include "scalarfield.hpp"
00048 #include "vectorfield.hpp"
00049 #include "particles.hpp"
00050 #include "trajectorydiagnostics.hpp"
00051 #include "particlestatistics.hpp"
00052 #include "constants.hpp"
00053
00054
00057 class TrajectoryHandlerCallback {
00058 public:
00059
00062 virtual ~TrajectoryHandlerCallback() {}
00063
00064 virtual void operator()( ParticleBase *particle, ParticlePBase *xcur, ParticlePBase *xend ) const = 0;
00065
00066 };
00067
00068
00071 class TrajectoryEndCallback {
00072 public:
00073
00076 virtual ~TrajectoryEndCallback() {}
00077
00080 virtual void operator()( ParticleBase *particle, class ParticleDataBase *pdb ) const = 0;
00081
00082 };
00083
00084
00094 class PPlasmaBfieldSuppression : public CallbackFunctorD_V {
00095
00096 double _phi;
00097 const ScalarField &_epot;
00099 public:
00100
00103 PPlasmaBfieldSuppression( const ScalarField &epot, double phi )
00104 : _phi(phi), _epot(epot) {}
00105
00108 ~PPlasmaBfieldSuppression() {}
00109
00112 virtual double operator()( const Vec3D &x ) const {
00113 if( _epot( x ) > _phi )
00114 return( 0.0 );
00115 return( 1.0 );
00116 }
00117 };
00118
00119
00129 class NPlasmaBfieldSuppression : public CallbackFunctorD_V {
00130
00131 double _phi;
00132 const ScalarField &_epot;
00134 public:
00135
00138 NPlasmaBfieldSuppression( const ScalarField &epot, double phi )
00139 : _phi(phi), _epot(epot) {}
00140
00143 ~NPlasmaBfieldSuppression() {}
00144
00147 virtual double operator()( const Vec3D &x ) const {
00148 if( _epot( x ) < _phi )
00149 return( 0.0 );
00150 return( 1.0 );
00151 }
00152 };
00153
00154
00155
00156
00157
00158
00159
00167 class ParticleDataBase {
00168
00169 class ParticleDataBaseImp *_imp;
00170
00171 protected:
00172
00173
00174
00175
00176
00179 ParticleDataBase();
00180
00183 ParticleDataBase( const ParticleDataBase &pdb );
00184
00187 const ParticleDataBase &operator=( const ParticleDataBase &pdb );
00188
00193 void set_implementation_pointer( class ParticleDataBaseImp *imp );
00194
00195 public:
00196
00197
00198
00199
00200
00203 virtual ~ParticleDataBase();
00204
00205
00206
00207
00208
00214 void set_thread_count( uint32_t threadcount ) {}
00215
00221 void set_accuracy( double epsabs, double epsrel );
00222
00232 void set_bfield_suppression( const CallbackFunctorD_V *functor );
00233
00236 void set_trajectory_handler_callback( const TrajectoryHandlerCallback *thand_cb );
00237
00240 void set_trajectory_end_callback( const TrajectoryEndCallback *tend_cb );
00241
00246 void set_polyint( bool polyint );
00247
00253 bool get_polyint( void ) const;
00254
00259 void set_max_steps( uint32_t maxsteps );
00260
00265 void set_max_time( double maxt );
00266
00275 void set_save_trajectories( uint32_t div );
00276
00283 uint32_t get_save_trajectories( void ) const;
00284
00293 void set_mirror( const bool mirror[6] );
00294
00301 void get_mirror( bool mirror[6] ) const;
00302
00305 int get_iteration_number( void ) const;
00306
00320 double get_rhosum( void ) const;
00321
00324 void set_rhosum( double rhosum );
00325
00328 const ParticleStatistics &get_statistics( void ) const;
00329
00330
00331
00332
00333
00336 geom_mode_e geom_mode() const;
00337
00340 size_t size( void ) const;
00341
00344 virtual ParticleBase &particle( uint32_t i ) = 0;
00345
00348 virtual const ParticleBase &particle( uint32_t i ) const = 0;
00349
00352 double traj_length( uint32_t i ) const;
00353
00356 size_t traj_size( uint32_t i ) const;
00357
00360 virtual const ParticlePBase &trajectory_point( uint32_t i, uint32_t j ) const = 0;
00361
00364 void trajectory_point( double &t, Vec3D &loc, Vec3D &vel, uint32_t i, uint32_t j ) const;
00365
00369 void trajectories_at_plane( TrajectoryDiagnosticData &tdata,
00370 coordinate_axis_e axis,
00371 double val,
00372 const std::vector<trajectory_diagnostic_e> &diagnostics ) const;
00373
00378 void build_trajectory_density_field( ScalarField &tdens ) const;
00379
00380
00381
00382
00383
00389 void clear( void );
00390
00396 void clear_trajectories( void );
00397
00403 void clear_trajectory( size_t a );
00404
00405
00406
00407
00408
00411 void reserve( size_t size );
00412
00413
00414
00415
00416
00424 void iterate_trajectories( ScalarField &scharge, const VectorField &efield,
00425 const VectorField &bfield, const Geometry &g );
00426
00433 void step_particles( ScalarField &scharge, const VectorField &efield,
00434 const VectorField &bfield, const Geometry &g, double dt );
00435
00436
00437
00438
00439
00442 virtual void save( const std::string &filename ) const = 0;
00443
00446 virtual void save( std::ostream &s ) const = 0;
00447
00450 virtual void debug_print( std::ostream &os ) const = 0;
00451 };
00452
00453
00465 class ParticleDataBase2D : public ParticleDataBase {
00466
00467 class ParticleDataBase2DImp *_imp;
00468
00469 public:
00470
00471
00472
00473
00474
00477 ParticleDataBase2D();
00478
00481 ParticleDataBase2D( const ParticleDataBase2D &pdb );
00482
00485 ParticleDataBase2D( std::istream &s );
00486
00489 ~ParticleDataBase2D();
00490
00493 const ParticleDataBase2D &operator=( const ParticleDataBase2D &pdb );
00494
00495
00496
00497
00498
00501 virtual Particle2D &particle( uint32_t i );
00502
00505 virtual const Particle2D &particle( uint32_t i ) const;
00506
00509 virtual const ParticleP2D &trajectory_point( uint32_t i, uint32_t j ) const;
00510
00511 using ParticleDataBase::trajectory_point;
00512
00513
00514
00515
00516
00528 void add_particle( double IQ, double q, double m, const ParticleP2D &x );
00529
00534 void add_particle( const Particle2D &p );
00535
00536
00537
00538
00539
00559 void add_2d_beam_with_energy( uint32_t N, double J, double q, double m,
00560 double E, double Tp, double Tt,
00561 double x1, double y1, double x2, double y2 );
00562
00578 void add_2d_beam_with_velocity( uint32_t N, double J, double q, double m,
00579 double v, double dvp, double dvt,
00580 double x1, double y1, double x2, double y2 );
00581
00598 void add_2d_KV_beam_with_emittance( uint32_t N, double I, double q, double m,
00599 double a, double b, double e,
00600 double Ex, double x0, double y0 );
00601
00618 void add_2d_gaussian_beam_with_emittance( uint32_t N, double I, double q, double m,
00619 double a, double b, double e,
00620 double Ex, double x0, double y0 );
00621
00622
00623
00624
00625
00628 virtual void save( const std::string &filename ) const;
00629
00632 virtual void save( std::ostream &s ) const;
00633
00636 virtual void debug_print( std::ostream &os ) const;
00637 };
00638
00639
00640
00641
00653 class ParticleDataBaseCyl : public ParticleDataBase {
00654
00655 class ParticleDataBaseCylImp *_imp;
00656
00657 public:
00658
00659
00660
00661
00662
00665 ParticleDataBaseCyl();
00666
00669 ParticleDataBaseCyl( const ParticleDataBaseCyl &pdb );
00670
00673 ParticleDataBaseCyl( std::istream &s );
00674
00677 ~ParticleDataBaseCyl();
00678
00681 const ParticleDataBaseCyl &operator=( const ParticleDataBaseCyl &pdb );
00682
00683
00684
00685
00686
00689 virtual ParticleCyl &particle( uint32_t i );
00690
00693 virtual const ParticleCyl &particle( uint32_t i ) const;
00694
00697 virtual const ParticlePCyl &trajectory_point( uint32_t i, uint32_t j ) const;
00698
00699 using ParticleDataBase::trajectory_point;
00700
00701
00702
00703
00704
00716 void add_particle( double IQ, double q, double m, const ParticlePCyl &x );
00717
00722 void add_particle( const ParticleCyl &p );
00723
00724
00725
00726
00727
00747 void add_2d_beam_with_energy( uint32_t N, double J, double q, double m,
00748 double E, double Tp, double Tt,
00749 double x1, double y1, double x2, double y2 );
00750
00766 void add_2d_beam_with_velocity( uint32_t N, double J, double q, double m,
00767 double v, double dvp, double dvt,
00768 double x1, double y1, double x2, double y2 );
00769
00772 void add_2d_full_gaussian_beam( uint32_t N, double I, double q, double m,
00773 double Ex, double Tp, double Tt,
00774 double x0, double dr );
00775
00794 void add_2d_gaussian_beam_with_emittance( uint32_t N, double I, double q, double m,
00795 double a, double b, double e,
00796 double Ex, double x0 );
00797
00798
00799
00800
00801
00804 virtual void save( const std::string &filename ) const;
00805
00808 virtual void save( std::ostream &s ) const;
00809
00812 virtual void debug_print( std::ostream &os ) const;
00813 };
00814
00815
00816
00828 class ParticleDataBase3D : public ParticleDataBase {
00829
00830 class ParticleDataBase3DImp *_imp;
00831
00832 public:
00833
00834
00835
00836
00837
00840 ParticleDataBase3D();
00841
00844 ParticleDataBase3D( const ParticleDataBase3D &pdb );
00845
00848 ParticleDataBase3D( std::istream &s );
00849
00852 ~ParticleDataBase3D();
00853
00856 const ParticleDataBase3D &operator=( const ParticleDataBase3D &pdb );
00857
00858
00859
00860
00861
00864 virtual Particle3D &particle( uint32_t i );
00865
00868 virtual const Particle3D &particle( uint32_t i ) const;
00869
00872 virtual const ParticleP3D &trajectory_point( uint32_t i, uint32_t j ) const;
00873
00874 using ParticleDataBase::trajectory_point;
00875
00876
00877
00878
00879
00891 void add_particle( double IQ, double q, double m, const ParticleP3D &x );
00892
00897 void add_particle( const Particle3D &p );
00898
00899
00900
00901
00902
00926 void add_cylindrical_beam_with_energy( uint32_t N, double J, double q, double m,
00927 double E, double Tp, double Tt, Vec3D c,
00928 Vec3D dir1, Vec3D dir2, double r );
00929
00952 void add_cylindrical_beam_with_velocity( uint32_t N, double J, double q, double m,
00953 double v, double dvp, double dvt, Vec3D c,
00954 Vec3D dir1, Vec3D dir2, double r );
00955
00964 void add_rectangular_beam_with_energy( uint32_t N, double J, double q, double m,
00965 double E, double Tp, double Tt, Vec3D c,
00966 Vec3D dir1, Vec3D dir2, double size1, double size2 );
00967
00976 void add_rectangular_beam_with_velocity( uint32_t N, double J, double q, double m,
00977 double v, double dvp, double dvt, Vec3D c,
00978 Vec3D dir1, Vec3D dir2, double size1, double size2 );
00979
00980
00998 void add_3d_KV_beam_with_emittance( uint32_t N, double I, double q, double m,
00999 double ay, double by, double ey,
01000 double az, double bz, double ez,
01001 double Ex, double x0, double y0, double z0 );
01002
01021 void add_3d_gaussian_beam_with_emittance( uint32_t N, double I, double q, double m,
01022 double E0,
01023 double a1, double b1, double e1,
01024 double a2, double b2, double e2,
01025 Vec3D c, Vec3D dir1, Vec3D dir2 );
01026
01027
01028
01029
01030
01031
01032
01050 void trajectories_at_free_plane( TrajectoryDiagnosticData &tdata,
01051 const Vec3D &c, const Vec3D &o, const Vec3D &p,
01052 const std::vector<trajectory_diagnostic_e> &diagnostics ) const;
01053
01054
01076 void export_path_manager_data( std::string filename,
01077 double ref_E, double ref_q, double ref_m,
01078 const Vec3D &c, const Vec3D &o, const Vec3D &p ) const;
01079
01080
01081
01082
01083
01086 virtual void save( const std::string &filename ) const;
01087
01090 virtual void save( std::ostream &s ) const;
01091
01094 virtual void debug_print( std::ostream &os ) const;
01095 };
01096
01097 #endif
01098