00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __dynamics_hpp__
00022 #define __dynamics_hpp__
00023
00024 #include "math3d.hpp"
00025 #include "utils.hpp"
00026 #include "threading.hpp"
00027
00028 class Statics;
00029
00031 class ElectroDynamics
00032 {
00033 public:
00034 ElectroDynamics (Statics& statics, bool disableThreads = false);
00035 ~ElectroDynamics ();
00036
00040 void getFields (const vect3d& posv, vect3d& bfield, vect3d& efield, size_t except_electron = (size_t)-1);
00041
00043 void getBField (const vect3d& posv, vect3d& bfield) { vect3d tmp; getFields (posv, bfield, tmp); }
00045 void getEField (const vect3d& posv, vect3d& efield) { vect3d tmp; getFields (posv, tmp, efield); }
00046
00050 bool inContact (const vect3d& pos, size_t except = (size_t)-1);
00051
00055 void step ();
00056
00058 prec_t get_elapsed_time ();
00059
00068 size_t inject_particle (prec_t mass, prec_t charge, const vect3d& pos, const vect3d& heading, prec_t electronVolts);
00069
00076 size_t inject_electron (const vect3d& posv, const vect3d& heading, prec_t electronVolts);
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00088 void print ();
00089
00091 const vect3d& get_pos (size_t i) const { return particles[i].pos; }
00093 const vect3d& get_v (size_t i) const { return particles[i].v; }
00094
00099 void setDTM (prec_t accuracy, prec_t stepf = 1.0);
00101 void setPrintStream (FILE *fp) { printfp = fp; }
00102
00104 static prec_t eV2ms (prec_t ev, prec_t mass);
00106 static prec_t ms2eV (prec_t ms, prec_t mass);
00107
00109 size_t size () { return particles.size(); }
00110
00111 Statics& get_statics () { return statics; }
00112
00114 size_t get_ticks () { return ticks; }
00115
00117 size_t ticks_for_distance (prec_t speed, prec_t distance);
00118
00120 void setDisableFields (bool df) { disable_fields = df; }
00121
00122 private:
00123 Statics& statics;
00124 size_t ticks;
00125 prec_t delta_t;
00126 prec_t adaptf, madaptf;
00127 FILE *printfp;
00128
00129 bool disable_fields;
00130
00131 struct particle
00132 {
00133 prec_t mass;
00134 prec_t charge;
00135 prec_t charge_by_mass;
00136 vect3d pos;
00137 vect3d v;
00138 vect3d next_pos;
00139 vect3d next_v;
00140 vect3d last_bf;
00141 vect3d last_ef;
00142 size_t adaptlevel;
00143 };
00144 typedef std::vector<particle> particles_t;
00145 particles_t particles;
00146
00147 struct pp
00148 {
00149 size_t count;
00150 prec_t dt;
00151 prec_t hdt;
00152 prec_t dt_by_6;
00153 prec_t dtdt;
00154 prec_t dtdt_by_2;
00155 prec_t dtdt_by_6;
00156 prec_t dtdt_by_8;
00157 };
00158 pp *pmap;
00159
00160 #ifdef HAVE_THREADS
00161 TaskManager *tmgr;
00162 struct steptask : public Task
00163 {
00164 ElectroDynamics *dyn;
00165 size_t n;
00166 void execute () { dyn->run_steptask (n); }
00167 virtual ~steptask () { }
00168 };
00169 friend struct steptask;
00170
00171 void run_steptask (size_t n);
00172
00173 std::vector<steptask> tasks;
00174 #endif
00175
00176 void step (size_t i);
00177 };
00178
00179 #endif // !__dynamics_hpp__
00180