#include "EField.h"
ClassImp(EField)
EField::~EField()
{
Clear();
}
EField::EField(TArrayD x,Int_t n1,Int_t n2,TArrayI sp)
{
Int_t i;
nx=n1; ny=n2;
Int_t num=nx*ny;
StripPosition=sp;
U=TArrayD(num+nx+1); U.Reset();
Efx=TArrayD(num+nx+1); Efx.Reset();
Efy=TArrayD(num+nx+1); Efy.Reset();
Ef=TArrayD(num+nx+1); Ef.Reset();
for(i=1;i<=num;i++) U[i]=x[i];
ThE=1e10;
}
EField::EField(Double_t *x,Int_t n1,Int_t n2,TArrayI sp)
{
Int_t i;
nx=n1; ny=n2;
Int_t num=nx*ny;
StripPosition=sp;
U=TArrayD(num+nx+1); U.Reset();
Efx=TArrayD(num+nx+1); Efx.Reset();
Efy=TArrayD(num+nx+1); Efy.Reset();
Ef=TArrayD(num+nx+1); Ef.Reset();
for(i=1;i<=num;i++) U[i]=x[i];
ThE=1e10;
}
EField::EField()
{
Int_t i;
nx=240; ny=301;
Int_t num=nx*ny;
U=TArrayD(num+nx+1); U.Reset();
Efx=TArrayD(num+nx+1); Efx.Reset();
Efy=TArrayD(num+nx+1); Efy.Reset();
Ef=TArrayD(num+nx+1); Ef.Reset();
//for(i=1;i<=num;i++) U[i]=x[i];
ThE=1e10;
}
void EField::CalField(Float_t step,Int_t how)
{
long i,n,j,pos;
int ishit=1;
Double_t Ex,Ey,E;
Int_t nostrips=StripPosition.GetSize()/2;
Int_t *strpos=StripPosition.GetArray();
for(j=1;j<=ny;j++)
for(i=1;i<=nx;i++)
{
n=i+nx*(j-1);
if(i==1 || i==nx) Ex=0.; else Ex=(U[n+1]-U[n-1])/(2*step);
if(how>0)
{
if(j==ny || j==1)
{
for(pos=0;pos<nostrips*2;pos+=2) {if(i==strpos[pos]) Ex=(U[n]-U[n-1])/step;
if(i==strpos[pos+1]) Ex=(U[n+1]-U[n])/step;}
for(pos=0;pos<nostrips*2;pos+=2) if(i>=strpos[pos] && i<=strpos[pos+1]) {ishit=0; break;}
if( (j==1 && (ishit || how==1)) || (j==ny && ishit) ) Ey=0.; //changed G. Kramberger 21.10.2002
else
{
if(j==ny) Ey=(U[n]-U[n-nx])/step;
if(j==1) Ey=(U[n+nx]-U[n])/step;
}
ishit=1;
}
else Ey=(U[n+nx]-U[n-nx])/(2*step);
}
if(how==0) if(j==ny || j==1) Ey=0.; else Ey=(U[n+nx]-U[n-nx])/(2*step);
E=sqrt(Ex*Ex+Ey*Ey);
Efx[n]=Ex; Efy[n]=Ey; Ef[n]=E;
// printf("n n= %d , Ex=%f; Ey=%f", n,Ex, Ey );
// U[n]=x[n];
//*(y+n)=elf;
}
}
void EField::GetHisto(TH2F *histo,Int_t what)//, int nx,int ny, struct elfield *y)
{
float *xx;
long i,j;
Int_t index;
TH2F *his;
switch(what)
{
case 0: his=new TH2F("Potential","Potential [V]",nx,1,(Float_t)(nx+1),ny,1,(Float_t)(ny+1)); break;
case 1: his=new TH2F("ElectricF","|Electric Field| [V/um]",nx,1,(Float_t)(nx+1),ny,1,(Float_t)(ny+1)); break;
case 2: his=new TH2F("EFieldX","Electric Filed X [V/um]",nx,1,(Float_t)(nx+1),ny,1,(Float_t)(ny+1)); break;
case 3: his=new TH2F("EFiledY","Electric Filed Y [V/um]",nx,1,(Float_t)(nx+1),ny,1,(Float_t)(ny+1)); break;
}
for(j=1;j<=ny;j++)
for(i=1;i<=nx;i++)
{
index=(i+(j-1)*nx);
switch(what)
{
case 0:
his->Fill((Float_t)i,(Float_t)j,U[index]); break;
case 1:
his->Fill((Float_t)i,(Float_t)j,Ef[index]); break;
case 2:
his->Fill((Float_t)i,(Float_t)j,Efx[index]); break;
case 3:
his->Fill((Float_t)i,(Float_t)j,Efy[index]); break;
}
}
his->Copy(*histo);
}
void EField::CalFieldXY(float cx,float cy,float *E)
{
#define f(qq,ww) (ww-1)*nx+qq
float delx, dely;
delx=(cx-(int)cx);
dely=(cy-(int)cy);
// printf("delx %f, dely %f cx=%f cy=%f n",delx,dely,cx,cy);
E[1]=(1-delx)*(1-dely)*Efx[f((int)cx,(int)cy)]+delx*(1-dely)*Efx[f((int)cx+1,(int)cy)]+delx*dely*Efx[f((int)cx+1,(int)cy+1)]+(1-delx)*dely*Efx[f((int)cx,(int)cy+1)];
E[2]=(1-delx)*(1-dely)*Efy[f((int)cx,(int)cy)]+delx*(1-dely)*Efy[f((int)cx+1,(int)cy)]+delx*dely*Efy[f((int)cx+1,(int)cy+1)]+(1-delx)*dely*Efy[f((int)cx,(int)cy+1)];
E[0]=sqrt(E[1]*E[1]+E[2]*E[2]);
// printf("delx %f, dely %f Ex=%f Ey=%f E=%fn",delx,dely,E[1],E[2],E[0]);
// if(cx>nx || cy>ny) {printf("HALOn"); printf("index %d %d ,%f %f",nx,ny,cx,cy); while(!getchar()); exit(0);}
return;
#undef f
}
/*
Float_t EField::DriftVelocity(Float_t E,Float_t Charg, Float_t T, Double_t Neff)
{
E*=1e4;
mob->SetParameters(T,Charg);
return((float) (mob->Eval(E,Neff,0)*E));
}
Float_t EField::DriftVelocity(Float_t cx,Float_t cy,Float_t Charg, Float_t T, Double_t Neff)
{
Float_t E[3];
CalFieldXY(cx,cy,E);
E[0]*=1e4;
mob->SetParameters(T,Charg);
return((float) (mob->Eval((Double_t)E[0],Neff,0)*(Double_t)E[0]));
}
Double_t EField::Mobility(Float_t cx,Float_t cy,Float_t T,Float_t Charg,Double_t Neff)
{
Float_t E[3];
CalFieldXY(cx,cy,E);
E[0]*=1e4;
mob->SetParameters(T,Charg);
return(mob->Eval((Double_t)E[0],Neff,0));
}
Double_t EField::Mobility(Float_t E,Float_t T,Float_t Charg,Double_t Neff)
{
E*=1e4;
mob->SetParameters(T,Charg);
return(mob->Eval((Double_t) E,Neff,0));
}
*/
Float_t EField::DriftVelocity(Float_t E,Float_t Charg, Float_t T, Double_t Neff, Int_t which)
{
E*=1e4;
return((float) (Mobility(E,T,Charg,Neff,which)*(Double_t)E));
}
Float_t EField::DriftVelocity(Float_t cx,Float_t cy,Float_t Charg, Float_t T, Double_t Neff, Int_t which)
{
Float_t E[3];
CalFieldXY(cx,cy,E);
E[0]*=1e4;
return((float) (Mobility(E[0],T,Charg,Neff,which)*(Double_t)E[0]));
}
Double_t EField::Mobility(Float_t cx,Float_t cy,Float_t T,Float_t Charg,Double_t Neff, Int_t which)
{
Float_t E[3];
CalFieldXY(cx,cy,E);
E[0]*=1e4;
return(Mobility(E[0],T,Charg,Neff,which));
}
Double_t EField::Mobility(Float_t E,Float_t T,Float_t Charg,Double_t Neff, Int_t which)
{
Double_t lfm=0,hfm=0;
Double_t vsatn,vsatp,vsat;
Double_t betap,betan;
Double_t alpha;
switch(which)
{
case 0:
alpha=0.72*TMath::Power(T/300,0.065);
if(Charg>0)
{
Double_t ulp=460*TMath::Power(T/300,-2.18);
Double_t uminp=45*TMath::Power(T/300,-0.45);
Double_t Crefp=2.23e17*TMath::Power(T/300,3.2);
betap=1;
vsatp=9.05e6*TMath::Sqrt(TMath::TanH(312/T));
lfm=uminp+(ulp-uminp)/(1+TMath::Power(Neff/Crefp,alpha));
hfm=2*lfm/(1+TMath::Power(1+TMath::Power(2*lfm*E/vsatp,betap),1/betap));
}
else
{
Double_t uln=1430*TMath::Power(T/300,-2);
Double_t uminn=80*TMath::Power(T/300,-0.45);
Double_t Crefn=1.12e17*TMath::Power(T/300,3.2);
betan=2;
vsatn=1.45e7*TMath::Sqrt(TMath::TanH(155/T));
lfm=uminn+(uln-uminn)/(1+TMath::Power(Neff/Crefn,alpha));
hfm=2*lfm/(1+TMath::Power(1+TMath::Power(2*lfm*E/vsatn,betan),1/betan));
}
break;
case 1:
//printf("%e ",par[0]);
if(Charg>0)
{
lfm=8.54e5*TMath::Power(T,-1.075)*TMath::Exp(1-T/124.);
vsatp=1.445e7*TMath::Exp(-T/435.9);
betap=2.49*TMath::Exp(-T/270.3);
hfm=lfm/TMath::Power(1+TMath::Power(lfm*E/vsatp,1/betap),betap);
}
else
{
lfm=2.712e8*TMath::Power(T,-2.133);
vsatn=1.586e7*TMath::Exp(-T/723.6);
betan=-8.262e-8*TMath::Power(T,3)+6.817e-5*TMath::Power(T,2)-1.847e-2*T+2.429;
hfm=lfm/TMath::Power(1+TMath::Power(lfm*E/vsatn,1/betan),betan);
}
break;
case 2: //Diamond parametrization
if(Charg>0) {lfm=2064; vsat=14.1e6;} else {lfm=1714; vsat=9.6e6;};
hfm=lfm/(1+(lfm*E)/vsat);
break;
}
return hfm;
}
// static TF2 *mob = new TF2("mobility",mobility,0,10000,0,1e13,2);
// Double_t mobility(Double_t *x, Double_t *par)
// {
// Double_t lfm=0,hfm=0;
// Double_t alpha=0.72*TMath::Power(par[0]/300,0.065);
// if(par[1]>0)
// {
// Double_t ulp=460*TMath::Power(par[0]/300,-2.18);
// Double_t uminp=45*TMath::Power(par[0]/300,-0.45);
// Double_t Crefp=2.23e17*TMath::Power(par[0]/300,3.2);
// Double_t vsatp=9.05e6*TMath::Sqrt(TMath::TanH(312/par[0]));
// Double_t betap=1;
// lfm=uminp+(ulp-uminp)/(1+TMath::Power(x[1]/Crefp,alpha));
// hfm=2*lfm/(1+TMath::Power(1+TMath::Power(2*lfm*x[0]/vsatp,betap),1/betap));
// }
// else
// {
// Double_t uln=1430*TMath::Power(par[0]/300,-2);
// Double_t uminn=80*TMath::Power(par[0]/300,-0.45);
// Double_t Crefn=1.12e17*TMath::Power(par[0]/300,3.2);
// Double_t vsatn=1.45e7*TMath::Sqrt(TMath::TanH(155/par[0]));
// Double_t betan=2;
// lfm=uminn+(uln-uminn)/(1+TMath::Power(x[1]/Crefn,alpha));
// hfm=2*lfm/(1+TMath::Power(1+TMath::Power(2*lfm*x[0]/vsatn,betan),1/betan));
// }
// //printf("%e ",par[0]);
// return hfm;
// }
ROOT page - Class index - 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.