43 #ifndef PARTICLEDATABASEIMP_HPP
44 #define PARTICLEDATABASEIMP_HPP 1
101 void save( std::ostream &os )
const;
107 void set_accuracy(
double epsabs,
double epsrel );
117 void set_relativistic(
bool enable );
119 void set_surface_collision(
bool surface_collision );
121 void set_polyint(
bool polyint );
123 bool get_polyint(
void )
const;
133 void set_max_steps( uint32_t maxsteps );
135 void set_max_time(
double maxt );
137 void set_save_all_points(
bool save_points );
139 void set_save_trajectories( uint32_t div );
141 uint32_t get_save_trajectories(
void )
const;
143 void set_mirror(
const bool mirror[6] );
145 void get_mirror(
bool mirror[6] )
const;
147 int get_iteration_number(
void )
const;
149 double get_rhosum(
void )
const;
151 void set_rhosum(
double rhosum );
157 virtual size_t size(
void )
const = 0;
159 virtual size_t traj_size( uint32_t i )
const = 0;
161 virtual double traj_length( uint32_t i )
const = 0;
163 virtual void trajectory_point(
double &t,
Vec3D &loc,
Vec3D &vel, uint32_t i, uint32_t j )
const = 0;
168 const std::vector<trajectory_diagnostic_e> &diagnostics )
const = 0;
170 virtual void clear(
void ) = 0;
172 virtual void clear_trajectories(
void ) = 0;
174 virtual void clear_trajectory(
size_t a ) = 0;
176 virtual void reset_trajectories(
void ) = 0;
178 virtual void reset_trajectory(
size_t a ) = 0;
180 virtual void reserve(
size_t size ) = 0;
182 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const = 0;
190 void debug_print( std::ostream &os )
const;
201 for(
size_t a = 0; a < tdata.
diag_size(); a++ ) {
239 data = x[2]/x[2*crd+2];
243 data = x[4]/x[2*crd+2];
246 data = x[3]*x[5]/x[2*crd+2];
249 data = x[6]/x[2*crd+2];
255 data = (p.
q()/CHARGE_E) / (p.
m()/MASS_U);
258 data = p.
q()/CHARGE_E;
265 double beta = x.velocity().norm2()/SPEED_C;
267 data = 0.5*p.
m()*x.velocity().ssqr()/CHARGE_E;
268 else if( beta >= 1.0 )
271 double gamma = 1.0 / sqrt( 1.0 - beta*beta );
272 double Ek = p.
m()*SPEED_C2*( gamma - 1.0 );
298 if( _geom.
geom_mode() != PP::geom_mode() )
310 for( uint32_t a = 0; a < N; a++ )
322 for(
size_t a = 0; a < pdb.
_particles.size(); a++ )
330 for(
size_t a; a < pdb.
_particles.size(); a++ )
334 for(
size_t a = 0; a < pdb.
_particles.size(); a++ )
343 for(
size_t a = 0; a <
_particles.size(); a++ )
348 return( PP::geom_mode() );
351 virtual size_t size(
void )
const {
363 virtual double traj_length( uint32_t i )
const {
370 for(
size_t b = 1; b < N; b++ ) {
379 virtual size_t traj_size( uint32_t i )
const {
383 const PP &trajectory_point( uint32_t i, uint32_t j )
const {
387 virtual void trajectory_point(
double &t,
Vec3D &loc,
Vec3D &vel, uint32_t i, uint32_t j )
const {
394 virtual void trajectories_at_plane( std::vector<
Particle<PP> > &tdata,
403 switch( PP::geom_mode() ) {
445 std::vector<PP> intsc;
446 for(
size_t a = 0; a <
_particles.size(); a++ ) {
451 for(
size_t b = 1; b < N; b++ ) {
456 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, -1 );
458 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, +1 );
460 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, 0 );
461 for(
size_t c = 0; c < nintsc; c++ ) {
471 ibsimu.
message( 1 ) <<
"number of trajectories = " << tdata.size() <<
"\n";
472 if( PP::geom_mode() ==
MODE_2D )
473 ibsimu.
message( 1 ) <<
"total current = " << Isum <<
" A/m\n";
482 const std::vector<trajectory_diagnostic_e> &diagnostics )
const {
489 switch( PP::geom_mode() ) {
510 for(
size_t a = 0; a < diagnostics.size(); a++ ) {
513 else if( PP::geom_mode() !=
MODE_CYL && (diagnostics[a] ==
DIAG_R ||
516 diagnostics[a] ==
DIAG_W ||
520 else if( PP::geom_mode() !=
MODE_3D && (diagnostics[a] ==
DIAG_Z ||
524 else if( diagnostics[a] ==
DIAG_O ||
527 diagnostics[a] ==
DIAG_P ||
530 diagnostics[a] ==
DIAG_Q ||
533 "use trajectories_at_free_plane()" ) );
538 for(
size_t a = 0; a < diagnostics.size(); a++ ) {
561 std::vector<PP> intsc;
562 for(
size_t a = 0; a <
_particles.size(); a++ ) {
567 for(
size_t b = 1; b < N; b++ ) {
572 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, -1 );
574 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, +1 );
576 nintsc = PP::trajectory_intersections_at_plane( intsc, crd, val, x1, x2, 0 );
577 for(
size_t c = 0; c < nintsc; c++ ) {
579 add_diagnostics( tdata, intsc[c], *
_particles[a], crd, a );
587 if( PP::geom_mode() ==
MODE_2D )
588 ibsimu.
message( 1 ) <<
"total current = " << Isum <<
" A/m\n";
594 virtual void clear(
void ) {
595 for(
size_t a = 0; a <
_particles.size(); a++ )
601 virtual void clear_trajectories(
void ) {
602 for( uint32_t a = 0; a <
_particles.size(); a++ )
606 virtual void clear_trajectory(
size_t a ) {
612 virtual void reset_trajectories(
void ) {
613 for( uint32_t a = 0; a <
_particles.size(); a++ )
617 virtual void reset_trajectory(
size_t a ) {
623 virtual void reserve(
size_t size ) {
631 }
catch(
const std::bad_alloc & ) {
637 void add_particle(
double IQ,
double q,
double m,
const PP &x ) {
638 add_particle(
Particle<PP>( IQ, CHARGE_E*q, MASS_U*m, x ) );
645 ibsimu.
message( 1 ) <<
"Calculating particle trajectories\n";
659 std::stringstream ss;
661 sp.
print( ss.str() );
665 if( _geom.
geom_mode() != PP::geom_mode() )
667 if( _geom != scharge )
684 pthread_mutex_t scharge_mutex = PTHREAD_MUTEX_INITIALIZER;
685 std::vector<ParticleIterator<PP> *> iterators;
691 &scharge_mutex, &efield, &bfield, &_geom ) );
692 iterators[a]->set_trajectory_handler_callback(
_thand_cb );
693 iterators[a]->set_trajectory_end_callback(
_tend_cb,
_pdb );
694 iterators[a]->set_trajectory_surface_collision_callback(
_tsur_cb );
695 iterators[a]->set_bfield_suppression_callback(
_bsup_cb );
706 std::stringstream ss;
709 sp.
print( ss.str() );
718 std::stringstream ss;
721 sp.
print( ss.str(),
true );
726 std::vector<Error> err;
727 std::vector<int32_t> part;
740 scharge_finalize_linear( scharge );
750 for(
size_t a = 1; a <=
_stat.number_of_boundaries(); a++ ) {
752 <<
" " << PP::IQ_unit() <<
" (" <<
_stat.bound_collisions(a) <<
" particles)" <<
"\n";
774 &efield, &bfield, &_geom );
775 for( uint32_t a = 0; a <
_particles.size(); a++ ) {
782 scharge_finalize_step_pic( scharge );
790 void save( std::ostream &os )
const {
792 ParticleDataBaseImp::save( os );
795 for( uint32_t a = 0; a <
_particles.size(); a++ )
800 void debug_print( std::ostream &os )
const {
801 ParticleDataBaseImp::debug_print( os );
803 for( uint32_t a = 0; a <
_particles.size(); a++ ) {
804 os <<
"Particle " << a <<
":\n";
833 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const;
835 void add_2d_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
836 double v,
double dvp,
double dvt,
837 double x1,
double y1,
double x2,
double y2 );
839 void add_2d_beam_with_energy( uint32_t N,
double J,
double q,
double m,
840 double E,
double Tp,
double Tt,
841 double x1,
double y1,
double x2,
double y2 );
843 void add_2d_KV_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
844 double a,
double b,
double e,
845 double Ex,
double x0,
double y0 );
847 void add_2d_gaussian_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
848 double a,
double b,
double e,
849 double Ex,
double x0,
double y0 );
851 void save( std::ostream &os )
const;
853 void debug_print( std::ostream &os )
const;
867 static uint32_t bisect_cumulative_array(
const std::vector<double> &cum,
double x );
881 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const;
883 void add_2d_beam_with_total_energy( uint32_t N,
double J,
double q,
double m,
885 double Tp,
double Tt,
886 double x1,
double y1,
double x2,
double y2 );
888 void add_2d_beam_with_energy( uint32_t N,
double J,
double q,
double m,
889 double E,
double Tp,
double Tt,
890 double x1,
double y1,
double x2,
double y2 );
892 void add_2d_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
893 double v,
double dvp,
double dvt,
894 double x1,
double y1,
double x2,
double y2 );
896 void add_2d_full_gaussian_beam( uint32_t N,
double I,
double q,
double m,
897 double Ex,
double Tp,
double Tt,
898 double x0,
double dr );
900 void add_2d_gaussian_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
901 double a,
double b,
double e,
902 double Ex,
double x0 );
904 void export_path_manager_data(
const std::string &filename,
905 double ref_E,
double ref_q,
double ref_m,
906 double val, uint32_t Np )
const;
908 void save( std::ostream &os )
const;
910 void debug_print( std::ostream &os )
const;
923 bool free_plane_mirror_enabled( uint32_t axism )
const;
937 virtual void build_trajectory_density_field(
MeshScalarField &tdens )
const;
939 void add_cylindrical_beam_with_total_energy( uint32_t N,
double J,
double q,
double m,
941 double Tp,
double Tt,
Vec3D c,
944 void add_cylindrical_beam_with_energy( uint32_t N,
double J,
double q,
double m,
945 double E,
double Tp,
double Tt,
Vec3D c,
948 void add_cylindrical_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
949 double v,
double dvp,
double dvt,
Vec3D c,
952 void add_rectangular_beam_with_energy( uint32_t N,
double J,
double q,
double m,
953 double E,
double Tp,
double Tt,
Vec3D c,
954 Vec3D dir1,
Vec3D dir2,
double size1,
double size2 );
956 void add_rectangular_beam_with_velocity( uint32_t N,
double J,
double q,
double m,
957 double v,
double dvp,
double dvt,
Vec3D c,
958 Vec3D dir1,
Vec3D dir2,
double size1,
double size2 );
960 void add_3d_KV_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
962 double a1,
double b1,
double e1,
963 double a2,
double b2,
double e2,
966 void add_3d_waterbag_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
968 double a1,
double b1,
double e1,
969 double a2,
double b2,
double e2,
972 void add_3d_gaussian_beam_with_emittance( uint32_t N,
double I,
double q,
double m,
974 double a1,
double b1,
double e1,
975 double a2,
double b2,
double e2,
980 const std::vector<trajectory_diagnostic_e> &diagnostics )
const;
982 void export_path_manager_data(
const std::string &filename,
983 double ref_E,
double ref_q,
double ref_m,
986 void save( std::ostream &os )
const;
988 void debug_print( std::ostream &os )
const;
Definition: callback.hpp:61
Error class for memory allocation errors.
Definition: error.hpp:196
Error class for index range checking errors.
Definition: error.hpp:283
Error class to use if requested feature is unimplemented.
Definition: error.hpp:229
Basic error class.
Definition: error.hpp:153
Geometry defining class.
Definition: geometry.hpp:180
uint32_t number_of_boundaries() const
Return number of boundaries.
Definition: geometry.cpp:287
uint32_t get_thread_count(void)
Get the number of threads used for calculation.
Definition: ibsimu.hpp:203
void dec_indent(void)
Decrease message indentation.
Definition: ibsimu.cpp:143
bool output_is_cout()
Return if message output file is stdout.
Definition: ibsimu.cpp:184
std::ostream & message(message_type_e type, int32_t level)
Print message output.
Definition: ibsimu.cpp:111
void inc_indent(void)
Increase message indentation.
Definition: ibsimu.cpp:136
Scalar field class.
Definition: meshscalarfield.hpp:70
void clear()
Clears the field.
Definition: meshscalarfield.cpp:121
geom_mode_e geom_mode(void) const
Returns geometry mode.
Definition: mesh.hpp:108
double q() const
Return particle charge (q) [C].
Definition: particles.hpp:710
double m() const
Return particle mass (m) [kg].
Definition: particles.hpp:714
double IQ() const
Return current or charge carried by trajectory or particle cloud [A/C].
Definition: particles.hpp:706
ParticleDataBase2D implementation.
Definition: particledatabaseimp.hpp:816
ParticleDataBase3D implementation.
Definition: particledatabaseimp.hpp:918
ParticleDataBaseCyl implementation.
Definition: particledatabaseimp.hpp:862
Definition: particledatabaseimp.hpp:57
double _epsrel
Relative error limit for calculation.
Definition: particledatabaseimp.hpp:63
bool _save_points
Save all points?
Definition: particledatabaseimp.hpp:68
scharge_deposition_e _scharge_dep
Space charge deposition type.
Definition: particledatabaseimp.hpp:65
bool _surface_collision
Surface collision model.
Definition: particledatabaseimp.hpp:79
uint32_t _trajdiv
Divisor for saved trajectories, if 3, every third trajectory is saved.
Definition: particledatabaseimp.hpp:69
ParticleStatistics _stat
Particle statistics.
Definition: particledatabaseimp.hpp:75
uint32_t _iteration
Iteration number.
Definition: particledatabaseimp.hpp:77
bool _mirror[6]
Boundary particle mirroring.
Definition: particledatabaseimp.hpp:71
static double energy_to_velocity(double E, double m)
Convert energy to velocity.
Definition: particledatabaseimp.cpp:125
trajectory_interpolation_e _intrp
Trajectory interpolation type.
Definition: particledatabaseimp.hpp:64
double _rhosum
Sum of space charge density in defined beams (C/m3).
Definition: particledatabaseimp.hpp:73
ParticleDataBase * _pdb
Particle database pointer.
Definition: particledatabaseimp.hpp:85
const CallbackFunctorD_V * _bsup_cb
Location dependent magnetic field suppression.
Definition: particledatabaseimp.hpp:81
double _maxt
Maximum particle time in simulation.
Definition: particledatabaseimp.hpp:67
TrajectoryHandlerCallback * _thand_cb
Trajectory handler callback.
Definition: particledatabaseimp.hpp:82
TrajectorySurfaceCollisionCallback * _tsur_cb
Trajectory surface collision callback.
Definition: particledatabaseimp.hpp:84
bool _relativistic
Relativistic particle iteration.
Definition: particledatabaseimp.hpp:78
double _epsabs
Absolute error limit for calculation.
Definition: particledatabaseimp.hpp:62
uint32_t _maxsteps
Maximum number of steps to calculate.
Definition: particledatabaseimp.hpp:66
TrajectoryEndCallback * _tend_cb
Trajectory collision callback.
Definition: particledatabaseimp.hpp:83
Definition: particledatabaseimp.hpp:194
std::vector< Particle< PP > * > _particles
Particles.
Definition: particledatabaseimp.hpp:291
ParticleDataBasePPImp(ParticleDataBase *pdb, std::istream &s, const Geometry &geom)
Constructor from stream, using API pdb.
Definition: particledatabaseimp.hpp:304
ParticleDataBasePPImp(const ParticleDataBasePPImp &pdb)
Copy constructor.
Definition: particledatabaseimp.hpp:318
ParticleDataBasePPImp(ParticleDataBase *pdb, const Geometry &geom)
Constructor, using API pdb.
Definition: particledatabaseimp.hpp:296
Scheduler< ParticleIterator< PP >, Particle< PP >, Error > _scheduler
Scheduler for solver.
Definition: particledatabaseimp.hpp:292
const ParticleDataBasePPImp & operator=(const ParticleDataBasePPImp &pdb)
Copy assignment operator.
Definition: particledatabaseimp.hpp:328
Particle database base class.
Definition: particledatabase.hpp:191
Particle iterator class for continuous Vlasov-type iteration.
Definition: particleiterator.hpp:280
Particle point class for 2D.
Definition: particles.hpp:103
Particle point class for 3D.
Definition: particles.hpp:459
Particle point class for cylindrical coordinates.
Definition: particles.hpp:275
Particle iteration statistics.
Definition: particlestatistics.hpp:57
Definition: particlestepper.hpp:56
Particle class in some geometry.
Definition: particles.hpp:740
Scalar field.
Definition: scalarfield.hpp:55
Scheduler class for implementing consumer-producer threading.
Definition: scheduler.hpp:87
size_t get_errors(Cont1 &e, Cont2 &pi)
Fetch errors and indices of corresponding problems.
Definition: scheduler.hpp:447
void unlock_mutex(void)
Unlock mutex.
Definition: scheduler.hpp:502
uint32_t get_problem_count(void)
Return number of problems.
Definition: scheduler.hpp:430
uint32_t get_solved_count(void)
Return number of solved problems.
Definition: scheduler.hpp:420
bool is_error(void)
Return true on errors.
Definition: scheduler.hpp:404
bool finish(void)
Wait for all problems to be solved.
Definition: scheduler.hpp:556
void lock_mutex(void)
Lock mutex for adding problems.
Definition: scheduler.hpp:494
void run(std::vector< Solv * > solv)
Run threads with N solvers.
Definition: scheduler.hpp:467
bool wait_finish(void)
Call for solvers to finish when problems are solved.
Definition: scheduler.hpp:528
A tool for printing running status on command line.
Definition: statusprint.hpp:53
void print(const std::string &str, bool force=false)
Print str to output.
Definition: statusprint.cpp:66
Class for measuring code runtime in cpu time and realtime.
Definition: timer.hpp:54
void stop(void)
Stop timer.
Definition: timer.cpp:61
Class for trajectory diagnostic data.
Definition: trajectorydiagnostics.hpp:129
void add_data(size_t i, double x)
Add data point to i:th diagnostic column.
Definition: trajectorydiagnostics.hpp:221
void clear()
Clear all data and diagnostic types.
Definition: trajectorydiagnostics.hpp:155
size_t traj_size() const
Return number of trajectories in data.
Definition: trajectorydiagnostics.hpp:173
trajectory_diagnostic_e diagnostic(size_t i) const
Return i:th diagnostic type.
Definition: trajectorydiagnostics.hpp:181
void add_data_column(trajectory_diagnostic_e diag)
Add data column with type diag.
Definition: trajectorydiagnostics.hpp:161
size_t diag_size() const
Return number of data columns.
Definition: trajectorydiagnostics.hpp:167
Trajectory end callback.
Definition: particledatabase.hpp:71
Trajectory handler callback.
Definition: particledatabase.hpp:58
Trajectory surface collision callback.
Definition: particledatabase.hpp:86
Three dimensional vector.
Definition: vec3d.hpp:58
Vector field.
Definition: vectorfield.hpp:56
#define ERROR_LOCATION
Macro for setting error location when throwing errors.
Definition: error.hpp:83
void write_int32(std::ostream &s, int32_t value)
Write int32_t value into stream os.
Definition: file.cpp:70
int32_t read_int32(std::istream &s)
Read int32_t from stream is.
Definition: file.cpp:135
Bindary file writing and reading tools.
IBSimu ibsimu
Global instance of class IBSimu.
Definition: ibsimu.cpp:289
Ion Beam Simulator global settings.
double norm2(const Vector &vec)
Definition: mvector.cpp:474
Particle and particle point objects
Particle stepper using Boris leap-frog
void scharge_finalize_pic(MeshScalarField &scharge)
Finalize space charge calculation.
Definition: scharge.cpp:64
Subroutine for printing running status line on command line.
Timer for cputime and realtime
const char * coordinate_axis_string[]
String describing axis names without unit.
Definition: types.cpp:46
trajectory_interpolation_e
Trajectory interpolation type.
Definition: types.hpp:153
coordinate_axis_e
Coordinate axis identifier.
Definition: types.hpp:170
@ AXIS_R
R axis.
Definition: types.hpp:173
@ AXIS_X
X axis.
Definition: types.hpp:171
@ AXIS_Y
Y axis.
Definition: types.hpp:172
@ AXIS_Z
Z axis.
Definition: types.hpp:174
geom_mode_e
Geometry mode enum.
Definition: types.hpp:59
@ MODE_3D
3D geometry
Definition: types.hpp:63
@ MODE_1D
1D geometry
Definition: types.hpp:60
@ MODE_CYL
Cylindrically symmetric geometry.
Definition: types.hpp:62
@ MODE_2D
2D geometry
Definition: types.hpp:61
scharge_deposition_e
Space charge depostition type.
Definition: types.hpp:161
@ SCHARGE_DEPOSITION_LINEAR
Deposition to nodes as a linear function of distance to closet trajectory segment.
Definition: types.hpp:163
@ DIAG_R
Radial position (m)
Definition: types.hpp:202
@ DIAG_Y
Y-axis position (m)
Definition: types.hpp:201
@ DIAG_OP
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:220
@ DIAG_O
O-axis position (m)
Definition: types.hpp:209
@ DIAG_VQ
Q-axis velocity (m/s)
Definition: types.hpp:214
@ DIAG_CHARGE
Particle charge (e)
Definition: types.hpp:225
@ DIAG_NONE
Dummy diagnostic. Does nothing.
Definition: types.hpp:197
@ DIAG_XP
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:215
@ DIAG_VO
O-axis velocity (m/s)
Definition: types.hpp:210
@ DIAG_VZ
Z-axis velocity (m/s)
Definition: types.hpp:208
@ DIAG_VR
Radial velocity (m/s)
Definition: types.hpp:204
@ DIAG_EK
Kinetic energy (eV)
Definition: types.hpp:223
@ DIAG_P
P-axis position (m)
Definition: types.hpp:211
@ DIAG_MASS
Particle mass (u)
Definition: types.hpp:226
@ DIAG_PP
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:221
@ DIAG_Z
Z-axis position (m)
Definition: types.hpp:207
@ DIAG_X
X-axis position (m)
Definition: types.hpp:199
@ DIAG_VTHETA
Tangential velocity (m/s)
Definition: types.hpp:206
@ DIAG_CURR
Current (I)
Definition: types.hpp:222
@ DIAG_VY
Y-axis velocity (m/s)
Definition: types.hpp:203
@ DIAG_W
Angular velocity (rad/s)
Definition: types.hpp:205
@ DIAG_YP
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:216
@ DIAG_Q
Q-axis position (m)
Definition: types.hpp:213
@ DIAG_NO
Particle index number. Useful for debugging.
Definition: types.hpp:227
@ DIAG_ZP
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:219
@ DIAG_RP
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:217
@ DIAG_T
Time (s)
Definition: types.hpp:198
@ DIAG_AP
, where direction q is normal to diagnostic plane (rad)
Definition: types.hpp:218
@ DIAG_VP
P-axis velocity (m/s)
Definition: types.hpp:212
@ DIAG_VX
X-axis velocity (m/s)
Definition: types.hpp:200
@ DIAG_QM
Charge per mass (e/u)
Definition: types.hpp:224