50 double dist =
elec::d(center,p);
51 return .05 < dist && dist <= radius;
55 std::vector<elec::conductor::Metal*> _conductors;
56 std::list<elec::Particle> _particles;
57 std::vector<elec::Particle*> _protons;
58 std::vector<elec::Particle*> _electrons;
60 unsigned int nb_p, nb_e;
64 Connector cathode, anode;
69 for(
auto it = _conductors.begin();
70 it != _conductors.end() && res ==
nullptr;
80 World() : _conductors(), _particles(), _protons(), _electrons(),
81 nb_p(0), nb_e(0), nb_part(0), nb_cond(0), has_generator(false),
82 cathode({0,0},0,1), anode({0,0},0,1),
84 _min = {std::numeric_limits<double>::max(),std::numeric_limits<double>::max()};
85 _max = {std::numeric_limits<double>::lowest(),std::numeric_limits<double>::lowest()};
93 double radius,
double voltage) {
95 cathode.radius = radius;
96 anode.radius = radius;
97 cathode.center = cathode_pos;
98 anode.center = anode_pos;
105 const std::list<elec::Particle>&
particles() {
return _particles;}
113 conductor.
idf = _conductors.size();
114 _conductors.push_back(&conductor);
116 if(bbox.first.x < _min.
x) _min.
x = bbox.first.x;
117 if(bbox.first.y < _min.
y) _min.
y = bbox.first.y;
118 if(bbox.second.x > _max.
x) _max.
x = bbox.second.x;
119 if(bbox.second.y > _max.
y) _max.
y = bbox.second.y;
140 for(pos.
x = _min.
x; pos.
x <= _max.
x; pos.
x+=delta)
141 for(pos.
y = _min.
y; pos.
y <= _max.
y; pos.
y+=delta)
142 if(in_new_conductors(pos))
151 for(
unsigned int i=0; i<nb; ++i) {
153 while(!in_new_conductors(pos))
163 auto it = _particles.begin();
164 for(std::advance(it,nb_part); it != _particles.end(); ++it) {
167 _protons.push_back(&p);
169 _electrons.push_back(&p);
171 nb_cond = _conductors.size();
172 nb_part += nb_p + nb_e;
192 void sim(
double dt,
unsigned int nb_splits) {
193 std::random_shuffle(_electrons.begin(), _electrons.end());
194 unsigned int nb = _electrons.size();
195 unsigned int first = 0;
197 for(
unsigned int i = 1; i <= nb_splits; ++i, first = last) {
198 last = (
unsigned int)(nb*i/(
double)(nb_splits)+.5);
199 sim_partial(dt,_electrons.begin() + first, _electrons.begin() + last);
209 auto cond_ptr = owner(p);
210 return cond_ptr !=
nullptr
211 && cond_ptr->idf >= nb_cond;
214 std::vector<elec::Particle*> source_electrons;
215 void update_generator() {
217 double V_plus =
elec::V(_particles.begin(), _particles.end(), cathode.center);
218 double V_minus =
elec::V(_particles.begin(), _particles.end(), anode.center);
219 double DV = V_plus - V_minus;
220 double EXTRA_V = ddp - DV;
241 auto dest_bb = dest->bounding_box();
247 source_electrons.clear();
248 for(
auto e_ptr : _electrons)
249 if(source->inside(e_ptr->pos))
250 source_electrons.push_back(e_ptr);
251 std::random_shuffle(source_electrons.begin(),source_electrons.end());
253 double delta = std::fabs(ddp - (V_plus - V_minus));
254 double delta_prev = delta+1;
255 for(
auto it = source_electrons.begin(); it != source_electrons.end() && (delta < delta_prev); ++it) {
258 while(!(dest->inside(pos)))
262 (*V_source) -=
elec::V(e,source->center);
263 (*V_dest) -=
elec::V(e,dest->center);
266 (*V_source) +=
elec::V(e,source->center);
267 (*V_dest) +=
elec::V(e,dest->center);
269 delta = std::fabs(ddp - (V_plus - V_minus));
273 while(delta < delta_prev) {
275 while(!(dest->inside(pos)))
279 (*V_source) +=
elec::V(e,source->center);
280 (*V_dest) +=
elec::V(e,dest->center);
282 delta = std::fabs(ddp - (V_plus - V_minus));
288 void sim_partial(
double dt,
289 std::vector<elec::Particle*>::iterator begin,
290 std::vector<elec::Particle*>::iterator end) {
291 std::vector<elec::Point> electrons_field;
292 std::vector<elec::Point> protons_field;
293 elec::E_(_electrons.begin(), _electrons.end(),
295 std::back_inserter(electrons_field),
298 elec::E_(_protons.begin(), _protons.end(),
300 std::back_inserter(protons_field),
303 auto pf = protons_field.begin();
304 auto ef = electrons_field.begin();
305 for(
auto it = begin; it != end; ++it, ++pf, ++ef) {
309 auto conductor = owner(electron.
pos);
310 if(conductor !=
nullptr) {
312 force += conductor->friction(electron);
317 electron.
speed = (*electron.
speed)*elecMAX_SPEED;
319 electron.
pos += dp*dt;
328 electron.
speed = S*(speed*S);
Definition: elecParticle.hpp:36
double V(const Particle &p, const Point &at)
Definition: elecParticle.hpp:134
void add_proton(const elec::Point &pos)
Definition: elecWorld.hpp:128
#define elecFORCE_COEF
Definition: elecParams.hpp:30
unsigned int nb_protons()
Definition: elecWorld.hpp:184
Point E_(const Iter &begin, const Iter &end, const Point &at, const PartOf &part_of)
Definition: elecParticle.hpp:94
void add_electron(const elec::Point &pos)
Definition: elecWorld.hpp:123
virtual std::pair< elec::Point, elec::Point > bounding_box() const =0
const std::list< elec::Particle > & particles()
Definition: elecWorld.hpp:105
ddp(0)
Definition: elecWorld.hpp:83
void add_protons()
Definition: elecWorld.hpp:137
World & operator+=(elec::conductor::Metal &conductor)
Definition: elecWorld.hpp:112
Point speed
Definition: elecParticle.hpp:38
#define elecISOLATION_COEF
Definition: elecParams.hpp:37
Particle electron(const Point &pos)
Definition: elecParticle.hpp:66
Definition: elecPoint.hpp:35
#define elecELECTROM_MASS
Definition: elecParams.hpp:32
void set_generator(const elec::Point &cathode_pos, const elec::Point &anode_pos, double radius, double voltage)
Definition: elecWorld.hpp:91
#define elecMAX_SPEED
Definition: elecParams.hpp:36
Definition: elecWorld.hpp:41
Point pos
Definition: elecParticle.hpp:38
unsigned int idf
Definition: elecConductor.hpp:43
World()
Definition: elecWorld.hpp:80
Definition: elecConductor.hpp:40
double y
Definition: elecPoint.hpp:37
void sim(double dt, unsigned int nb_splits)
Definition: elecWorld.hpp:192
#define elecPROTONS_PER_UNIT
Definition: elecParams.hpp:31
double d(const Point &A, const Point &B)
Definition: elecPoint.hpp:136
Point uniform(const Point &A, const Point &B)
Definition: elecPoint.hpp:125
void end_of_particles()
Definition: elecWorld.hpp:162
double x
Definition: elecPoint.hpp:37
void add_electrons(unsigned int nb)
Definition: elecWorld.hpp:150
Particle proton(const Point &pos)
Definition: elecParticle.hpp:70
Definition: elecConductor.hpp:77