Commit 1630644b authored by CHAMONT David's avatar CHAMONT David
Browse files

Etat transitoire.

parent 5dcae825
#include "particules.h"
#include <vector>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cassert>
//==========
long nb_vecteurs = 0;
......@@ -53,11 +55,10 @@ private :
double x_, y_, z_;
} ;
//==========
Vecteur VNULL( 0, 0, 0 );
double PAS_DE_TEMPS = 1e-6;
//==========
class Particule;
......@@ -128,13 +129,19 @@ public:
virtual void evolue( Particules & secondaires )
{
ParticleStruct p =
{
anti_?POSITRON:ELECTRON,
position_
} ;
Vecteur deplacement( vitesse_ );
deplacement.multiplie( PAS_DE_TEMPS );
position_.ajoute( deplacement );
if ( (std::rand() / double(RAND_MAX)) < 0.00001 ) {
Photon * bremstrallung = new Photon( position_, vitesse_ );
secondaires.push_back( bremstrallung );
if ( (std::rand() / double(RAND_MAX)) < 0.00001 )
{
secondaires.push_back( new Photon( position_, vitesse_ ) );
}
}
......@@ -149,26 +156,34 @@ class Collision
public:
Collision( long nb_particules )
{
ParticleStruct * ps = new_collision(nb_particules) ;
for ( long ip = 0; ip < nb_particules; ++ip )
{
Vecteur vitesse( 1, 0, 0 );
if ( ( std::rand() / double(RAND_MAX) ) < 0.5 ) {
particules_.push_back( new Electron( VNULL, vitesse ) );
} else {
particules_.push_back( new Electron( VNULL, vitesse, true ) );
Vecteur position(ps[ip].px, ps[ip].py, ps[ip].pz) ;
Vecteur vitesse(ps[ip].vx, ps[ip].vy, ps[ip].vz) ;
switch(ps[ip].id)
{
case ELECTRON :
particules_.push_back( new Electron(position,vitesse) ) ; break ;
case POSITRON :
particules_.push_back( new Electron(position,vitesse,true) ) ; break ;
case PHOTON :
particules_.push_back( new Photon(position,vitesse) ) ; break ;
throw "ParticuleId inconnu !" ;
}
}
delete [] ps ;
}
Collision( const Collision & c )
{
Particules::const_iterator pp;
for ( pp = c.particules_.begin(); pp != c.particules_.end(); ++pp ) {
particules_.push_back( (*pp)->clone() );
}
for ( pp = c.particules_.begin(); pp != c.particules_.end(); ++pp )
{ particules_.push_back( (*pp)->clone() ); }
}
Collision& operator=( const Collision & c ) {
Collision& operator=( const Collision & c )
{
if (&c == this) { return *this; }
*this = Collision(c);
return *this;
......@@ -177,16 +192,16 @@ public:
~Collision()
{
Particules::iterator pp;
for ( pp = particules_.begin(); pp != particules_.end(); ++pp ) {
delete (*pp);
}
for ( pp = particules_.begin(); pp != particules_.end(); ++pp )
{ delete (*pp); }
}
long nb_electrons()
{
long nb = 0;
Particules::iterator pp;
for ( pp = particules_.begin(); pp != particules_.end(); ++pp ) {
for ( pp = particules_.begin(); pp != particules_.end(); ++pp )
{
Electron * electron = dynamic_cast< Electron * >( *pp );
if ( (electron != 0) && (!electron->anti()) ) { ++nb; }
}
......@@ -197,7 +212,8 @@ public:
{
long nb = 0;
Particules::iterator pp;
for ( pp = particules_.begin(); pp != particules_.end(); ++pp ) {
for ( pp = particules_.begin(); pp != particules_.end(); ++pp )
{
Electron * electron = dynamic_cast< Electron * >( *pp );
if ( (electron != 0) && (electron->anti()) ) { ++nb; }
}
......@@ -208,9 +224,8 @@ public:
{
long nb = 0 ;
Particules::iterator pp;
for ( pp = particules_.begin(); pp != particules_.end(); ++pp ) {
if ( dynamic_cast< Photon * >( *pp ) != 0 ) { ++nb; }
}
for ( pp = particules_.begin(); pp != particules_.end(); ++pp )
{ if ( dynamic_cast< Photon * >( *pp ) != 0 ) { ++nb; } }
return nb ;
}
......@@ -219,13 +234,9 @@ public:
Particules secondaires;
Particules::iterator pp;
for ( pp = particules_.begin(); pp != particules_.end(); ++pp )
{
(*pp)->evolue(secondaires);
}
{ (*pp)->evolue(secondaires); }
for ( pp = secondaires.begin(); pp != secondaires.end(); ++pp )
{
particules_.push_back(*pp);
}
{ particules_.push_back(*pp); }
}
void affiche()
......@@ -252,17 +263,17 @@ int main( int argc, char * argv[] )
clock_t avant = clock();
Collision collision( nb_particules );
for ( long pas = 1 ; pas <= nb_evolutions ; ++pas ) {
collision.evolue();
}
for ( long pas = 1 ; pas <= nb_evolutions ; ++pas )
{ collision.evolue(); }
collision.affiche();
clock_t apres = clock();
std::cout << nb_vecteurs << " vecteurs, "
<< "duree " << int((apres - avant) / double(CLOCKS_PER_SEC) * 1000)
<< " ms"
<< std::endl;
std::cout
<< nb_vecteurs << " vecteurs, "
<< "duree " << int((apres - avant) / double(CLOCKS_PER_SEC) * 1000) << " ms"
<< std::endl;
return 0 ;
}
#include <cstdlib>
#include <cassert>
enum PID { PHOTON, ELECTRON, POSITRON } ;
struct ParticleStruct
{
PID id ;
double px, py, pz ; // position
double vx, vy, vz ; // vitesse
} ;
ParticleStruct * new_collision
( long nb_particules )
{
ParticleStruct * ps = new ParticleStruct [nb_particules] ;
for ( long ip = 0; ip < nb_particules; ++ip )
{
if ( ( std::rand() / double(RAND_MAX) ) < 0.5 )
{
ps[ip].id = ELECTRON ;
ps[ip].px = ps[ip].py = ps[ip].pz = 0.0 ;
ps[ip].vx = ps[ip].vy = ps[ip].vz = 1.0 ;
}
else
{
ps[ip].id = POSITRON ;
ps[ip].px = ps[ip].py = ps[ip].pz = 0.0 ;
ps[ip].vx = ps[ip].vy = ps[ip].vz = 1.0 ;
}
}
return ps ;
}
ParticleStruct * evolution_electron_positron
( ParticleStruct * p, double pas_de_temps, long & nb_particules )
{
static const double PROBA_SECONDAIRE = 1e-5 ;
bool secondaire = ( (std::rand() / double(RAND_MAX)) < PROBA_SECONDAIRE ) ;
nb_particules = secondaire?2:1 ;
ParticleStruct * ps = new ParticleStruct [nb_particules] ;
ps[0].id = p->id ;
ps[0].px = p->px + pas_de_temps * p->vx ;
ps[0].py = p->py + pas_de_temps * p->vy ;
ps[0].pz = p->pz + pas_de_temps * p->vz ;
ps[0].vx = p->vx ;
ps[0].vy = p->vy ;
ps[0].vz = p->vz ;
if (secondaire)
{
ps[1].id = PHOTON ;
ps[1].px = p->px ;
ps[1].py = p->py ;
ps[1].pz = p->pz ;
ps[1].vx = p->vx ;
ps[1].vy = p->vy ;
ps[1].vz = p->vz ;
}
return ps ;
}
ParticleStruct * evolution_photon
( ParticleStruct * p, double pas_de_temps, long & nb_particules )
{
nb_particules = 1 ;
ParticleStruct * ps = new ParticleStruct [nb_particules] ;
ps[0].id = p->id ;
ps[0].px = p->px + pas_de_temps * p->vx ;
ps[0].py = p->py + pas_de_temps * p->vy ;
ps[0].pz = p->pz + pas_de_temps * p->vz ;
ps[0].vx = p->vx ;
ps[0].vy = p->vy ;
ps[0].vz = p->vz ;
return ps ;
}
ParticleStruct * new_evolution
( ParticleStruct * p, long & nb_particules )
{
switch(p->id)
{
case ELECTRON :
case POSITRON :
return evolution_electron_positron(p,nb_particules) ;
break ;
case PHOTON :
return evolution_photon(p,nb_particules) ;
break ;
throw "ParticuleId inconnu !" ;
}
}
......@@ -11,8 +11,6 @@ les etapes ulterieures du TP.
Bonne idée de spécialiser l'API d'Electron et Photon
IDEE : faire de la class Intervalle une simple struct comme Vecteur ?
ACTION :
* preparer les solutions intermediaires.
* réfléchir au problème de l'opérateur- sur nos itérateurs paresseux.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment