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 /*****************************************************************************/
28 class GSS_InN_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 //Source: data base of DESSIS
53 EGALPH
= 2.45e-4*eV
/K
;
54 EGBETA
= 6.2400e+02*K
;
56 NC300
= 1.3000e+18*pow(cm
,-3);
57 NV300
= 5.3000e+19*pow(cm
,-3);
60 ELECMASS
= me
/pow(NC300
/(2.540e19
*pow(cm
,-3)),PetscScalar(2.0/3.0));
61 HOLEMASS
= me
/pow(NV300
/(2.540e19
*pow(cm
,-3)),PetscScalar(2.0/3.0));
62 N0_BGN
= 1.000000e+17*pow(cm
,-3);
63 V0_BGN
= 0.000000e+00*V
;
64 CON_BGN
= 0.000000e+00*eV
;
67 //---------------------------------------------------------------------------
68 // procedure of Bandgap
69 PetscScalar
Eg (const PetscScalar
&Tl
)
71 return EG300
- EGALPH
*Tl
*Tl
/(EGBETA
+Tl
);
73 AutoDScalar
Eg (const AutoDScalar
&Tl
)
75 return EG300
- EGALPH
*Tl
*Tl
/(EGBETA
+Tl
);
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
);}
103 //---------------------------------------------------------------------------
104 //electron and hole effect mass
105 PetscScalar
EffecElecMass (const PetscScalar
&Tl
)
109 PetscScalar
EffecHoleMass (const PetscScalar
&Tl
)
115 //---------------------------------------------------------------------------
117 PetscScalar
Nc (const PetscScalar
&Tl
)
119 return NC300
*pow(Tl
/T300
,NC_F
);
121 AutoDScalar
Nc (const AutoDScalar
&Tl
)
123 return NC300
*pow(Tl
/T300
,NC_F
);
126 PetscScalar
Nv (const PetscScalar
&Tl
)
128 return NV300
*pow(Tl
/T300
,NV_F
);
130 AutoDScalar
Nv (const AutoDScalar
&Tl
)
132 return NV300
*pow(Tl
/T300
,NV_F
);
135 //---------------------------------------------------------------------------
137 PetscScalar
nie (const PetscScalar
&Tl
)
139 PetscScalar bandgap
= Eg(Tl
);
140 PetscScalar Nc
= NC300
*pow(Tl
/T300
,NC_F
);
141 PetscScalar Nv
= NV300
*pow(Tl
/T300
,NV_F
);
142 return sqrt(Nc
*Nv
)*exp(-bandgap
/(2*kb
*Tl
))*exp(EgNarrow(Tl
));
144 AutoDScalar
nie (const AutoDScalar
&Tl
)
146 AutoDScalar bandgap
= Eg(Tl
);
147 AutoDScalar Nc
= NC300
*pow(Tl
/T300
,NC_F
);
148 AutoDScalar Nv
= NV300
*pow(Tl
/T300
,NV_F
);
149 return sqrt(Nc
*Nv
)*exp(-bandgap
/(2*kb
*Tl
))*exp(EgNarrow(Tl
));
157 PetscScalar TAUN0
; // The Shockley-Read-Hall electron lifetime.
158 PetscScalar TAUP0
; // The Shockley-Read-Hall hole lifetime.
159 PetscScalar SurfTauN
; // The electron surface recombination velocity.
160 PetscScalar SurfTauP
; // The hole surface recombination velocity.
161 //Concentration-Dependent Lifetimes
162 PetscScalar NSRHN
; // The Shockley-Read-Hall concentration parameter for electrons.
163 PetscScalar AN
; // The constant term in the concentration-dependent expression for electron lifetime.
164 PetscScalar BN
; // The linear term coefficient in the concentration-dependent expression for electron lifetime.
165 PetscScalar CN
; // The exponential term coefficient in the concentration-dependent expression for electron lifetime.
166 PetscScalar EN
; // The exponent in the concentration-dependent expression for electron lifetime.
167 PetscScalar NSRHP
; // The Shockley-Read-Hall concentration parameter for holes.
168 PetscScalar AP
; // The constant term in the concentration-dependent expression for hole lifetime.
169 PetscScalar BP
; // The linear term coefficient in the concentration-dependent expression for hole lifetime.
170 PetscScalar CP
; // The exponential term coefficient in the concentration-dependent expression for hole lifetime.
171 PetscScalar EP
; // The exponent in the concentration-dependent expression for hole lifetime.
172 // Lattice Temperature-Dependent Lifetimes
173 PetscScalar EXN_TAU
; // The exponent of lattice temperature dependent electron lifetime.
174 PetscScalar EXP_TAU
; // The exponent of lattice temperature dependent hole lifetime.
179 //Source: Semiconductors on NSM
180 TAUN0
= 1.000000e-09*s
;
181 TAUP0
= 1.000000e-09*s
;
182 SurfTauN
= 0.000000e+00*cm
/s
;
183 SurfTauP
= 0.000000e+00*cm
/s
;
184 NSRHN
= 1.000000e+16*pow(cm
,-3);
189 NSRHP
= 1.000000e+16*pow(cm
,-3);
194 EXN_TAU
= -1.50000e+00;
195 EXP_TAU
= -1.50000e+00;
199 //---------------------------------------------------------------------------
200 // electron lift time for SHR Recombination
201 PetscScalar
TAUN (const PetscScalar
&Tl
)
203 PetscScalar Na
= ReadDopingNa();
204 PetscScalar Nd
= ReadDopingNd();
205 return TAUN0
/(1+(Na
+Nd
)/NSRHN
)*pow(Tl
/T300
,EXN_TAU
);
207 AutoDScalar
TAUN (const AutoDScalar
&Tl
)
209 PetscScalar Na
= ReadDopingNa();
210 PetscScalar Nd
= ReadDopingNd();
211 return TAUN0
/(1+(Na
+Nd
)/NSRHN
)*pow(Tl
/T300
,EXN_TAU
);
214 //---------------------------------------------------------------------------
215 // hole lift time for SHR Recombination
216 PetscScalar
TAUP (const PetscScalar
&Tl
)
218 PetscScalar Na
= ReadDopingNa();
219 PetscScalar Nd
= ReadDopingNd();
220 return TAUP0
/(1+(Na
+Nd
)/NSRHP
)*pow(Tl
/T300
,EXP_TAU
);
222 AutoDScalar
TAUP (const AutoDScalar
&Tl
)
224 PetscScalar Na
= ReadDopingNa();
225 PetscScalar Nd
= ReadDopingNd();
226 return TAUP0
/(1+(Na
+Nd
)/NSRHP
)*pow(Tl
/T300
,EXP_TAU
);
230 //the fit parameter for density-gradient solver
231 PetscScalar
Gamman () {return 1.0;}
232 PetscScalar
Gammap () {return 1.0;}
236 // SRH, Auger, and Direct Recombination
237 PetscScalar ETRAP
; // The trap level (Et - Ei) used in determining the Shockley-Read-Hall recombination rate.
238 PetscScalar AUGN
; // The Auger coefficient for electrons.
239 PetscScalar AUGP
; // The Auger coefficient for holes.
240 PetscScalar C_DIRECT
; // The band-to-band recombination coefficient.
245 //Source: Semiconductors on NSM
246 ETRAP
= 0.000000e+00*eV
;
247 AUGN
= 1.0000e-30*pow(cm
,6)/s
;
248 AUGP
= 1.0000e-30*pow(cm
,6)/s
;
249 C_DIRECT
= 2.000000e-10*pow(cm
,3)/s
;
253 //---------------------------------------------------------------------------
254 // Direct Recombination
255 PetscScalar
R_Direct (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
257 PetscScalar ni
= nie(Tl
);
258 return C_DIRECT
*(n
*p
-ni
*ni
);
260 AutoDScalar
R_Direct (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
262 AutoDScalar ni
= nie(Tl
);
263 return C_DIRECT
*(n
*p
-ni
*ni
);
266 //---------------------------------------------------------------------------
267 // Auger Recombination
268 PetscScalar
R_Auger (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
270 PetscScalar ni
= nie(Tl
);
271 return AUGN
*(p
*n
*n
-n
*ni
*ni
)+AUGP
*(n
*p
*p
-p
*ni
*ni
);
273 AutoDScalar
R_Auger (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
275 AutoDScalar ni
= nie(Tl
);
276 return AUGN
*(p
*n
*n
-n
*ni
*ni
)+AUGP
*(n
*p
*p
-p
*ni
*ni
);
279 //---------------------------------------------------------------------------
281 PetscScalar
R_SHR (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
283 PetscScalar ni
= nie(Tl
);
284 PetscScalar taun
= TAUN(Tl
);
285 PetscScalar taup
= TAUP(Tl
);
286 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
288 AutoDScalar
R_SHR (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
290 AutoDScalar ni
= nie(Tl
);
291 AutoDScalar taun
= TAUN(Tl
);
292 AutoDScalar taup
= TAUP(Tl
);
293 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
296 //---------------------------------------------------------------------------
297 // Surface SHR Recombination
298 PetscScalar
R_Surf (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
, const PetscScalar
&reciprocal_len
)
300 PetscScalar ni
= nie(Tl
);
301 PetscScalar taun
= TAUN(Tl
);
302 PetscScalar taup
= TAUP(Tl
);
303 taun
= 1.0/(SurfTauN
*reciprocal_len
+ 1.0/taun
);
304 taup
= 1.0/(SurfTauP
*reciprocal_len
+ 1.0/taup
);
305 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
307 AutoDScalar
R_Surf (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
, const PetscScalar
&reciprocal_len
)
309 AutoDScalar ni
= nie(Tl
);
310 AutoDScalar taun
= TAUN(Tl
);
311 AutoDScalar taup
= TAUP(Tl
);
312 taun
= 1.0/(SurfTauN
*reciprocal_len
+ 1.0/taun
);
313 taup
= 1.0/(SurfTauP
*reciprocal_len
+ 1.0/taup
);
314 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
317 //---------------------------------------------------------------------------
318 // total Recombination
319 PetscScalar
Recomb (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
321 PetscScalar ni
= nie(Tl
);
322 PetscScalar taun
= TAUN(Tl
);
323 PetscScalar taup
= TAUP(Tl
);
324 PetscScalar dn
= p
*n
-ni
*ni
;
325 PetscScalar Rshr
= dn
/(taup
*(n
+ni
)+taun
*(p
+ni
));
326 PetscScalar Rdir
= C_DIRECT
*dn
;
327 PetscScalar Raug
= (AUGN
*n
+AUGP
*p
)*dn
;
328 return Rshr
+Rdir
+Raug
;
330 AutoDScalar
Recomb (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
332 AutoDScalar ni
= nie(Tl
);
333 AutoDScalar taun
= TAUN(Tl
);
334 AutoDScalar taup
= TAUP(Tl
);
335 AutoDScalar dn
= p
*n
-ni
*ni
;
336 AutoDScalar Rshr
= dn
/(taup
*(n
+ni
)+taun
*(p
+ni
));
337 AutoDScalar Rdir
= C_DIRECT
*dn
;
338 AutoDScalar Raug
= (AUGN
*n
+AUGP
*p
)*dn
;
339 return Rshr
+Rdir
+Raug
;
341 // End of Recombination
344 //[energy relax time]
346 void RelaxTime_Init()
350 //---------------------------------------------------------------------------
351 // Electron relaxation time for EBM
352 PetscScalar
ElecEnergyRelaxTime(const PetscScalar
&Tn
,const PetscScalar
&Tl
)
354 return 0.3e-12*s
;//Source: data base of DESSIS
356 AutoDScalar
ElecEnergyRelaxTime(const AutoDScalar
&Tn
,const AutoDScalar
&Tl
)
358 return 0.3e-12*s
;//Source: data base of DESSIS
361 //---------------------------------------------------------------------------
362 // Hole relaxation time for EBM
363 PetscScalar
HoleEnergyRelaxTime(const PetscScalar
&Tp
,const PetscScalar
&Tl
)
365 return 0.3e-12*s
;//Source: data base of DESSIS
367 AutoDScalar
HoleEnergyRelaxTime(const AutoDScalar
&Tp
,const AutoDScalar
&Tl
)
369 return 0.3e-12*s
;//Source: data base of DESSIS
371 // end of energy relax time
373 // [Schottky and Heterojunction]
376 PetscScalar VSURFN
; // Thermionic emission velocity of electron
381 //use the parameters for GaAs instead
382 ARICHN
= 6.285700e+00*A
/(K
*cm
)/(K
*cm
);
383 ARICHP
= 1.050000e+02*A
/(K
*cm
)/(K
*cm
);
387 PetscScalar
SchottyJsn (PetscScalar n
,PetscScalar Tl
,PetscScalar Vb
)
389 PetscScalar VSURFN
= ARICHN
*Tl
*Tl
/(e
*Nc(Tl
));
390 PetscScalar nb
= Nc(Tl
)*exp(-e
*Vb
/(kb
*Tl
));
391 return -e
*VSURFN
*(n
-nb
);
393 PetscScalar
SchottyJsp (PetscScalar p
,PetscScalar Tl
,PetscScalar Vb
)
395 PetscScalar VSURFP
= ARICHP
*Tl
*Tl
/(e
*Nv(Tl
));
396 PetscScalar pb
= Nv(Tl
)*exp((-Eg(Tl
)+e
*Vb
)/(kb
*Tl
));
397 return e
*VSURFP
*(p
-pb
);
399 PetscScalar
SchottyBarrierLowerring (PetscScalar eps
, PetscScalar E
)
401 return sqrt(e
/(4*3.1415926535*eps
)*E
);
403 PetscScalar
pdSchottyJsn_pdn(PetscScalar n
,PetscScalar Tl
,PetscScalar Vb
)
405 PetscScalar VSURFN
= ARICHN
*Tl
*Tl
/(e
*Nc(Tl
));
408 PetscScalar
pdSchottyJsp_pdp(PetscScalar p
,PetscScalar Tl
,PetscScalar Vb
)
410 PetscScalar VSURFP
= ARICHP
*Tl
*Tl
/(e
*Nv(Tl
));
413 PetscScalar
pdSchottyJsn_pdTl(PetscScalar n
,PetscScalar Tl
,PetscScalar Vb
)
415 //use finite difference approximate
416 PetscScalar dJ
= SchottyJsn(n
,Tl
,Vb
)-SchottyJsn(n
,(1-1e-10)*Tl
,Vb
);
417 return dJ
/(1e-10*Tl
);
419 PetscScalar
pdSchottyJsp_pdTl(PetscScalar p
,PetscScalar Tl
,PetscScalar Vb
)
421 //use finite difference approximate
422 PetscScalar dJ
= SchottyJsp(p
,Tl
,Vb
)-SchottyJsp(p
,(1-1e-10)*Tl
,Vb
);
423 return dJ
/(1e-10*Tl
);
425 PetscScalar
ThermalVn (PetscScalar Tl
)
427 return sqrt(kb
*Tl
/(2*3.14159265359*EffecElecMass(Tl
)));
429 PetscScalar
ThermalVp (PetscScalar Tl
)
431 return sqrt(kb
*Tl
/(2*3.14159265359*EffecHoleMass(Tl
)));
433 PetscScalar
pdThermalVn_pdTl (PetscScalar Tl
)
437 PetscScalar
pdThermalVp_pdTl (PetscScalar Tl
)
443 // [band to band Tunneling]
446 void BBTunneling_Init()
448 A_BTBT
= 0*sqrt(e
*V
)/cm
/s
/V
/V
;
449 B_BTBT
= 0*V
/cm
/pow(e
*V
,PetscScalar(1.5));
452 //----------------------------------------------------------------
453 // band to band Tunneling
454 PetscScalar
BB_Tunneling(const PetscScalar
&Tl
, const PetscScalar
&E
)
456 return A_BTBT
*E
*E
/sqrt(Eg(Tl
))*exp(-B_BTBT
*pow(Eg(Tl
),PetscScalar(1.5))/(E
+1*V
/cm
));
458 AutoDScalar
BB_Tunneling(const AutoDScalar
&Tl
, const AutoDScalar
&E
)
460 return A_BTBT
*E
*E
/sqrt(Eg(Tl
))*exp(-B_BTBT
*pow(Eg(Tl
),PetscScalar(1.5))/(E
+1*V
/cm
));
464 // constructor and destructor
466 GSS_InN_BandStructure(const PMIS_Environment
&env
):PMIS_BandStructure(env
)
477 ~GSS_InN_BandStructure()
485 PMIS_BandStructure
* PMIS_InN_BandStructure_Default (const PMIS_Environment
& env
)
487 return new GSS_InN_BandStructure(env
);