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 reserve(
size_t size ) = 0;
177 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const = 0;
185 void debug_print( std::ostream &os )
const;
196 for(
size_t a = 0; a < tdata.
diag_size(); a++ ) {
234 data = x[2]/x[2*crd+2];
238 data = x[4]/x[2*crd+2];
241 data = x[3]*x[5]/x[2*crd+2];
244 data = x[6]/x[2*crd+2];
250 data = (p.
q()/CHARGE_E) / (p.
m()/MASS_U);
253 data = p.
q()/CHARGE_E;
260 double beta = x.velocity().norm2()/SPEED_C;
262 data = 0.5*p.
m()*x.velocity().ssqr()/CHARGE_E;
263 else if( beta >= 1.0 )
266 double gamma = 1.0 / sqrt( 1.0 - beta*beta );
267 double Ek = p.
m()*SPEED_C2*( gamma - 1.0 );
293 if( _geom.
geom_mode() != PP::geom_mode() )
305 for( uint32_t a = 0; a < N; a++ )
317 for(
size_t a = 0; a < pdb.
_particles.size(); a++ )
325 for(
size_t a; a < pdb.
_particles.size(); a++ )
329 for(
size_t a = 0; a < pdb.
_particles.size(); a++ )
338 for(
size_t a = 0; a <
_particles.size(); a++ )
343 return( PP::geom_mode() );
346 virtual size_t size(
void )
const {
358 virtual double traj_length( uint32_t i )
const {
365 for(
size_t b = 1; b < N; b++ ) {
374 virtual size_t traj_size( uint32_t i )
const {
378 const PP &trajectory_point( uint32_t i, uint32_t j )
const {
382 virtual void trajectory_point(
double &t,
Vec3D &loc,
Vec3D &vel, uint32_t i, uint32_t j )
const {
389 virtual void trajectories_at_plane( std::vector<
Particle<PP> > &tdata,
398 switch( PP::geom_mode() ) {
440 std::vector<PP> intsc;
441 for(
size_t a = 0; a <
_particles.size(); a++ ) {
446 for(
size_t b = 1; b < N; b++ ) {
451 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, -1 );
453 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, +1 );
455 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, 0 );
456 for(
size_t c = 0; c < nintsc; c++ ) {
466 ibsimu.
message( 1 ) <<
"number of trajectories = " << tdata.size() <<
"\n";
467 if( PP::geom_mode() ==
MODE_2D )
468 ibsimu.
message( 1 ) <<
"total current = " << Isum <<
" A/m\n";
477 const std::vector<trajectory_diagnostic_e> &diagnostics )
const {
484 switch( PP::geom_mode() ) {
505 for(
size_t a = 0; a < diagnostics.size(); a++ ) {
508 else if( PP::geom_mode() !=
MODE_CYL && (diagnostics[a] ==
DIAG_R ||
511 diagnostics[a] ==
DIAG_W ||
515 else if( PP::geom_mode() !=
MODE_3D && (diagnostics[a] ==
DIAG_Z ||
519 else if( diagnostics[a] ==
DIAG_O ||
522 diagnostics[a] ==
DIAG_P ||
525 diagnostics[a] ==
DIAG_Q ||
528 "use trajectories_at_free_plane()" ) );
533 for(
size_t a = 0; a < diagnostics.size(); a++ ) {
556 std::vector<PP> intsc;
557 for(
size_t a = 0; a <
_particles.size(); a++ ) {
562 for(
size_t b = 1; b < N; b++ ) {
567 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, -1 );
569 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, +1 );
571 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, 0 );
572 for(
size_t c = 0; c < nintsc; c++ ) {
574 add_diagnostics( tdata, intsc[c], *
_particles[a], crd, a );
582 if( PP::geom_mode() ==
MODE_2D )
583 ibsimu.
message( 1 ) <<
"total current = " << Isum <<
" A/m\n";
589 virtual void clear(
void ) {
590 for(
size_t a = 0; a <
_particles.size(); a++ )
596 virtual void clear_trajectories(
void ) {
597 for( uint32_t a = 0; a <
_particles.size(); a++ )
601 virtual void clear_trajectory(
size_t a ) {
607 virtual void reserve(
size_t size ) {
615 }
catch( std::bad_alloc ) {
621 void add_particle(
double IQ,
double q,
double m,
const PP &x ) {
622 add_particle(
Particle<PP>( IQ, CHARGE_E*q, MASS_U*m, x ) );
629 ibsimu.
message( 1 ) <<
"Calculating particle trajectories\n";
643 std::stringstream ss;
645 sp.
print( ss.str() );
649 if( _geom.
geom_mode() != PP::geom_mode() )
666 pthread_mutex_t scharge_mutex = PTHREAD_MUTEX_INITIALIZER;
667 std::vector<ParticleIterator<PP> *> iterators;
673 &scharge_mutex, &efield, &bfield, &_geom ) );
674 iterators[a]->set_trajectory_handler_callback(
_thand_cb );
675 iterators[a]->set_trajectory_end_callback(
_tend_cb,
_pdb );
676 iterators[a]->set_trajectory_surface_collision_callback(
_tsur_cb );
677 iterators[a]->set_bfield_suppression_callback(
_bsup_cb );
688 std::stringstream ss;
691 sp.
print( ss.str() );
700 std::stringstream ss;
703 sp.
print( ss.str(), true );
708 std::vector<Error> err;
709 std::vector<int32_t> part;
722 scharge_finalize_linear( scharge );
732 for(
size_t a = 1; a <=
_stat.number_of_boundaries(); a++ ) {
734 <<
" " << PP::IQ_unit() <<
" (" <<
_stat.bound_collisions(a) <<
" particles)" <<
"\n";
750 void save( std::ostream &os )
const {
752 ParticleDataBaseImp::save( os );
755 for( uint32_t a = 0; a <
_particles.size(); a++ )
760 void debug_print( std::ostream &os )
const {
761 ParticleDataBaseImp::debug_print( os );
763 for( uint32_t a = 0; a <
_particles.size(); a++ ) {
764 os <<
"Particle " << a <<
":\n";
793 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const;
795 void add_2d_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
796 double v,
double dvp,
double dvt,
797 double x1,
double y1,
double x2,
double y2 );
799 void add_2d_beam_with_energy( uint32_t N,
double J,
double q,
double m,
800 double E,
double Tp,
double Tt,
801 double x1,
double y1,
double x2,
double y2 );
803 void add_2d_KV_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
804 double a,
double b,
double e,
805 double Ex,
double x0,
double y0 );
807 void add_2d_gaussian_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
808 double a,
double b,
double e,
809 double Ex,
double x0,
double y0 );
811 void save( std::ostream &os )
const;
813 void debug_print( std::ostream &os )
const;
827 static uint32_t bisect_cumulative_array(
const std::vector<double> &cum,
double x );
841 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const;
843 void add_2d_beam_with_total_energy( uint32_t N,
double J,
double q,
double m,
845 double Tp,
double Tt,
846 double x1,
double y1,
double x2,
double y2 );
848 void add_2d_beam_with_energy( uint32_t N,
double J,
double q,
double m,
849 double E,
double Tp,
double Tt,
850 double x1,
double y1,
double x2,
double y2 );
852 void add_2d_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
853 double v,
double dvp,
double dvt,
854 double x1,
double y1,
double x2,
double y2 );
856 void add_2d_full_gaussian_beam( uint32_t N,
double I,
double q,
double m,
857 double Ex,
double Tp,
double Tt,
858 double x0,
double dr );
860 void add_2d_gaussian_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
861 double a,
double b,
double e,
862 double Ex,
double x0 );
864 void export_path_manager_data(
const std::string &filename,
865 double ref_E,
double ref_q,
double ref_m,
866 double val, uint32_t Np )
const;
868 void save( std::ostream &os )
const;
870 void debug_print( std::ostream &os )
const;
883 bool free_plane_mirror_enabled( uint32_t axism )
const;
897 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const;
899 void add_cylindrical_beam_with_total_energy( uint32_t N,
double J,
double q,
double m,
901 double Tp,
double Tt,
Vec3D c,
904 void add_cylindrical_beam_with_energy( uint32_t N,
double J,
double q,
double m,
905 double E,
double Tp,
double Tt,
Vec3D c,
908 void add_cylindrical_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
909 double v,
double dvp,
double dvt,
Vec3D c,
912 void add_rectangular_beam_with_energy( uint32_t N,
double J,
double q,
double m,
913 double E,
double Tp,
double Tt,
Vec3D c,
914 Vec3D dir1,
Vec3D dir2,
double size1,
double size2 );
916 void add_rectangular_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
917 double v,
double dvp,
double dvt,
Vec3D c,
918 Vec3D dir1,
Vec3D dir2,
double size1,
double size2 );
920 void add_3d_KV_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
922 double a1,
double b1,
double e1,
923 double a2,
double b2,
double e2,
926 void add_3d_waterbag_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
928 double a1,
double b1,
double e1,
929 double a2,
double b2,
double e2,
932 void add_3d_gaussian_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
934 double a1,
double b1,
double e1,
935 double a2,
double b2,
double e2,
940 const std::vector<trajectory_diagnostic_e> &diagnostics )
const;
942 void export_path_manager_data(
const std::string &filename,
943 double ref_E,
double ref_q,
double ref_m,
946 void save( std::ostream &os )
const;
948 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:776
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:118
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:287
, 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:822
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:323
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:878
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:291
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:313
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:189
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:299
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:286
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