#include "CTDR_Electron.h"
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string>
using namespace std;
const double Temps_pnormal=40e-9;
const double Temps_pprofond=4e-6;
const double Temps_d=10e-9;
const double pi=3.14159265;
const double constrep=3*1.602e-19/(4*pi*8.854e-12*12.0);
ClassImp(CTDR_Electron)
CTDR_Electron::CTDR_Electron()
{
x=0;
y=0;
z=0;
Q=1;
mobilite=0.1;
D=25e-4;
double R=(float)rand()/RAND_MAX;
Etat=libre;
E_collection=Libre;
Temps_depiegeage=0;
if( R <=pow((1 + Temps_pnormal/Temps_pprofond),-1)){
Etat_prochain_piege=normal;
R=(float)rand()/RAND_MAX;
Temps_piegeage=-Temps_pnormal*log(1-R);
}
else{
Etat_prochain_piege=profond;
R=(float)rand()/RAND_MAX;
Temps_piegeage=-Temps_pprofond*log(1-R);
};
};
void CTDR_Electron::SetValeurInitial(double x0,double y0, double z0, double mobilite0,double Q0)
{
x=x0;
y=y0;
z=z0;
mobilite=mobilite0;
Q=Q0;
};
void CTDR_Electron::SetPosition(double x0,double y0, double z0)
{
x=x0;
y=y0;
z=z0;
};
void CTDR_Electron::SetEtat(Etats etat_voulu,E_piege etat_piege_voulu)
{
Etat=etat_voulu;
Etat_prochain_piege=etat_piege_voulu;
};
void CTDR_Electron::Collecte(double Z)
{
z=Z;
E_collection = collecte;
Etat=piege;
Etat_prochain_piege=profond;
};
E_collecte CTDR_Electron::GetEcollecte()
{
if(Etat==piege && Etat_prochain_piege==profond)
{
return collecte;
}
else{
return Libre;
};
};
long double CTDR_Electron::GetX()
{
return x;
};
long double CTDR_Electron::GetY()
{
return y;
};
long double CTDR_Electron::GetZ()
{
return z;
};
long double CTDR_Electron::GetQ()
{
return Q;
};
Etats CTDR_Electron::GetEtat()
{
return Etat;
};
void CTDR_Electron::Piege()
{
Temps_piegeage=1;
Etat=piege;
if (Etat_prochain_piege=profond){
Temps_depiegeage=1000;
}
else { double R=(float)rand()/RAND_MAX;
Temps_depiegeage=-Temps_d*log(1-R);
};
};
void CTDR_Electron::Depiege()
{
double R=(float)rand()/RAND_MAX;
Etat=libre;
Temps_depiegeage=0;
if( R <=pow((1 + Temps_pnormal/Temps_pprofond),-1)){
Etat_prochain_piege=normal;
R=(float)rand()/RAND_MAX;
Temps_piegeage=-Temps_pnormal*log(1-R);
}
else{
Etat_prochain_piege=profond;
R=(float)rand()/RAND_MAX;
Temps_piegeage=-Temps_pprofond*log(1-R);
};
};
void CTDR_Electron::Diffusion_Repulsion(bool diffusion,bool repulsion,double xrms,
double yrms, double zrms,int N,double dt)
{
if(diffusion==0 && repulsion==0){}
else if(diffusion==1 && repulsion==0){
double R=(float)rand()/RAND_MAX;
double R2=(float)rand()/RAND_MAX;
if(R2<1 & R2>0){ x+=sqrt(2*D*dt)*sin(2*pi*R)*sqrt(-2*log(R2));};
R=(float)rand()/RAND_MAX;
R2=(float)rand()/RAND_MAX;
if(R2<1 & R2>0){ y+=sqrt(2*D*dt)*sin(2*pi*R)*sqrt(-2*log(R2));};
R=(float)rand()/RAND_MAX;
R2=(float)rand()/RAND_MAX;
if(R2<1 & R2>0){ z+=sqrt(2*D*dt)*sin(2*pi*R)*sqrt(-2*log(R2));};
}
else if(diffusion==1 && repulsion==1){
double R=(float)rand()/RAND_MAX;
double R2=(float)rand()/RAND_MAX;
if(R2<1 & R2>0){ x+=sqrt(2*(D+mobilite*N*constrep/(15*sqrt(5.0)*xrms))*dt)*sin(2*pi*R)*sqrt(-2*log(R2));};
R=(float)rand()/RAND_MAX;
R2=(float)rand()/RAND_MAX;
if(R2<1 & R2>0){ y+=sqrt(2*(D+mobilite*N*constrep/(15*sqrt(5.0)*yrms))*dt)*sin(2*pi*R)*sqrt(-2*log(R2));};
R=(float)rand()/RAND_MAX;
R2=(float)rand()/RAND_MAX;
if(R2<1 & R2>0){ z+=sqrt(2*(D+mobilite*N*constrep/(15*sqrt(5.0)*zrms))*dt)*sin(2*pi*R)*sqrt(-2*log(R2));};
}
else if(diffusion==0 && repulsion==1){
double R=(float)rand()/RAND_MAX;
double R2=(float)rand()/RAND_MAX;
if(R2<1 & R2>0){ x+=sqrt(2*(mobilite*N*constrep/(15*sqrt(5.0)*xrms))*dt)*sin(2*pi*R)*sqrt(-2*log(R2));};
R=(float)rand()/RAND_MAX;
R2=(float)rand()/RAND_MAX;
if(R2<1 & R2>0){ y+=sqrt(2*(mobilite*N*constrep/(15*sqrt(5.0)*yrms))*dt)*sin(2*pi*R)*sqrt(-2*log(R2));};
R=(float)rand()/RAND_MAX;
R2=(float)rand()/RAND_MAX;
if(R2<1 & R2>0){ z+=sqrt(2*(mobilite*N*constrep/(15*sqrt(5.0)*zrms))*dt)*sin(2*pi*R)*sqrt(-2*log(R2));};
}
else{};
};
void CTDR_Electron::Transport(double Ex, double Ey, double Ez,double dt)
{
double dx,dy,dz;
dx=-mobilite*Ex*dt;
dy=-mobilite*Ey*dt;
dz=-mobilite*Ez*dt;
if(dx>1e-4){dx=1e-4;};
if(dy>1e-4){dy=1e-4;};
x+=dx;
y+=dy;
z+=dz;
};
void CTDR_Electron::Iterateur(double dt,int N,double xrms,double yrms,double zrms,CTDR_Field &A)
{
if(Etat==libre){
if(Temps_piegeage<=0){
Piege();
}
else{
Diffusion_Repulsion(1,1,xrms,yrms,zrms,N,dt);
if(z>0.75*A.GetLz()){
A.SetChamp(x,y,z);
Transport(A.GetEx(),A.GetEy(),A.GetEz(),dt);
}
else{
Transport(0,0,-1100.0/A.GetLz(),dt);
};
Temps_piegeage-=dt;
};
}
else{
if(Temps_depiegeage<=0){
Depiege();
Diffusion_Repulsion (1,1,xrms,yrms,zrms,N,fabs(Temps_depiegeage));
if(z>0.6*A.GetLz()){
A.SetChamp(x,y,z);
Transport(A.GetEx(),A.GetEy(),A.GetEz(),fabs(Temps_depiegeage));
}
else{
Transport(0,0,-1100.0/A.GetLz(),fabs(Temps_depiegeage));
};
};
Temps_depiegeage-=dt;
};
};
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.