43 #ifndef PARTICLEDATABASEIMP_HPP
44 #define PARTICLEDATABASEIMP_HPP 1
100 void save( std::ostream &os )
const;
106 void set_accuracy(
double epsabs,
double epsrel );
116 void set_relativistic(
bool enable );
118 void set_surface_collision(
bool surface_collision );
120 void set_polyint(
bool polyint );
122 bool get_polyint(
void )
const;
132 void set_max_steps( uint32_t maxsteps );
134 void set_max_time(
double maxt );
136 void set_save_all_points(
bool save_points );
138 void set_save_trajectories( uint32_t div );
140 uint32_t get_save_trajectories(
void )
const;
142 void set_mirror(
const bool mirror[6] );
144 void get_mirror(
bool mirror[6] )
const;
146 int get_iteration_number(
void )
const;
148 double get_rhosum(
void )
const;
150 void set_rhosum(
double rhosum );
156 virtual size_t size(
void )
const = 0;
158 virtual size_t traj_size( uint32_t i )
const = 0;
160 virtual double traj_length( uint32_t i )
const = 0;
162 virtual void trajectory_point(
double &t,
Vec3D &loc,
Vec3D &vel, uint32_t i, uint32_t j )
const = 0;
167 const std::vector<trajectory_diagnostic_e> &diagnostics )
const = 0;
169 virtual void clear(
void ) = 0;
171 virtual void clear_trajectories(
void ) = 0;
173 virtual void clear_trajectory(
size_t a ) = 0;
175 virtual void reset_trajectories(
void ) = 0;
177 virtual void reset_trajectory(
size_t a ) = 0;
179 virtual void reserve(
size_t size ) = 0;
181 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const = 0;
189 void debug_print( std::ostream &os )
const;
200 for(
size_t a = 0; a < tdata.
diag_size(); a++ ) {
238 data = x[2]/x[2*crd+2];
242 data = x[4]/x[2*crd+2];
245 data = x[3]*x[5]/x[2*crd+2];
248 data = x[6]/x[2*crd+2];
254 data = (p.
q()/CHARGE_E) / (p.
m()/MASS_U);
257 data = p.
q()/CHARGE_E;
264 double beta = x.velocity().norm2()/SPEED_C;
266 data = 0.5*p.
m()*x.velocity().ssqr()/CHARGE_E;
267 else if( beta >= 1.0 )
270 double gamma = 1.0 / sqrt( 1.0 - beta*beta );
271 double Ek = p.
m()*SPEED_C2*( gamma - 1.0 );
297 if( _geom.
geom_mode() != PP::geom_mode() )
309 for( uint32_t a = 0; a < N; a++ )
321 for(
size_t a = 0; a < pdb.
_particles.size(); a++ )
329 for(
size_t a; a < pdb.
_particles.size(); a++ )
333 for(
size_t a = 0; a < pdb.
_particles.size(); a++ )
342 for(
size_t a = 0; a <
_particles.size(); a++ )
347 return( PP::geom_mode() );
350 virtual size_t size(
void )
const {
362 virtual double traj_length( uint32_t i )
const {
369 for(
size_t b = 1; b < N; b++ ) {
378 virtual size_t traj_size( uint32_t i )
const {
382 const PP &trajectory_point( uint32_t i, uint32_t j )
const {
386 virtual void trajectory_point(
double &t,
Vec3D &loc,
Vec3D &vel, uint32_t i, uint32_t j )
const {
393 virtual void trajectories_at_plane( std::vector<
Particle<PP> > &tdata,
402 switch( PP::geom_mode() ) {
444 std::vector<PP> intsc;
445 for(
size_t a = 0; a <
_particles.size(); a++ ) {
450 for(
size_t b = 1; b < N; b++ ) {
455 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, -1 );
457 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, +1 );
459 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, 0 );
460 for(
size_t c = 0; c < nintsc; c++ ) {
470 ibsimu.
message( 1 ) <<
"number of trajectories = " << tdata.size() <<
"\n";
471 if( PP::geom_mode() ==
MODE_2D )
472 ibsimu.
message( 1 ) <<
"total current = " << Isum <<
" A/m\n";
481 const std::vector<trajectory_diagnostic_e> &diagnostics )
const {
488 switch( PP::geom_mode() ) {
509 for(
size_t a = 0; a < diagnostics.size(); a++ ) {
512 else if( PP::geom_mode() !=
MODE_CYL && (diagnostics[a] ==
DIAG_R ||
515 diagnostics[a] ==
DIAG_W ||
519 else if( PP::geom_mode() !=
MODE_3D && (diagnostics[a] ==
DIAG_Z ||
523 else if( diagnostics[a] ==
DIAG_O ||
526 diagnostics[a] ==
DIAG_P ||
529 diagnostics[a] ==
DIAG_Q ||
532 "use trajectories_at_free_plane()" ) );
537 for(
size_t a = 0; a < diagnostics.size(); a++ ) {
560 std::vector<PP> intsc;
561 for(
size_t a = 0; a <
_particles.size(); a++ ) {
566 for(
size_t b = 1; b < N; b++ ) {
571 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, -1 );
573 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, +1 );
575 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, 0 );
576 for(
size_t c = 0; c < nintsc; c++ ) {
578 add_diagnostics( tdata, intsc[c], *
_particles[a], crd, a );
586 if( PP::geom_mode() ==
MODE_2D )
587 ibsimu.
message( 1 ) <<
"total current = " << Isum <<
" A/m\n";
593 virtual void clear(
void ) {
594 for(
size_t a = 0; a <
_particles.size(); a++ )
600 virtual void clear_trajectories(
void ) {
601 for( uint32_t a = 0; a <
_particles.size(); a++ )
605 virtual void clear_trajectory(
size_t a ) {
611 virtual void reset_trajectories(
void ) {
612 for( uint32_t a = 0; a <
_particles.size(); a++ )
616 virtual void reset_trajectory(
size_t a ) {
622 virtual void reserve(
size_t size ) {
630 }
catch( std::bad_alloc ) {
636 void add_particle(
double IQ,
double q,
double m,
const PP &x ) {
637 add_particle(
Particle<PP>( IQ, CHARGE_E*q, MASS_U*m, x ) );
644 ibsimu.
message( 1 ) <<
"Calculating particle trajectories\n";
658 std::stringstream ss;
660 sp.
print( ss.str() );
664 if( _geom.
geom_mode() != PP::geom_mode() )
681 pthread_mutex_t scharge_mutex = PTHREAD_MUTEX_INITIALIZER;
682 std::vector<ParticleIterator<PP> *> iterators;
688 &scharge_mutex, &efield, &bfield, &_geom ) );
689 iterators[a]->set_trajectory_handler_callback(
_thand_cb );
690 iterators[a]->set_trajectory_end_callback(
_tend_cb,
_pdb );
691 iterators[a]->set_trajectory_surface_collision_callback(
_tsur_cb );
692 iterators[a]->set_bfield_suppression_callback(
_bsup_cb );
703 std::stringstream ss;
706 sp.
print( ss.str() );
715 std::stringstream ss;
718 sp.
print( ss.str(), true );
723 std::vector<Error> err;
724 std::vector<int32_t> part;
737 scharge_finalize_linear( scharge );
747 for(
size_t a = 1; a <=
_stat.number_of_boundaries(); a++ ) {
749 <<
" " << PP::IQ_unit() <<
" (" <<
_stat.bound_collisions(a) <<
" particles)" <<
"\n";
765 void save( std::ostream &os )
const {
767 ParticleDataBaseImp::save( os );
770 for( uint32_t a = 0; a <
_particles.size(); a++ )
775 void debug_print( std::ostream &os )
const {
776 ParticleDataBaseImp::debug_print( os );
778 for( uint32_t a = 0; a <
_particles.size(); a++ ) {
779 os <<
"Particle " << a <<
":\n";
808 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const;
810 void add_2d_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
811 double v,
double dvp,
double dvt,
812 double x1,
double y1,
double x2,
double y2 );
814 void add_2d_beam_with_energy( uint32_t N,
double J,
double q,
double m,
815 double E,
double Tp,
double Tt,
816 double x1,
double y1,
double x2,
double y2 );
818 void add_2d_KV_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
819 double a,
double b,
double e,
820 double Ex,
double x0,
double y0 );
822 void add_2d_gaussian_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
823 double a,
double b,
double e,
824 double Ex,
double x0,
double y0 );
826 void save( std::ostream &os )
const;
828 void debug_print( std::ostream &os )
const;
842 static uint32_t bisect_cumulative_array(
const std::vector<double> &cum,
double x );
856 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const;
858 void add_2d_beam_with_total_energy( uint32_t N,
double J,
double q,
double m,
860 double Tp,
double Tt,
861 double x1,
double y1,
double x2,
double y2 );
863 void add_2d_beam_with_energy( uint32_t N,
double J,
double q,
double m,
864 double E,
double Tp,
double Tt,
865 double x1,
double y1,
double x2,
double y2 );
867 void add_2d_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
868 double v,
double dvp,
double dvt,
869 double x1,
double y1,
double x2,
double y2 );
871 void add_2d_full_gaussian_beam( uint32_t N,
double I,
double q,
double m,
872 double Ex,
double Tp,
double Tt,
873 double x0,
double dr );
875 void add_2d_gaussian_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
876 double a,
double b,
double e,
877 double Ex,
double x0 );
879 void export_path_manager_data(
const std::string &filename,
880 double ref_E,
double ref_q,
double ref_m,
881 double val, uint32_t Np )
const;
883 void save( std::ostream &os )
const;
885 void debug_print( std::ostream &os )
const;
898 bool free_plane_mirror_enabled( uint32_t axism )
const;
912 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const;
914 void add_cylindrical_beam_with_total_energy( uint32_t N,
double J,
double q,
double m,
916 double Tp,
double Tt,
Vec3D c,
919 void add_cylindrical_beam_with_energy( uint32_t N,
double J,
double q,
double m,
920 double E,
double Tp,
double Tt,
Vec3D c,
923 void add_cylindrical_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
924 double v,
double dvp,
double dvt,
Vec3D c,
927 void add_rectangular_beam_with_energy( uint32_t N,
double J,
double q,
double m,
928 double E,
double Tp,
double Tt,
Vec3D c,
929 Vec3D dir1,
Vec3D dir2,
double size1,
double size2 );
931 void add_rectangular_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
932 double v,
double dvp,
double dvt,
Vec3D c,
933 Vec3D dir1,
Vec3D dir2,
double size1,
double size2 );
935 void add_3d_KV_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
937 double a1,
double b1,
double e1,
938 double a2,
double b2,
double e2,
941 void add_3d_waterbag_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
943 double a1,
double b1,
double e1,
944 double a2,
double b2,
double e2,
947 void add_3d_gaussian_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
949 double a1,
double b1,
double e1,
950 double a2,
double b2,
double e2,
955 const std::vector<trajectory_diagnostic_e> &diagnostics )
const;
957 void export_path_manager_data(
const std::string &filename,
958 double ref_E,
double ref_q,
double ref_m,
961 void save( std::ostream &os )
const;
963 void debug_print( std::ostream &os )
const;
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:217
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:218
Particle point class for cylindrical coordinates.
Definition: particles.hpp:274
void inc_indent(void)
Increase message indentation.
Definition: ibsimu.cpp:136
Scheduler class for implementing consumer-producer threading.
Definition: scheduler.hpp:87
Basic error class.
Definition: error.hpp:142
void run(std::vector< Solv * > solv)
Run threads with N solvers.
Definition: scheduler.hpp:467
bool _surface_collision
Surface collision model.
Definition: particledatabaseimp.hpp:78
Vector field.
Definition: vectorfield.hpp:56
uint32_t get_solved_count(void)
Return number of solved problems.
Definition: scheduler.hpp:420
TrajectorySurfaceCollisionCallback * _tsur_cb
Trajectory surface collision callback.
Definition: particledatabaseimp.hpp:83
Q-axis position (m)
Definition: types.hpp:213
scharge_deposition_e _scharge_dep
Space charge deposition type.
Definition: particledatabaseimp.hpp:64
const CallbackFunctorD_V * _bsup_cb
Location dependent magnetic field suppression.
Definition: particledatabaseimp.hpp:80
double _maxt
Maximum particle time in simulation.
Definition: particledatabaseimp.hpp:66
uint32_t _trajdiv
Divisor for saved trajectories, if 3, every third trajectory is saved.
Definition: particledatabaseimp.hpp:68
Particle point class for 3D.
Definition: particles.hpp:458
Bindary file writing and reading tools.
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:221
O-axis position (m)
Definition: types.hpp:209
uint32_t get_problem_count(void)
Return number of problems.
Definition: scheduler.hpp:430
Radial velocity (m/s)
Definition: types.hpp:204
void clear()
Clear all data and diagnostic types.
Definition: trajectorydiagnostics.hpp:154
Particle and particle point objects
TrajectoryEndCallback * _tend_cb
Trajectory collision callback.
Definition: particledatabaseimp.hpp:82
uint32_t _iteration
Iteration number.
Definition: particledatabaseimp.hpp:76
Particle mass (u)
Definition: types.hpp:226
void lock_mutex(void)
Lock mutex for adding problems.
Definition: scheduler.hpp:494
Kinetic energy (eV)
Definition: types.hpp:223
trajectory_interpolation_e _intrp
Trajectory interpolation type.
Definition: particledatabaseimp.hpp:63
geom_mode_e
Geometry mode enum.
Definition: types.hpp:59
ParticleDataBase2D implementation.
Definition: particledatabaseimp.hpp:791
uint32_t number_of_boundaries() const
Return number of boundaries.
Definition: geometry.cpp:285
bool is_error(void)
Return true on errors.
Definition: scheduler.hpp:404
X-axis velocity (m/s)
Definition: types.hpp:200
P-axis velocity (m/s)
Definition: types.hpp:212
Deposition to nodes as a linear function of distance to closet trajectory segment.
Definition: types.hpp:163
2D geometry
Definition: types.hpp:61
A tool for printing running status on command line.
Definition: statusprint.hpp:53
Trajectory end callback.
Definition: particledatabase.hpp:71
void dec_indent(void)
Decrease message indentation.
Definition: ibsimu.cpp:143
bool _mirror[6]
Boundary particle mirroring.
Definition: particledatabaseimp.hpp:70
Particle iterator class for continuous Vlasov-type iteration.
Definition: particleiterator.hpp:280
static double energy_to_velocity(double E, double m)
Convert energy to velocity.
Definition: particledatabaseimp.cpp:125
void add_data(size_t i, double x)
Add data point to i:th diagnostic column.
Definition: trajectorydiagnostics.hpp:212
Scalar field class.
Definition: meshscalarfield.hpp:70
bool wait_finish(void)
Call for solvers to finish when problems are solved.
Definition: scheduler.hpp:528
Y axis.
Definition: types.hpp:172
Scheduler< ParticleIterator< PP >, Particle< PP >, Error > _scheduler
Scheduler for solver.
Definition: particledatabaseimp.hpp:291
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:216
Z-axis position (m)
Definition: types.hpp:207
ParticleStatistics _stat
Particle statistics.
Definition: particledatabaseimp.hpp:74
Trajectory handler callback.
Definition: particledatabase.hpp:58
std::ostream & message(message_type_e type, int32_t level)
Print message output.
Definition: ibsimu.cpp:111
size_t diag_size() const
Return number of data columns.
Definition: trajectorydiagnostics.hpp:166
Geometry defining class.
Definition: geometry.hpp:179
const char * coordinate_axis_string[]
String describing axis names without unit.
Definition: types.cpp:46
#define ERROR_LOCATION
Macro for setting error location when throwing errors.
Definition: error.hpp:72
uint32_t _maxsteps
Maximum number of steps to calculate.
Definition: particledatabaseimp.hpp:65
Y-axis velocity (m/s)
Definition: types.hpp:203
Particle index number. Useful for debugging.
Definition: types.hpp:227
Definition: callback.hpp:61
Time (s)
Definition: types.hpp:198
P-axis position (m)
Definition: types.hpp:211
Class for trajectory diagnostic data.
Definition: trajectorydiagnostics.hpp:127
R axis.
Definition: types.hpp:173
Subroutine for printing running status line on command line.
size_t traj_size() const
Return number of trajectories in data.
Definition: trajectorydiagnostics.hpp:172
Tangential velocity (m/s)
Definition: types.hpp:206
X-axis position (m)
Definition: types.hpp:199
ParticleDataBaseCyl implementation.
Definition: particledatabaseimp.hpp:837
Particle class in some geometry.
Definition: particles.hpp:739
void write_int32(std::ostream &s, int32_t value)
Write int32_t value into stream os.
Definition: file.cpp:70
void clear()
Clears the field.
Definition: meshscalarfield.cpp:121
void add_data_column(trajectory_diagnostic_e diag)
Add data column with type diag.
Definition: trajectorydiagnostics.hpp:160
double _epsabs
Absolute error limit for calculation.
Definition: particledatabaseimp.hpp:61
Definition: particledatabaseimp.hpp:56
scharge_deposition_e
Space charge depostition type.
Definition: types.hpp:161
Particle iteration statistics.
Definition: particlestatistics.hpp:57
void scharge_finalize_pic(MeshScalarField &scharge)
Finalize space charge calculation.
Definition: scharge.cpp:64
Particle point class for 2D.
Definition: particles.hpp:102
void print(const std::string &str, bool force=false)
Print str to output.
Definition: statusprint.cpp:66
Error class to use if requested feature is unimplemented.
Definition: error.hpp:218
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:219
const ParticleDataBasePPImp & operator=(const ParticleDataBasePPImp &pdb)
Copy assignment operator.
Definition: particledatabaseimp.hpp:327
IBSimu ibsimu
Global instance of class IBSimu.
Definition: ibsimu.cpp:289
ParticleDataBase * _pdb
Particle database pointer.
Definition: particledatabaseimp.hpp:84
Error class for memory allocation errors.
Definition: error.hpp:185
Radial position (m)
Definition: types.hpp:202
ParticleDataBase3D implementation.
Definition: particledatabaseimp.hpp:893
bool _relativistic
Relativistic particle iteration.
Definition: particledatabaseimp.hpp:77
Timer for cputime and realtime
bool finish(void)
Wait for all problems to be solved.
Definition: scheduler.hpp:556
coordinate_axis_e
Coordinate axis identifier.
Definition: types.hpp:170
Current (I)
Definition: types.hpp:222
Error class for index range checking errors.
Definition: error.hpp:272
double _rhosum
Sum of space charge density in defined beams (C/m3).
Definition: particledatabaseimp.hpp:72
double IQ() const
Return current or charge carried by trajectory or particle cloud [A/C].
Definition: particles.hpp:706
Charge per mass (e/u)
Definition: types.hpp:224
ParticleDataBasePPImp(ParticleDataBase *pdb, const Geometry &geom)
Constructor, using API pdb.
Definition: particledatabaseimp.hpp:295
X axis.
Definition: types.hpp:171
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:215
Y-axis position (m)
Definition: types.hpp:201
TrajectoryHandlerCallback * _thand_cb
Trajectory handler callback.
Definition: particledatabaseimp.hpp:81
Particle charge (e)
Definition: types.hpp:225
uint32_t get_thread_count(void)
Get the number of threads used for calculation.
Definition: ibsimu.hpp:203
Z axis.
Definition: types.hpp:174
void stop(void)
Stop timer.
Definition: timer.cpp:61
Cylindrically symmetric geometry.
Definition: types.hpp:62
Z-axis velocity (m/s)
Definition: types.hpp:208
Three dimensional vector.
Definition: vec3d.hpp:58
ParticleDataBasePPImp(const ParticleDataBasePPImp &pdb)
Copy constructor.
Definition: particledatabaseimp.hpp:317
bool output_is_cout()
Return if message output file is stdout.
Definition: ibsimu.cpp:184
double q() const
Return particle charge (q) [C].
Definition: particles.hpp:710
Definition: particledatabaseimp.hpp:193
int32_t read_int32(std::istream &s)
Read int32_t from stream is.
Definition: file.cpp:135
Class for measuring code runtime in cpu time and realtime.
Definition: timer.hpp:54
double _epsrel
Relative error limit for calculation.
Definition: particledatabaseimp.hpp:62
Angular velocity (rad/s)
Definition: types.hpp:205
Dummy diagnostic. Does nothing.
Definition: types.hpp:197
trajectory_diagnostic_e diagnostic(size_t i) const
Return i:th diagnostic type.
Definition: trajectorydiagnostics.hpp:180
Trajectory surface collision callback.
Definition: particledatabase.hpp:86
ParticleDataBasePPImp(ParticleDataBase *pdb, std::istream &s, const Geometry &geom)
Constructor from stream, using API pdb.
Definition: particledatabaseimp.hpp:303
3D geometry
Definition: types.hpp:63
double norm2(const Vector &vec)
Definition: mvector.cpp:474
1D geometry
Definition: types.hpp:60
double m() const
Return particle mass (m) [kg].
Definition: particles.hpp:714
Scalar field.
Definition: scalarfield.hpp:55
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:220
Q-axis velocity (m/s)
Definition: types.hpp:214
geom_mode_e geom_mode(void) const
Returns geometry mode.
Definition: mesh.hpp:108
Particle database base class.
Definition: particledatabase.hpp:191
trajectory_interpolation_e
Trajectory interpolation type.
Definition: types.hpp:153
size_t get_errors(Cont1 &e, Cont2 &pi)
Fetch errors and indices of corresponding problems.
Definition: scheduler.hpp:447
std::vector< Particle< PP > * > _particles
Particles.
Definition: particledatabaseimp.hpp:290
bool _save_points
Save all points?
Definition: particledatabaseimp.hpp:67
Ion Beam Simulator global settings.
O-axis velocity (m/s)
Definition: types.hpp:210
void unlock_mutex(void)
Unlock mutex.
Definition: scheduler.hpp:502