44 #define PARTICLES_HPP 1
49 #include <gsl/gsl_errno.h>
58 #define IBSIMU_DERIV_ERROR 201
111 ParticleP2D(
double t,
double x,
double vx,
double y,
double vy ) {
112 _x[0] = t; _x[1] = x; _x[2] = vx; _x[3] = y; _x[4] = vy;
131 static size_t dim() {
return(2); }
135 static size_t size() {
return(5); }
148 static int get_derivatives(
double t,
const double *x,
double *dxdt,
void *data );
158 int extrapolate = 0 );
164 static const std::string
IQ_unit() {
return(
"A/m" ); }
176 double speed() {
return( sqrt(_x[2]*_x[2] + _x[4]*_x[4]) ); }
196 res[0] = _x[0] + pp[0];
197 res[1] = _x[1] + pp[1];
198 res[2] = _x[2] + pp[2];
199 res[3] = _x[3] + pp[3];
200 res[4] = _x[4] + pp[4];
206 res[0] = _x[0] - pp[0];
207 res[1] = _x[1] - pp[1];
208 res[2] = _x[2] - pp[2];
209 res[3] = _x[3] - pp[3];
210 res[4] = _x[4] - pp[4];
226 void save( std::ostream &s )
const {
241 << std::setw(12) << pp(0) <<
", "
242 << std::setw(12) << pp(1) <<
", "
243 << std::setw(12) << pp(2) <<
", "
244 << std::setw(12) << pp(3) <<
", "
245 << std::setw(12) << pp(4) <<
")";
279 ParticlePCyl(
double t,
double x,
double vx,
double r,
double vr,
double w ) {
280 _x[0] = t; _x[1] = x; _x[2] = vx; _x[3] = r; _x[4] = vr; _x[5] = w;
300 static size_t dim() {
return(2); }
304 static size_t size() {
return(6); }
322 static int get_derivatives(
double t,
const double *x,
double *dxdt,
void *data );
332 int extrapolate = 0 );
338 static const std::string
IQ_unit() {
return(
"A" ); }
350 double speed() {
return( sqrt(_x[2]*_x[2] + _x[4]*_x[4] + _x[3]*_x[3]*_x[5]*_x[5]) ); }
370 res[0] = _x[0] + pp[0];
371 res[1] = _x[1] + pp[1];
372 res[2] = _x[2] + pp[2];
373 res[3] = _x[3] + pp[3];
374 res[4] = _x[4] + pp[4];
375 res[5] = _x[5] + pp[5];
381 res[0] = _x[0] - pp[0];
382 res[1] = _x[1] - pp[1];
383 res[2] = _x[2] - pp[2];
384 res[3] = _x[3] - pp[3];
385 res[4] = _x[4] - pp[4];
386 res[5] = _x[5] - pp[5];
403 void save( std::ostream &s )
const {
419 << std::setw(12) << pp(0) <<
", "
420 << std::setw(12) << pp(1) <<
", "
421 << std::setw(12) << pp(2) <<
", "
422 << std::setw(12) << pp(3) <<
", "
423 << std::setw(12) << pp(4) <<
", "
424 << std::setw(12) << pp(5) <<
")";
459 ParticleP3D(
double t,
double x,
double vx,
double y,
double vy,
double z,
double vz ) {
460 _x[0] = t; _x[1] = x; _x[2] = vx; _x[3] = y; _x[4] = vy; _x[5] = z; _x[6] = vz;
481 static size_t dim() {
return(3); }
485 static size_t size() {
return(7); }
500 static int get_derivatives(
double t,
const double *x,
double *dxdt,
void *data );
510 int extrapolate = 0 );
516 static const std::string
IQ_unit() {
return(
"A" ); }
528 double speed() {
return( sqrt(_x[2]*_x[2] + _x[4]*_x[4] + _x[6]*_x[6]) ); }
548 res[0] = _x[0] + pp[0];
549 res[1] = _x[1] + pp[1];
550 res[2] = _x[2] + pp[2];
551 res[3] = _x[3] + pp[3];
552 res[4] = _x[4] + pp[4];
553 res[5] = _x[5] + pp[5];
554 res[6] = _x[6] + pp[6];
560 res[0] = _x[0] - pp[0];
561 res[1] = _x[1] - pp[1];
562 res[2] = _x[2] - pp[2];
563 res[3] = _x[3] - pp[3];
564 res[4] = _x[4] - pp[4];
565 res[5] = _x[5] - pp[5];
566 res[6] = _x[6] - pp[6];
584 void save( std::ostream &s )
const {
601 << std::setw(12) << pp(0) <<
", "
602 << std::setw(12) << pp(1) <<
", "
603 << std::setw(12) << pp(2) <<
", "
604 << std::setw(12) << pp(3) <<
", "
605 << std::setw(12) << pp(4) <<
", "
606 << std::setw(12) << pp(5) <<
", "
607 << std::setw(12) << pp(6) <<
")";
691 double IQ()
const {
return(
_IQ ); }
695 double q()
const {
return(
_q ); }
699 double m()
const {
return(
_m ); }
707 void save( std::ostream &s )
const {
726 std::vector<PP> _trajectory;
748 _trajectory.reserve( N );
749 for( uint32_t a = 0; a < N; a++ )
750 _trajectory.push_back( PP( s ) );
784 PP &
x() {
return( _x ); }
788 const PP &
x()
const {
return( _x ); }
792 PP &
traj(
int i ) {
return( _trajectory[i] ); }
796 const PP &
traj(
int i )
const {
return( _trajectory[i] ); }
800 size_t traj_size(
void )
const {
return( _trajectory.size() ); }
816 void save( std::ostream &s )
const {
819 for( uint32_t a = 0; a < _trajectory.size(); a++ )
820 _trajectory[a].
save( s );
828 os <<
"**Particle\n";
831 os <<
"stat = PARTICLE_OK\n";
834 os <<
"stat = PARTICLE_OUT\n";
837 os <<
"stat = PARTICLE_COLL\n";
840 os <<
"stat = PARTICLE_BADDEF\n";
843 os <<
"stat = PARTICLE_TIME\n";
846 os <<
"stat = PARTICLE_NSTP\n";
849 os <<
"IQ = " <<
_IQ <<
"\n";
850 os <<
"q = " <<
_q <<
"\n";
851 os <<
"m = " <<
_m <<
"\n";
852 os <<
"x = " << _x <<
"\n";
853 os <<
"Trajectory:\n";
854 for( a = 0; a < _trajectory.size(); a++ )
855 os <<
"x[" << a <<
"] = " << _trajectory[a] <<
"\n";