src/dynamics.hpp

Go to the documentation of this file.
00001 //
00002 // Ephi - simulation of magnetic fields and particles
00003 // Copyright (C) 2007 Indrek Mandre <indrek(at)mare.ee>
00004 // For more information please see http://www.mare.ee/indrek/ephi/
00005 //
00006 // This program is free software; you can redistribute it and/or modify
00007 // it under the terms of the GNU General Public License as published by
00008 // the Free Software Foundation; either version 2 of the License, or
00009 // (at your option) any later version.
00010 //
00011 // This program is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 // GNU General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU General Public License along
00017 // with this program; if not, write to the Free Software Foundation, Inc.,
00018 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
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   // electric field force: qE
00079   // lorentz force q * v x B
00080   // total force: q * (E + v x B)
00081   // electric field module of a charge: (1/(4*pi*e0)) * (Q/|r|*|r|) * r^
00082   // electric field: rvect * Ke / (rvect*rvect)^(3/2)
00083   // bfield of a single electron: B = Km * q * (v x r) / (r * r)^(3/2)
00084   // F = ma; a = F/m
00085   // delta_v = a * delta_t = F * delta_t / m
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 

Generated on Thu Dec 6 20:31:14 2007 for Ephi by  doxygen 1.5.0