1 /*****************************************************************************/
3 /* 8888888 88888888 88888888 */
6 /* 8 88888888 88888888 */
9 /* 888888 888888888 888888888 */
11 /* A Two-Dimensional General Purpose Semiconductor Simulator. */
13 /* GSS material database Version 0.4 */
14 /* Last update: Feb 17, 2006 */
18 /* NINT, No.69 P.O.Box, Xi'an City, China */
20 /*****************************************************************************/
22 // Material Type: GaAs
28 class GSS_GaAs_BandStructure
: public PMIS_BandStructure
33 // Bandgap and Effective Density of States
34 PetscScalar EG300
; // The energy bandgap of the material at 300 K.
35 PetscScalar EGALPH
; // The value of alpha used in calculating the temperature depended energy bandgap.
36 PetscScalar EGBETA
; // The value of beta used in calculating the temperature depended energy bandgap.
37 PetscScalar ELECMASS
; // The relative effective mass of electron
38 PetscScalar HOLEMASS
; // The relative effective mass of hole
39 PetscScalar NC300
; // The effective density of states in the conduction band at 300K.
40 PetscScalar NV300
; // The effective density of states in the valence band at 300K.
41 PetscScalar NC_F
; // The parameter for temperature depended effective density of states in the conduction band.
42 PetscScalar NV_F
; // The parameter for temperature depended effective density of states in the valence band.
43 // Model of Bandgap Narrowing due to Heavy Doping
44 PetscScalar N0_BGN
; // The concentration parameter used in Slotboom's band-gap narrowing model.
45 PetscScalar V0_BGN
; // The voltage parameter used in Slotboom's band-gap narrowing model.
46 PetscScalar CON_BGN
; // The const parameter used in Slotboom's band-gap narrowing model.
51 EG300
= 1.424000e+00*eV
;
52 EGALPH
= 5.405000e-04*eV
/K
;
53 EGBETA
= 2.040000e+02*K
;
54 ELECMASS
= 6.700000E-02*me
;
55 HOLEMASS
= 6.415000E-01*me
;
56 NC300
= 4.700000e+17*pow(cm
,-3);
57 NV300
= 7.000000e+18*pow(cm
,-3);
60 N0_BGN
= 1.000000e+17*pow(cm
,-3);
61 V0_BGN
= 0.000000e+00*V
;
62 CON_BGN
= 0.000000e+00*eV
;
65 //---------------------------------------------------------------------------
66 // procedure of Bandgap
67 PetscScalar
Eg (const PetscScalar
&Tl
)
69 return EG300
+EGALPH
*(T300
*T300
/(T300
+EGBETA
) - Tl
*Tl
/(Tl
+EGBETA
));
71 AutoDScalar
Eg (const AutoDScalar
&Tl
)
73 return EG300
+EGALPH
*(T300
*T300
/(T300
+EGBETA
) - Tl
*Tl
/(Tl
+EGBETA
));
78 //---------------------------------------------------------------------------
79 // procedure of Bandgap Narrowing due to Heavy Doping
80 PetscScalar
EgNarrow(const PetscScalar
&Tl
)
82 PetscScalar Na
= ReadDopingNa();
83 PetscScalar Nd
= ReadDopingNd();
84 PetscScalar N
= Na
+Nd
+1.0*pow(cm
,-3);
85 PetscScalar x
= log(N
/N0_BGN
);
86 return V0_BGN
*(x
+sqrt(x
*x
+CON_BGN
));
88 PetscScalar
EgNarrowToEc (const PetscScalar
&Tl
){return 0.5*EgNarrow(Tl
);}
89 PetscScalar
EgNarrowToEv (const PetscScalar
&Tl
){return 0.5*EgNarrow(Tl
);}
91 AutoDScalar
EgNarrow(const AutoDScalar
&Tl
)
93 PetscScalar Na
= ReadDopingNa();
94 PetscScalar Nd
= ReadDopingNd();
95 PetscScalar N
= Na
+Nd
+1.0*pow(cm
,-3);
96 PetscScalar x
= log(N
/N0_BGN
);
97 return V0_BGN
*(x
+sqrt(x
*x
+CON_BGN
));
99 AutoDScalar
EgNarrowToEc (const AutoDScalar
&Tl
){return 0.5*EgNarrow(Tl
);}
100 AutoDScalar
EgNarrowToEv (const AutoDScalar
&Tl
){return 0.5*EgNarrow(Tl
);}
102 //---------------------------------------------------------------------------
103 //electron and hole effect mass
104 PetscScalar
EffecElecMass (const PetscScalar
&Tl
)
108 PetscScalar
EffecHoleMass (const PetscScalar
&Tl
)
114 //---------------------------------------------------------------------------
116 PetscScalar
Nc (const PetscScalar
&Tl
)
118 return NC300
*pow(Tl
/T300
,NC_F
);
120 AutoDScalar
Nc (const AutoDScalar
&Tl
)
122 return NC300
*pow(Tl
/T300
,NC_F
);
125 PetscScalar
Nv (const PetscScalar
&Tl
)
127 return NV300
*pow(Tl
/T300
,NV_F
);
129 AutoDScalar
Nv (const AutoDScalar
&Tl
)
131 return NV300
*pow(Tl
/T300
,NV_F
);
134 //---------------------------------------------------------------------------
136 PetscScalar
nie (const PetscScalar
&Tl
)
138 PetscScalar bandgap
= Eg(Tl
);
139 PetscScalar Nc
= NC300
*pow(Tl
/T300
,NC_F
);
140 PetscScalar Nv
= NV300
*pow(Tl
/T300
,NV_F
);
141 return sqrt(Nc
*Nv
)*exp(-bandgap
/(2*kb
*Tl
))*exp(EgNarrow(Tl
));
143 AutoDScalar
nie (const AutoDScalar
&Tl
)
145 AutoDScalar bandgap
= Eg(Tl
);
146 AutoDScalar Nc
= NC300
*pow(Tl
/T300
,NC_F
);
147 AutoDScalar Nv
= NV300
*pow(Tl
/T300
,NV_F
);
148 return sqrt(Nc
*Nv
)*exp(-bandgap
/(2*kb
*Tl
))*exp(EgNarrow(Tl
));
156 PetscScalar TAUN0
; // The Shockley-Read-Hall electron lifetime.
157 PetscScalar TAUP0
; // The Shockley-Read-Hall hole lifetime.
158 PetscScalar SurfTauN
; // The electron surface recombination velocity.
159 PetscScalar SurfTauP
; // The hole surface recombination velocity.
160 //Concentration-Dependent Lifetimes
161 PetscScalar NSRHN
; // The Shockley-Read-Hall concentration parameter for electrons.
162 PetscScalar AN
; // The constant term in the concentration-dependent expression for electron lifetime.
163 PetscScalar BN
; // The linear term coefficient in the concentration-dependent expression for electron lifetime.
164 PetscScalar CN
; // The exponential term coefficient in the concentration-dependent expression for electron lifetime.
165 PetscScalar EN
; // The exponent in the concentration-dependent expression for electron lifetime.
166 PetscScalar NSRHP
; // The Shockley-Read-Hall concentration parameter for holes.
167 PetscScalar AP
; // The constant term in the concentration-dependent expression for hole lifetime.
168 PetscScalar BP
; // The linear term coefficient in the concentration-dependent expression for hole lifetime.
169 PetscScalar CP
; // The exponential term coefficient in the concentration-dependent expression for hole lifetime.
170 PetscScalar EP
; // The exponent in the concentration-dependent expression for hole lifetime.
171 // Lattice Temperature-Dependent Lifetimes
172 PetscScalar EXN_TAU
; // The exponent of lattice temperature dependent electron lifetime.
173 PetscScalar EXP_TAU
; // The exponent of lattice temperature dependent hole lifetime.
178 TAUN0
= 1.000000e-09*s
;
179 TAUP0
= 1.000000e-09*s
;
180 SurfTauN
= 0.000000e+00*cm
/s
;
181 SurfTauP
= 0.000000e+00*cm
/s
;
182 NSRHN
= 5.000000e+16*pow(cm
,-3);
187 NSRHP
= 5.000000e+16*pow(cm
,-3);
192 EXN_TAU
= 0.000000e+00;
193 EXP_TAU
= 0.000000e+00;
197 //---------------------------------------------------------------------------
198 // electron lift time for SHR Recombination
199 PetscScalar
TAUN (const PetscScalar
&Tl
)
201 PetscScalar Na
= ReadDopingNa();
202 PetscScalar Nd
= ReadDopingNd();
203 return TAUN0
/(1+(Na
+Nd
)/NSRHN
)*pow(Tl
/T300
,EXN_TAU
);
205 AutoDScalar
TAUN (const AutoDScalar
&Tl
)
207 PetscScalar Na
= ReadDopingNa();
208 PetscScalar Nd
= ReadDopingNd();
209 return TAUN0
/(1+(Na
+Nd
)/NSRHN
)*pow(Tl
/T300
,EXN_TAU
);
212 //---------------------------------------------------------------------------
213 // hole lift time for SHR Recombination
214 PetscScalar
TAUP (const PetscScalar
&Tl
)
216 PetscScalar Na
= ReadDopingNa();
217 PetscScalar Nd
= ReadDopingNd();
218 return TAUP0
/(1+(Na
+Nd
)/NSRHP
)*pow(Tl
/T300
,EXP_TAU
);
220 AutoDScalar
TAUP (const AutoDScalar
&Tl
)
222 PetscScalar Na
= ReadDopingNa();
223 PetscScalar Nd
= ReadDopingNd();
224 return TAUP0
/(1+(Na
+Nd
)/NSRHP
)*pow(Tl
/T300
,EXP_TAU
);
230 // SRH, Auger, and Direct Recombination
231 PetscScalar ETRAP
; // The trap level (Et - Ei) used in determining the Shockley-Read-Hall recombination rate.
232 PetscScalar AUGN
; // The Auger coefficient for electrons.
233 PetscScalar AUGP
; // The Auger coefficient for holes.
234 PetscScalar C_DIRECT
; // The band-to-band recombination coefficient.
235 // Recombination Including Tunneling
236 PetscScalar M_RTUN
; // The trap-assisted tunneling effective mass. *free electron rest mass m0
237 PetscScalar S_RTUN
; // Band-to-band field power ratio.
238 PetscScalar B_RTUN
; // Band-to-band tunneling rate proportionality factor.
239 PetscScalar E_RTUN
; // Band-to-band reference electric field.
244 ETRAP
= 0.000000e+00*eV
;
245 AUGN
= 0.000000e+00*pow(cm
,6)/s
;
246 AUGP
= 0.000000e+00*pow(cm
,6)/s
;
247 C_DIRECT
= 2.000000e-10*pow(cm
,3)/s
;
248 M_RTUN
= 2.500000e-01;
249 S_RTUN
= 2.000000e+00;
250 B_RTUN
= 0.000000e+00*pow(cm
,S_RTUN
-3)*pow(V
,S_RTUN
*-1)/s
;
251 E_RTUN
= 0.000000e+00*V
/cm
;
255 //---------------------------------------------------------------------------
256 // Direct Recombination
257 PetscScalar
R_Direct (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
259 PetscScalar ni
= nie(Tl
);
260 return C_DIRECT
*(n
*p
-ni
*ni
);
262 AutoDScalar
R_Direct (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
264 AutoDScalar ni
= nie(Tl
);
265 return C_DIRECT
*(n
*p
-ni
*ni
);
268 //---------------------------------------------------------------------------
269 // Auger Recombination
270 PetscScalar
R_Auger (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
272 PetscScalar ni
= nie(Tl
);
273 return AUGN
*(p
*n
*n
-n
*ni
*ni
)+AUGP
*(n
*p
*p
-p
*ni
*ni
);
275 AutoDScalar
R_Auger (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
277 AutoDScalar ni
= nie(Tl
);
278 return AUGN
*(p
*n
*n
-n
*ni
*ni
)+AUGP
*(n
*p
*p
-p
*ni
*ni
);
281 //---------------------------------------------------------------------------
283 PetscScalar
R_SHR (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
285 PetscScalar ni
= nie(Tl
);
286 PetscScalar taun
= TAUN(Tl
);
287 PetscScalar taup
= TAUP(Tl
);
288 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
290 AutoDScalar
R_SHR (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
292 AutoDScalar ni
= nie(Tl
);
293 AutoDScalar taun
= TAUN(Tl
);
294 AutoDScalar taup
= TAUP(Tl
);
295 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
298 //---------------------------------------------------------------------------
299 // Surface SHR Recombination
300 PetscScalar
R_Surf (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
, const PetscScalar
&reciprocal_len
)
302 PetscScalar ni
= nie(Tl
);
303 PetscScalar taun
= TAUN(Tl
);
304 PetscScalar taup
= TAUP(Tl
);
305 taun
= 1.0/(SurfTauN
*reciprocal_len
+ 1.0/taun
);
306 taup
= 1.0/(SurfTauP
*reciprocal_len
+ 1.0/taup
);
307 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
309 AutoDScalar
R_Surf (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
, const PetscScalar
&reciprocal_len
)
311 AutoDScalar ni
= nie(Tl
);
312 AutoDScalar taun
= TAUN(Tl
);
313 AutoDScalar taup
= TAUP(Tl
);
314 taun
= 1.0/(SurfTauN
*reciprocal_len
+ 1.0/taun
);
315 taup
= 1.0/(SurfTauP
*reciprocal_len
+ 1.0/taup
);
316 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
319 //---------------------------------------------------------------------------
320 // total Recombination
321 PetscScalar
Recomb (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
323 PetscScalar ni
= nie(Tl
);
324 PetscScalar taun
= TAUN(Tl
);
325 PetscScalar taup
= TAUP(Tl
);
326 PetscScalar dn
= p
*n
-ni
*ni
;
327 PetscScalar Rshr
= dn
/(taup
*(n
+ni
)+taun
*(p
+ni
));
328 PetscScalar Rdir
= C_DIRECT
*dn
;
329 PetscScalar Raug
= (AUGN
*n
+AUGP
*p
)*dn
;
330 return Rshr
+Rdir
+Raug
;
332 AutoDScalar
Recomb (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
334 AutoDScalar ni
= nie(Tl
);
335 AutoDScalar taun
= TAUN(Tl
);
336 AutoDScalar taup
= TAUP(Tl
);
337 AutoDScalar dn
= p
*n
-ni
*ni
;
338 AutoDScalar Rshr
= dn
/(taup
*(n
+ni
)+taun
*(p
+ni
));
339 AutoDScalar Rdir
= C_DIRECT
*dn
;
340 AutoDScalar Raug
= (AUGN
*n
+AUGP
*p
)*dn
;
341 return Rshr
+Rdir
+Raug
;
343 // End of Recombination
345 //[energy relax time]
363 void RelaxTime_Init()
365 WTN0
= 2.400000E-12*s
;
366 WTN1
= 4.000000E-13*s
;
367 WTN2
= 0.000000E+00*s
;
368 WTN3
= 0.000000E+00*s
;
369 WTN4
= 0.000000E+00*s
;
370 WTN5
= 0.000000E+00*s
;
371 WTNL
= 6.800000E-13*s
;
372 TNL
= 1.866270E+03*K
;
373 WTP0
= 0.000000E+00*s
;
374 WTP1
= 0.000000E+00*s
;
375 WTP2
= 0.000000E+00*s
;
376 WTP3
= 0.000000E+00*s
;
377 WTP4
= 0.000000E+00*s
;
378 WTP5
= 0.000000E+00*s
;
379 WTPL
= 1.000000E-12*s
;
380 TPL
= 0.000000E+00*K
;
383 //---------------------------------------------------------------------------
384 // Electron relaxation time for EBM
385 PetscScalar
ElecEnergyRelaxTime(const PetscScalar
&Tn
,const PetscScalar
&Tl
)
387 PetscScalar r
= (Tn
-Tl
)/TNL
;
388 return WTN1
+(WTN0
-WTN1
)*r
*r
*exp(2-2*r
);
390 AutoDScalar
ElecEnergyRelaxTime(const AutoDScalar
&Tn
,const AutoDScalar
&Tl
)
392 AutoDScalar r
= (Tn
-Tl
)/TNL
;
393 return WTN1
+(WTN0
-WTN1
)*r
*r
*exp(2-2*r
);
396 //---------------------------------------------------------------------------
397 // Hole relaxation time for EBM
398 PetscScalar
HoleEnergyRelaxTime(const PetscScalar
&Tp
,const PetscScalar
&Tl
)
402 AutoDScalar
HoleEnergyRelaxTime(const AutoDScalar
&Tp
,const AutoDScalar
&Tl
)
406 // end of energy relax time
412 PetscScalar VSURFN
; // Thermionic emission velocity of electron
416 ARICHN
= 6.285700e+00*A
/(K
*cm
)/(K
*cm
);
417 ARICHP
= 1.050000e+02*A
/(K
*cm
)/(K
*cm
);
420 PetscScalar
SchottyJsn (PetscScalar n
,PetscScalar Tl
,PetscScalar Vb
)
422 PetscScalar VSURFN
= ARICHN
*Tl
*Tl
/(e
*Nc(Tl
));
423 PetscScalar nb
= Nc(Tl
)*exp(-e
*Vb
/(kb
*Tl
));
424 return -e
*VSURFN
*(n
-nb
);
426 PetscScalar
SchottyJsp (PetscScalar p
,PetscScalar Tl
,PetscScalar Vb
)
428 PetscScalar VSURFP
= ARICHP
*Tl
*Tl
/(e
*Nv(Tl
));
429 PetscScalar pb
= Nv(Tl
)*exp((-Eg(Tl
)+e
*Vb
)/(kb
*Tl
));
430 return e
*VSURFP
*(p
-pb
);
432 PetscScalar
SchottyBarrierLowerring (PetscScalar eps
, PetscScalar E
)
434 return sqrt(e
/(4*3.1415926535*eps
)*E
);
436 PetscScalar
pdSchottyJsn_pdn(PetscScalar n
,PetscScalar Tl
,PetscScalar Vb
)
438 PetscScalar VSURFN
= ARICHN
*Tl
*Tl
/(e
*Nc(Tl
));
441 PetscScalar
pdSchottyJsp_pdp(PetscScalar p
,PetscScalar Tl
,PetscScalar Vb
)
443 PetscScalar VSURFP
= ARICHP
*Tl
*Tl
/(e
*Nv(Tl
));
446 PetscScalar
pdSchottyJsn_pdTl(PetscScalar n
,PetscScalar Tl
,PetscScalar Vb
)
448 //use finite difference approximate
449 PetscScalar dJ
= SchottyJsn(n
,Tl
,Vb
)-SchottyJsn(n
,(1-1e-10)*Tl
,Vb
);
450 return dJ
/(1e-10*Tl
);
452 PetscScalar
pdSchottyJsp_pdTl(PetscScalar p
,PetscScalar Tl
,PetscScalar Vb
)
454 //use finite difference approximate
455 PetscScalar dJ
= SchottyJsp(p
,Tl
,Vb
)-SchottyJsp(p
,(1-1e-10)*Tl
,Vb
);
456 return dJ
/(1e-10*Tl
);
459 PetscScalar
ThermalVn (PetscScalar Tl
)
461 return sqrt(kb
*Tl
/(2*3.14159265359*EffecElecMass(Tl
)));
463 PetscScalar
ThermalVp (PetscScalar Tl
)
465 return sqrt(kb
*Tl
/(2*3.14159265359*EffecHoleMass(Tl
)));
467 PetscScalar
pdThermalVn_pdTl (PetscScalar Tl
)
471 PetscScalar
pdThermalVp_pdTl (PetscScalar Tl
)
477 // [band to band Tunneling]
480 void BBTunneling_Init()
482 A_BTBT
= 0*e
*sqrt(V
)/cm
/s
/V
/V
;
483 B_BTBT
= 0*V
/cm
/pow(e
*V
,PetscScalar(1.5));
486 //----------------------------------------------------------------
487 // band to band Tunneling
488 PetscScalar
BB_Tunneling(const PetscScalar
&Tl
, const PetscScalar
&E
)
490 return A_BTBT
*E
*E
/sqrt(Eg(Tl
))*exp(-B_BTBT
*pow(Eg(Tl
),PetscScalar(1.5))/(E
+1*V
/cm
));
492 AutoDScalar
BB_Tunneling(const AutoDScalar
&Tl
, const AutoDScalar
&E
)
494 return A_BTBT
*E
*E
/sqrt(Eg(Tl
))*exp(-B_BTBT
*pow(Eg(Tl
),PetscScalar(1.5))/(E
+1*V
/cm
));
499 // constructor and destructor
501 GSS_GaAs_BandStructure(const PMIS_Environment
&env
):PMIS_BandStructure(env
)
512 ~GSS_GaAs_BandStructure()
520 PMIS_BandStructure
* PMIS_GaAs_BandStructure_Default (const PMIS_Environment
& env
)
522 return new GSS_GaAs_BandStructure(env
);