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: SiO2 as semiconductor
28 class GSS_SiO2S_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
= 9.000000e+00*eV
;
52 EGALPH
= 0.000000e+00*eV
/K
;
53 EGBETA
= 0.000000e+00*K
;
55 ELECMASS
= 4.200000E-01*me
;
56 HOLEMASS
= 1.000000E+00*me
;
57 NC300
= 2.800000e+19*pow(cm
,-3);
58 NV300
= 1.040000e+19*pow(cm
,-3);
61 N0_BGN
= 1.000000e+17*pow(cm
,-3);
62 V0_BGN
= 0.000000e+00*V
;
63 CON_BGN
= 0.000000e+00*eV
;
66 //---------------------------------------------------------------------------
67 // procedure of Bandgap
68 PetscScalar
Eg (const PetscScalar
&Tl
)
70 return EG300
+EGALPH
*(T300
*T300
/(T300
+EGBETA
) - Tl
*Tl
/(Tl
+EGBETA
));
72 AutoDScalar
Eg (const AutoDScalar
&Tl
)
74 return EG300
+EGALPH
*(T300
*T300
/(T300
+EGBETA
) - Tl
*Tl
/(Tl
+EGBETA
));
77 //---------------------------------------------------------------------------
78 // procedure of Bandgap Narrowing due to Heavy Doping
79 PetscScalar
EgNarrow(const PetscScalar
&Tl
)
81 PetscScalar Na
= ReadDopingNa();
82 PetscScalar Nd
= ReadDopingNd();
83 PetscScalar N
= Na
+Nd
+1.0*pow(cm
,-3);
84 PetscScalar x
= log(N
/N0_BGN
);
85 return V0_BGN
*(x
+sqrt(x
*x
+CON_BGN
));
87 PetscScalar
EgNarrowToEc (const PetscScalar
&Tl
){return 0.5*EgNarrow(Tl
);}
88 PetscScalar
EgNarrowToEv (const PetscScalar
&Tl
){return 0.5*EgNarrow(Tl
);}
90 AutoDScalar
EgNarrow(const AutoDScalar
&Tl
)
92 PetscScalar Na
= ReadDopingNa();
93 PetscScalar Nd
= ReadDopingNd();
94 PetscScalar N
= Na
+Nd
+1.0*pow(cm
,-3);
95 PetscScalar x
= log(N
/N0_BGN
);
96 return V0_BGN
*(x
+sqrt(x
*x
+CON_BGN
));
98 AutoDScalar
EgNarrowToEc (const AutoDScalar
&Tl
){return 0.5*EgNarrow(Tl
);}
99 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
)
113 //---------------------------------------------------------------------------
115 PetscScalar
Nc (const PetscScalar
&Tl
)
117 return 2.540e19
*ELECMASS
/me
*pow(Tl
/T300
,NC_F
);
119 AutoDScalar
Nc (const AutoDScalar
&Tl
)
121 return 2.540e19
*ELECMASS
/me
*pow(Tl
/T300
,NC_F
);
123 PetscScalar
Nv (const PetscScalar
&Tl
)
125 return 2.540e19
*HOLEMASS
/me
*pow(Tl
/T300
,NC_F
);
127 AutoDScalar
Nv (const AutoDScalar
&Tl
)
129 return 2.540e19
*HOLEMASS
/me
*pow(Tl
/T300
,NC_F
);
132 //---------------------------------------------------------------------------
133 // nie, Eg narrow should be considered
134 PetscScalar
nie (const PetscScalar
&Tl
)
136 PetscScalar bandgap
= Eg(Tl
);
137 PetscScalar Nc
= NC300
*pow(Tl
/T300
,NC_F
);
138 PetscScalar Nv
= NV300
*pow(Tl
/T300
,NV_F
);
139 return sqrt(Nc
*Nv
)*exp(-bandgap
/(2*kb
*Tl
))*exp(EgNarrow(Tl
));
141 AutoDScalar
nie (const AutoDScalar
&Tl
)
143 AutoDScalar bandgap
= Eg(Tl
);
144 AutoDScalar Nc
= NC300
*pow(Tl
/T300
,NC_F
);
145 AutoDScalar Nv
= NV300
*pow(Tl
/T300
,NV_F
);
146 return sqrt(Nc
*Nv
)*exp(-bandgap
/(2*kb
*Tl
))*exp(EgNarrow(Tl
));
154 PetscScalar TAUN0
; // The Shockley-Read-Hall electron lifetime.
155 PetscScalar TAUP0
; // The Shockley-Read-Hall hole lifetime.
156 PetscScalar SurfTauN
; // The electron surface recombination velocity.
157 PetscScalar SurfTauP
; // The hole surface recombination velocity.
158 //Concentration-Dependent Lifetimes
159 PetscScalar NSRHN
; // The Shockley-Read-Hall concentration parameter for electrons.
160 PetscScalar AN
; // The constant term in the concentration-dependent expression for electron lifetime.
161 PetscScalar BN
; // The linear term coefficient in the concentration-dependent expression for electron lifetime.
162 PetscScalar CN
; // The exponential term coefficient in the concentration-dependent expression for electron lifetime.
163 PetscScalar EN
; // The exponent in the concentration-dependent expression for electron lifetime.
164 PetscScalar NSRHP
; // The Shockley-Read-Hall concentration parameter for holes.
165 PetscScalar AP
; // The constant term in the concentration-dependent expression for hole lifetime.
166 PetscScalar BP
; // The linear term coefficient in the concentration-dependent expression for hole lifetime.
167 PetscScalar CP
; // The exponential term coefficient in the concentration-dependent expression for hole lifetime.
168 PetscScalar EP
; // The exponent in the concentration-dependent expression for hole lifetime.
169 // Lattice Temperature-Dependent Lifetimes
170 PetscScalar EXN_TAU
; // The exponent of lattice temperature dependent electron lifetime.
171 PetscScalar EXP_TAU
; // The exponent of lattice temperature dependent hole lifetime.
173 //Init value, the dummy value is not exact!
176 TAUN0
= 1.000000e+00*s
;
177 TAUP0
= 1.000000e+00*s
;
178 SurfTauN
= 0.000000e+00*cm
/s
;
179 SurfTauP
= 0.000000e+00*cm
/s
;
180 NSRHN
= 5.000000e+16*pow(cm
,-3);
185 NSRHP
= 5.000000e+16*pow(cm
,-3);
190 EXN_TAU
= 0.000000e+00;
191 EXP_TAU
= 0.000000e+00;
195 //---------------------------------------------------------------------------
196 // electron lift time for SHR Recombination
197 PetscScalar
TAUN (const PetscScalar
&Tl
)
199 PetscScalar Na
= ReadDopingNa();
200 PetscScalar Nd
= ReadDopingNd();
201 return TAUN0
/(1+(Na
+Nd
)/NSRHN
)*pow(Tl
/T300
,EXN_TAU
);
203 AutoDScalar
TAUN (const AutoDScalar
&Tl
)
205 PetscScalar Na
= ReadDopingNa();
206 PetscScalar Nd
= ReadDopingNd();
207 return TAUN0
/(1+(Na
+Nd
)/NSRHN
)*pow(Tl
/T300
,EXN_TAU
);
210 //---------------------------------------------------------------------------
211 // hole lift time for SHR Recombination
212 PetscScalar
TAUP (const PetscScalar
&Tl
)
214 PetscScalar Na
= ReadDopingNa();
215 PetscScalar Nd
= ReadDopingNd();
216 return TAUP0
/(1+(Na
+Nd
)/NSRHP
)*pow(Tl
/T300
,EXP_TAU
);
218 AutoDScalar
TAUP (const AutoDScalar
&Tl
)
220 PetscScalar Na
= ReadDopingNa();
221 PetscScalar Nd
= ReadDopingNd();
222 return TAUP0
/(1+(Na
+Nd
)/NSRHP
)*pow(Tl
/T300
,EXP_TAU
);
226 //[the fit parameter for density-gradient solver]
227 PetscScalar
Gamman () {return 1.0;}
228 PetscScalar
Gammap () {return 1.0;}
232 // SRH, Auger, and Direct Recombination
233 PetscScalar ETRAP
; // The trap level (Et - Ei) used in determining the Shockley-Read-Hall recombination rate.
234 PetscScalar AUGN
; // The Auger coefficient for electrons.
235 PetscScalar AUGP
; // The Auger coefficient for holes.
236 PetscScalar C_DIRECT
; // The band-to-band recombination coefficient.
240 ETRAP
= 0.000000e+00*eV
;
241 AUGN
= 0.000000e+00*pow(cm
,6)/s
;
242 AUGP
= 0.000000e+00*pow(cm
,6)/s
;
243 C_DIRECT
= 0.000000e+00*pow(cm
,3)/s
;
247 //---------------------------------------------------------------------------
248 // Direct Recombination
249 PetscScalar
R_Direct (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
251 PetscScalar ni
= nie(Tl
);
252 return C_DIRECT
*(n
*p
-ni
*ni
);
254 AutoDScalar
R_Direct (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
256 AutoDScalar ni
= nie(Tl
);
257 return C_DIRECT
*(n
*p
-ni
*ni
);
260 //---------------------------------------------------------------------------
261 // Auger Recombination
262 PetscScalar
R_Auger (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
264 PetscScalar ni
= nie(Tl
);
265 return AUGN
*(p
*n
*n
-n
*ni
*ni
)+AUGP
*(n
*p
*p
-p
*ni
*ni
);
267 AutoDScalar
R_Auger (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
269 AutoDScalar ni
= nie(Tl
);
270 return AUGN
*(p
*n
*n
-n
*ni
*ni
)+AUGP
*(n
*p
*p
-p
*ni
*ni
);
273 //---------------------------------------------------------------------------
275 PetscScalar
R_SHR (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
277 PetscScalar ni
= nie(Tl
);
278 PetscScalar taun
= TAUN(Tl
);
279 PetscScalar taup
= TAUP(Tl
);
280 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
282 AutoDScalar
R_SHR (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
284 AutoDScalar ni
= nie(Tl
);
285 AutoDScalar taun
= TAUN(Tl
);
286 AutoDScalar taup
= TAUP(Tl
);
287 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
290 //---------------------------------------------------------------------------
291 // Surface SHR Recombination
292 PetscScalar
R_Surf (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
, const PetscScalar
&reciprocal_len
)
294 PetscScalar ni
= nie(Tl
);
295 PetscScalar taun
= TAUN(Tl
);
296 PetscScalar taup
= TAUP(Tl
);
297 taun
= 1.0/(SurfTauN
*reciprocal_len
+ 1.0/taun
);
298 taup
= 1.0/(SurfTauP
*reciprocal_len
+ 1.0/taup
);
299 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
301 AutoDScalar
R_Surf (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
, const PetscScalar
&reciprocal_len
)
303 AutoDScalar ni
= nie(Tl
);
304 AutoDScalar taun
= TAUN(Tl
);
305 AutoDScalar taup
= TAUP(Tl
);
306 taun
= 1.0/(SurfTauN
*reciprocal_len
+ 1.0/taun
);
307 taup
= 1.0/(SurfTauP
*reciprocal_len
+ 1.0/taup
);
308 return (p
*n
-ni
*ni
)/(taup
*(n
+ni
)+taun
*(p
+ni
));
311 //---------------------------------------------------------------------------
312 // total Recombination
313 PetscScalar
Recomb (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
)
315 PetscScalar ni
= nie(Tl
);
316 PetscScalar taun
= TAUN(Tl
);
317 PetscScalar taup
= TAUP(Tl
);
318 PetscScalar dn
= p
*n
-ni
*ni
;
319 PetscScalar Rshr
= dn
/(taup
*(n
+ni
)+taun
*(p
+ni
));
320 PetscScalar Rdir
= C_DIRECT
*dn
;
321 PetscScalar Raug
= (AUGN
*n
+AUGP
*p
)*dn
;
322 return Rshr
+Rdir
+Raug
;
324 AutoDScalar
Recomb (const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
)
326 AutoDScalar ni
= nie(Tl
);
327 AutoDScalar taun
= TAUN(Tl
);
328 AutoDScalar taup
= TAUP(Tl
);
329 AutoDScalar dn
= p
*n
-ni
*ni
;
330 AutoDScalar Rshr
= dn
/(taup
*(n
+ni
)+taun
*(p
+ni
));
331 AutoDScalar Rdir
= C_DIRECT
*dn
;
332 AutoDScalar Raug
= (AUGN
*n
+AUGP
*p
)*dn
;
333 return Rshr
+Rdir
+Raug
;
336 // End of Recombination
339 //[energy relax time]
340 void RelaxTime_Init()
344 //---------------------------------------------------------------------------
345 // Electron relaxation time for EBM
346 PetscScalar
ElecEnergyRelaxTime(const PetscScalar
&Tn
,const PetscScalar
&Tl
)
348 return 1e-12*s
; //this dummy value is not exact
350 AutoDScalar
ElecEnergyRelaxTime(const AutoDScalar
&Tn
,const AutoDScalar
&Tl
)
352 return 1e-12*s
; //this dummy value is not exact
355 //---------------------------------------------------------------------------
356 // Hole relaxation time for EBM
357 PetscScalar
HoleEnergyRelaxTime(const PetscScalar
&Tp
,const PetscScalar
&Tl
)
359 return 1e-12*s
; //this dummy value is not exact
361 AutoDScalar
HoleEnergyRelaxTime(const AutoDScalar
&Tp
,const AutoDScalar
&Tl
)
363 return 1e-12*s
; //this dummy value is not exact
365 // end of energy relax time
368 // [Schottky and Heterojunction]
371 PetscScalar VSURFN
; // Thermionic emission velocity of electron
376 ARICHN
= 1.100000e+02*A
/(K
*cm
)/(K
*cm
);
377 ARICHP
= 3.000000e+01*A
/(K
*cm
)/(K
*cm
);
381 PetscScalar
SchottyJsn (PetscScalar n
,PetscScalar Tl
,PetscScalar Vb
)
383 PetscScalar VSURFN
= ARICHN
*Tl
*Tl
/(e
*Nc(Tl
));
384 PetscScalar nb
= Nc(Tl
)*exp(-e
*Vb
/(kb
*Tl
));
385 return -e
*VSURFN
*(n
-nb
);
387 PetscScalar
SchottyJsp (PetscScalar p
,PetscScalar Tl
,PetscScalar Vb
)
389 PetscScalar VSURFP
= ARICHP
*Tl
*Tl
/(e
*Nv(Tl
));
390 PetscScalar pb
= Nv(Tl
)*exp((-Eg(Tl
)+e
*Vb
)/(kb
*Tl
));
391 return e
*VSURFP
*(p
-pb
);
393 PetscScalar
SchottyBarrierLowerring (PetscScalar eps
, PetscScalar E
)
395 return sqrt(e
/(4*3.1415926535*eps
)*E
);
397 PetscScalar
pdSchottyJsn_pdn(PetscScalar n
,PetscScalar Tl
,PetscScalar Vb
)
399 PetscScalar VSURFN
= ARICHN
*Tl
*Tl
/(e
*Nc(Tl
));
402 PetscScalar
pdSchottyJsp_pdp(PetscScalar p
,PetscScalar Tl
,PetscScalar Vb
)
404 PetscScalar VSURFP
= ARICHP
*Tl
*Tl
/(e
*Nv(Tl
));
407 PetscScalar
pdSchottyJsn_pdTl(PetscScalar n
,PetscScalar Tl
,PetscScalar Vb
)
409 //use finite difference approximate
410 PetscScalar dJ
= SchottyJsn(n
,Tl
,Vb
)-SchottyJsn(n
,(1-1e-10)*Tl
,Vb
);
411 return dJ
/(1e-10*Tl
);
413 PetscScalar
pdSchottyJsp_pdTl(PetscScalar p
,PetscScalar Tl
,PetscScalar Vb
)
415 //use finite difference approximate
416 PetscScalar dJ
= SchottyJsp(p
,Tl
,Vb
)-SchottyJsp(p
,(1-1e-10)*Tl
,Vb
);
417 return dJ
/(1e-10*Tl
);
419 PetscScalar
ThermalVn (PetscScalar Tl
)
421 return sqrt(kb
*Tl
/(2*3.14159265359*EffecElecMass(Tl
)));
423 PetscScalar
ThermalVp (PetscScalar Tl
)
425 return sqrt(kb
*Tl
/(2*3.14159265359*EffecHoleMass(Tl
)));
427 PetscScalar
pdThermalVn_pdTl (PetscScalar Tl
)
431 PetscScalar
pdThermalVp_pdTl (PetscScalar Tl
)
437 // [band to band Tunneling]
440 void BBTunneling_Init()
442 A_BTBT
= 0.000000E+00*sqrt(e
*V
)/cm
/s
/V
/V
;
443 B_BTBT
= 0.000000E+00*V
/cm
/pow(e
*V
,PetscScalar(1.5));
446 //----------------------------------------------------------------
447 // band to band Tunneling
448 PetscScalar
BB_Tunneling(const PetscScalar
&Tl
, const PetscScalar
&E
)
450 return A_BTBT
*E
*E
/sqrt(Eg(Tl
))*exp(-B_BTBT
*pow(Eg(Tl
),PetscScalar(1.5))/(E
+1*V
/cm
));
452 AutoDScalar
BB_Tunneling(const AutoDScalar
&Tl
, const AutoDScalar
&E
)
454 return A_BTBT
*E
*E
/sqrt(Eg(Tl
))*exp(-B_BTBT
*pow(Eg(Tl
),PetscScalar(1.5))/(E
+1*V
/cm
));
458 // constructor and destructor
460 GSS_SiO2S_BandStructure(const PMIS_Environment
&env
):PMIS_BandStructure(env
)
471 ~GSS_SiO2S_BandStructure()
479 PMIS_BandStructure
* PMIS_SiO2S_BandStructure_Default (const PMIS_Environment
& env
)
481 return new GSS_SiO2S_BandStructure(env
);