initial checkin, based on GSS 0.46 CVS
[gss-tcad.git] / src / material / SiGe / SiGe_mob_Lucent.cc
blob1c595a9594d0afe5d69962c8dfff3557fd127087
1 /*****************************************************************************/
2 /* */
3 /* 8888888 88888888 88888888 */
4 /* 8 8 8 */
5 /* 8 8 8 */
6 /* 8 88888888 88888888 */
7 /* 8 8888 8 8 */
8 /* 8 8 8 8 */
9 /* 888888 888888888 888888888 */
10 /* */
11 /* A Two-Dimensional General Purpose Semiconductor Simulator. */
12 /* */
13 /* GSS material database Version 0.4 */
14 /* Last update: Feb 17, 2006 */
15 /* */
16 /* Gong Ding */
17 /* gdiso@ustc.edu */
18 /* NINT, No.69 P.O.Box, Xi'an City, China */
19 /* */
20 /*****************************************************************************/
22 // Material Type: Si(1-x)Ge(x). (in fact, use parameters for Si instead.)
25 #include "PMI.h"
27 class GSS_Mob_Lucent : public PMIS_Mobility
29 private:
30 // parameters for Lucent mobility
31 PetscScalar MMNN_UM;
32 PetscScalar MMXN_UM;
33 PetscScalar NRFN_UM;
34 PetscScalar ALPN_UM;
35 PetscScalar TETN_UM;
36 PetscScalar NRFD_UM;
37 PetscScalar CRFD_UM;
39 PetscScalar MMNP_UM;
40 PetscScalar MMXP_UM;
41 PetscScalar NRFP_UM;
42 PetscScalar ALPP_UM;
43 PetscScalar TETP_UM;
44 PetscScalar NRFA_UM;
45 PetscScalar CRFA_UM;
46 PetscScalar NSC_REF;
47 PetscScalar CAR_REF;
48 PetscScalar me_over_m0;
49 PetscScalar mh_over_m0;
50 PetscScalar me_over_mh;
51 // temperature
52 PetscScalar T300;
53 // parameters for transvers field modification
54 PetscScalar AN_LUC;
55 PetscScalar AP_LUC;
56 PetscScalar BN_LUC;
57 PetscScalar BP_LUC;
58 PetscScalar CN_LUC;
59 PetscScalar CP_LUC;
60 //PetscScalar DN_LUC;
61 //PetscScalar DP_LUC;
62 PetscScalar FN_LUC;
63 PetscScalar FP_LUC;
64 PetscScalar KN_LUC;
65 PetscScalar KP_LUC;
66 PetscScalar EXN4_LUC;
67 PetscScalar EXP4_LUC;
68 PetscScalar EXN9_LUC;
69 PetscScalar EXP9_LUC;
70 // parameters for parallel field modification
71 PetscScalar BETAN;
72 PetscScalar BETAP;
74 void Mob_Lucent_Init()
76 MMNN_UM = 5.220000E+01*cm*cm/V/s;
77 MMXN_UM = 1.417000E+03*cm*cm/V/s;
78 NRFN_UM = 9.680000E+16*pow(cm,-3);
79 ALPN_UM = 6.800000E-01;
80 TETN_UM = 2.285000E+00;
81 NRFD_UM = 4.000000E+20*pow(cm,-3);
82 CRFD_UM = 2.100000E-01;
84 MMNP_UM = 4.490000E+01*cm*cm/V/s;
85 MMXP_UM = 4.705000E+02*cm*cm/V/s;
86 NRFP_UM = 2.230000E+17*pow(cm,-3);
87 ALPP_UM = 7.190000E-01;
88 TETP_UM = 2.247000E+00;
89 NRFA_UM = 7.200000E+20*pow(cm,-3);
90 CRFA_UM = 5.000000E-01;
92 NSC_REF = 3.97e13*pow(cm,-2);
93 CAR_REF = 1.36e20*pow(cm,-3);
94 me_over_m0 = 1.0;
95 mh_over_m0 = 1.258;
96 me_over_mh = 1.0/1.258;
97 T300 = 300.0*K;
99 EXN4_LUC = 2.330000E-02;
100 EXP4_LUC = 1.190000E-02;
101 EXN9_LUC = 7.670000E-02;
102 EXP9_LUC = 1.230000E-01;
103 AN_LUC = 2.580000E+00;
104 AP_LUC = 2.180000E+00;
105 BN_LUC = 3.610000E+07*cm/s;
106 BP_LUC = 1.510000E+07*cm/s;
107 CN_LUC = 1.700000E+04*cm*cm/V/s*pow(V/cm,PetscScalar(1.0/3.0))*pow(cm,3*EXN4_LUC);
108 CP_LUC = 4.180000E+03*cm*cm/V/s*pow(V/cm,PetscScalar(1.0/3.0))*pow(cm,3*EXP4_LUC);
109 //DN_LUC=3.580000E+18*cm*cm/V/s*pow(V/cm,rn);
110 //DP_LUC=4.100000E+15*cm*cm/V/s*pow(V/cm,rp);
111 FN_LUC = 6.850000E-21*pow(cm,3*(1-EXN9_LUC));
112 FP_LUC = 7.820000E-21*pow(cm,3*(1-EXP9_LUC));
113 KN_LUC = 1.700000E+00;
114 KP_LUC = 9.000000E-01;
116 BETAN = 2.000000E+00;
117 BETAP = 1.000000E+00;
120 //---------------------------------------------------------------------------
121 // Electron low field bulk mobility
122 PetscScalar ElecMobPhilips(const PetscScalar &p,const PetscScalar &n,const PetscScalar &Tl) const
124 PetscScalar mu_lattice = MMXN_UM*pow(Tl/T300,-TETN_UM);
125 PetscScalar mu1 = MMXN_UM*MMXN_UM/(MMXN_UM-MMNN_UM)*pow(Tl/T300,3*ALPN_UM-1.5);
126 PetscScalar mu2 = MMXN_UM*MMNN_UM/(MMXN_UM-MMNN_UM)*sqrt(T300/Tl);
127 PetscScalar Na = ReadDopingNa()+1e0*pow(cm,-3);
128 PetscScalar Nd = ReadDopingNd()+1e0*pow(cm,-3);
129 PetscScalar Nds = Nd*(1.0+1.0/(CRFD_UM+(NRFD_UM/Nd)*(NRFD_UM/Nd)));
130 PetscScalar Nas = Na*(1.0+1.0/(CRFA_UM+(NRFA_UM/Na)*(NRFA_UM/Na)));
131 PetscScalar Nsc = Nds+Nas+fabs(p);
133 PetscScalar P = 1.0/(2.459/(NSC_REF/pow(Nsc,PetscScalar(2.0/3.0)))+3.828/(CAR_REF/fabs(n+p)*me_over_m0))*(Tl/T300)*(Tl/T300);
134 PetscScalar pp1 = pow(P,PetscScalar(0.6478));
135 PetscScalar F = (0.7643*pp1+2.2999+6.5502*me_over_mh)/(pp1+2.3670-0.8552*me_over_mh);
136 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/me_over_m0,PetscScalar(0.28227)),PetscScalar(0.19778))+0.005978/pow(P*pow(Tl/T300/me_over_m0,PetscScalar(0.72169)),PetscScalar(1.80618));
137 PetscScalar G = 1-4.41804/pow(39.9014+P*pow(Tl/T300/me_over_m0,PetscScalar(0.0001)),PetscScalar(0.38297))+0.52896/pow(P*pow(T300/Tl*me_over_m0,PetscScalar(1.595787)),PetscScalar(0.25948));
138 PetscScalar Nsce = Nds+Nas*G+fabs(p)/F;
139 PetscScalar mu_scatt = mu1*(Nsc/Nsce)*pow(NRFN_UM/Nsc,ALPN_UM)+mu2*(fabs(n+p)/Nsce);
140 return 1.0/(1.0/mu_lattice+1.0/mu_scatt);
142 AutoDScalar ElecMobPhilips(const AutoDScalar &p,const AutoDScalar &n,const AutoDScalar &Tl) const
144 AutoDScalar mu_lattice = MMXN_UM*pow(Tl/T300,-TETN_UM);
145 AutoDScalar mu1 = MMXN_UM*MMXN_UM/(MMXN_UM-MMNN_UM)*pow(Tl/T300,3*ALPN_UM-1.5);
146 AutoDScalar mu2 = MMXN_UM*MMNN_UM/(MMXN_UM-MMNN_UM)*sqrt(T300/Tl);
147 PetscScalar Na = ReadDopingNa()+1e0*pow(cm,-3);
148 PetscScalar Nd = ReadDopingNd()+1e0*pow(cm,-3);
149 PetscScalar Nds = Nd*(1.0+1.0/(CRFD_UM+(NRFD_UM/Nd)*(NRFD_UM/Nd)));
150 PetscScalar Nas = Na*(1.0+1.0/(CRFA_UM+(NRFA_UM/Na)*(NRFA_UM/Na)));
151 AutoDScalar Nsc = Nds+Nas+fabs(p);
153 AutoDScalar P = 1.0/(2.459/(NSC_REF/pow(Nsc,PetscScalar(2.0/3.0)))+3.828/(CAR_REF/fabs(n+p)*me_over_m0))*(Tl/T300)*(Tl/T300);
154 AutoDScalar pp1 = pow(P,PetscScalar(0.6478));
155 AutoDScalar F = (0.7643*pp1+2.2999+6.5502*me_over_mh)/(pp1+2.3670-0.8552*me_over_mh);
156 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/me_over_m0,PetscScalar(0.28227)),PetscScalar(0.19778))+0.005978/pow(P*pow(Tl/T300/me_over_m0,PetscScalar(0.72169)),PetscScalar(1.80618));
157 AutoDScalar G = 1-4.41804/pow(39.9014+P*pow(Tl/T300/me_over_m0,PetscScalar(0.0001)),PetscScalar(0.38297))+0.52896/pow(P*pow(T300/Tl*me_over_m0,PetscScalar(1.595787)),PetscScalar(0.25948));
158 AutoDScalar Nsce = Nds+Nas*G+fabs(p)/F;
159 AutoDScalar mu_scatt = mu1*(Nsc/Nsce)*pow(NRFN_UM/Nsc,ALPN_UM)+mu2*(fabs(n+p)/Nsce);
160 return 1.0/(1.0/mu_lattice+1.0/mu_scatt);
163 //---------------------------------------------------------------------------
164 // Hole low field bulk mobility
165 PetscScalar HoleMobPhilips(const PetscScalar &p,const PetscScalar &n,const PetscScalar &Tl) const
167 PetscScalar mu_lattice = MMXP_UM*pow(Tl/T300,-TETP_UM);
168 PetscScalar mu1 = MMXP_UM*MMXP_UM/(MMXP_UM-MMNP_UM)*pow(Tl/T300,3*ALPP_UM-1.5);
169 PetscScalar mu2 = MMXP_UM*MMNP_UM/(MMXP_UM-MMNP_UM)*sqrt(T300/Tl);
170 PetscScalar Na = ReadDopingNa()+1e0*pow(cm,-3);
171 PetscScalar Nd = ReadDopingNd()+1e0*pow(cm,-3);
172 PetscScalar Nds = Nd*(1.0+1.0/(CRFD_UM+(NRFD_UM/Nd)*(NRFD_UM/Nd)));
173 PetscScalar Nas = Na*(1.0+1.0/(CRFA_UM+(NRFA_UM/Na)*(NRFA_UM/Na)));
174 PetscScalar Nsc = Nds+Nas+fabs(n);
176 PetscScalar P = 1.0/(2.459/(NSC_REF/pow(Nsc,PetscScalar(2.0/3.0)))+3.828/(CAR_REF/fabs(n+p)*mh_over_m0))*(Tl/T300)*(Tl/T300);
177 PetscScalar pp1 = pow(P,PetscScalar(0.6478));
178 PetscScalar F = (0.7643*pp1+2.2999+6.5502/me_over_mh)/(pp1+2.3670-0.8552/me_over_mh);
179 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/mh_over_m0,0.28227),0.19778)+0.005978/pow(P*pow(Tl/T300/mh_over_m0,0.72169),1.80618);
180 PetscScalar G = 1-4.41804/pow(39.9014+P*pow(Tl/T300/mh_over_m0,PetscScalar(0.0001)),PetscScalar(0.38297))+0.52896/pow(P*pow(T300/Tl*mh_over_m0,PetscScalar(1.595787)),PetscScalar(0.25948));
181 PetscScalar Nsce = Nas+Nds*G+fabs(n)/F;
182 PetscScalar mu_scatt = mu1*(Nsc/Nsce)*pow(NRFP_UM/Nsc,ALPP_UM)+mu2*(fabs(n+p)/Nsce);
183 return 1.0/(1.0/mu_lattice+1.0/mu_scatt);
185 AutoDScalar HoleMobPhilips(const AutoDScalar &p,const AutoDScalar &n,const AutoDScalar &Tl) const
187 AutoDScalar mu_lattice = MMXP_UM*pow(Tl/T300,-TETP_UM);
188 AutoDScalar mu1 = MMXP_UM*MMXP_UM/(MMXP_UM-MMNP_UM)*pow(Tl/T300,3*ALPP_UM-1.5);
189 AutoDScalar mu2 = MMXP_UM*MMNP_UM/(MMXP_UM-MMNP_UM)*sqrt(T300/Tl);
190 PetscScalar Na = ReadDopingNa()+1e0*pow(cm,-3);
191 PetscScalar Nd = ReadDopingNd()+1e0*pow(cm,-3);
192 PetscScalar Nds = Nd*(1.0+1.0/(CRFD_UM+(NRFD_UM/Nd)*(NRFD_UM/Nd)));
193 PetscScalar Nas = Na*(1.0+1.0/(CRFA_UM+(NRFA_UM/Na)*(NRFA_UM/Na)));
194 AutoDScalar Nsc = Nds+Nas+fabs(n);
196 AutoDScalar P = 1.0/(2.459/(NSC_REF/pow(Nsc,PetscScalar(2.0/3.0)))+3.828/(CAR_REF/fabs(n+p)*mh_over_m0))*(Tl/T300)*(Tl/T300);
197 AutoDScalar pp1 = pow(P,PetscScalar(0.6478));
198 AutoDScalar F = (0.7643*pp1+2.2999+6.5502/me_over_mh)/(pp1+2.3670-0.8552/me_over_mh);
199 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/mh_over_m0,0.28227),0.19778)+0.005978/pow(P*pow(Tl/T300/mh_over_m0,0.72169),1.80618);
200 AutoDScalar G = 1-4.41804/pow(39.9014+P*pow(Tl/T300/mh_over_m0,PetscScalar(0.0001)),PetscScalar(0.38297))+0.52896/pow(P*pow(T300/Tl*mh_over_m0,PetscScalar(1.595787)),PetscScalar(0.25948));
201 AutoDScalar Nsce = Nas+Nds*G+fabs(n)/F;
202 AutoDScalar mu_scatt = mu1*(Nsc/Nsce)*pow(NRFP_UM/Nsc,ALPP_UM)+mu2*(fabs(n+p)/Nsce);
203 return 1.0/(1.0/mu_lattice+1.0/mu_scatt);
206 //---------------------------------------------------------------------------
207 //the surface acoustical phono scattering and roughness scattering for electron
208 PetscScalar ElecMobLombardi(const PetscScalar &p,const PetscScalar &n,const PetscScalar &Tl,const PetscScalar &Et) const
210 PetscScalar Na = ReadDopingNa();
211 PetscScalar Nd = ReadDopingNd();
212 PetscScalar N_total = Na+Nd+1e0*pow(cm,-3);
213 PetscScalar ET = Et+1.0*V/cm;
214 PetscScalar mu_ac = BN_LUC/ET + CN_LUC*pow(N_total,EXN4_LUC)*pow(Tl/T300,-KN_LUC)*pow(ET,PetscScalar(-1.0/3.0));
215 PetscScalar r = AN_LUC + FN_LUC*fabs(n+p)/pow(N_total,EXN9_LUC);
216 PetscScalar DN_LUC=3.580000E+18*cm*cm/V/s*pow(V/cm,r);
217 PetscScalar mu_sr = DN_LUC*pow(ET,-r);
218 return 1.0/(1.0/mu_ac+1.0/mu_sr);
220 AutoDScalar ElecMobLombardi(const AutoDScalar &p,const AutoDScalar &n,const AutoDScalar &Tl,const AutoDScalar &Et) const
222 PetscScalar Na = ReadDopingNa();
223 PetscScalar Nd = ReadDopingNd();
224 PetscScalar N_total = Na+Nd+1e0*pow(cm,-3);
225 AutoDScalar ET = Et+1.0*V/cm;
226 AutoDScalar mu_ac = BN_LUC/ET + CN_LUC*pow(N_total,EXN4_LUC)*pow(Tl/T300,-KN_LUC)*pow(ET,PetscScalar(-1.0/3.0));
227 AutoDScalar r = AN_LUC + FN_LUC*fabs(n+p)/pow(N_total,EXN9_LUC);
228 AutoDScalar DN_LUC=3.580000E+18*cm*cm/V/s*pow(V/cm,r);
229 AutoDScalar mu_sr = DN_LUC*pow(ET,-r);
230 return 1.0/(1.0/mu_ac+1.0/mu_sr);
233 //---------------------------------------------------------------------------
234 //the surface acoustical phono scattering and roughness scattering for hole
235 PetscScalar HoleMobLombardi(const PetscScalar &p,const PetscScalar &n,const PetscScalar &Tl,const PetscScalar &Et) const
237 PetscScalar Na = ReadDopingNa();
238 PetscScalar Nd = ReadDopingNd();
239 PetscScalar N_total = Na+Nd+1e0*pow(cm,-3);
240 PetscScalar ET = Et+1.0*V/cm;
241 PetscScalar mu_ac = BP_LUC/ET + CP_LUC*pow(N_total,EXP4_LUC)*pow(Tl/T300,-KP_LUC)*pow(ET,PetscScalar(-1.0/3.0));
242 PetscScalar r = AP_LUC + FP_LUC*fabs(n+p)/pow(N_total,EXP9_LUC);
243 PetscScalar DP_LUC=4.100000E+15*cm*cm/V/s*pow(V/cm,r);
244 PetscScalar mu_sr = DP_LUC*pow(ET,-r);
245 return 1.0/(1.0/mu_ac+1.0/mu_sr);
247 AutoDScalar HoleMobLombardi(const AutoDScalar &p,const AutoDScalar &n,const AutoDScalar &Tl,const AutoDScalar &Et) const
249 PetscScalar Na = ReadDopingNa();
250 PetscScalar Nd = ReadDopingNd();
251 PetscScalar N_total = Na+Nd+1e0*pow(cm,-3);
252 AutoDScalar ET = Et+1.0*V/cm;
253 AutoDScalar mu_ac = BP_LUC/ET + CP_LUC*pow(N_total,EXP4_LUC)*pow(Tl/T300,-KP_LUC)*pow(ET,PetscScalar(-1.0/3.0));
254 AutoDScalar r = AP_LUC + FP_LUC*fabs(n+p)/pow(N_total,EXP9_LUC);
255 AutoDScalar DP_LUC=4.100000E+15*cm*cm/V/s*pow(V/cm,r);
256 AutoDScalar mu_sr = DP_LUC*pow(ET,-r);
257 return 1.0/(1.0/mu_ac+1.0/mu_sr);
260 public:
262 //---------------------------------------------------------------------------
263 // Electron mobility
264 PetscScalar ElecMob(const PetscScalar &p, const PetscScalar &n, const PetscScalar &Tl,
265 const PetscScalar &Ep, const PetscScalar &Et, const PetscScalar &Tn) const
267 PetscScalar vsat = (2.4e7*cm/s)/(1+0.8*exp(Tl/(2*T300)));
268 PetscScalar mu0 = 1.0/(1.0/ElecMobPhilips(p,n,Tl)+1.0/ElecMobLombardi(p,n,Tl,Et));
269 PetscScalar mu = 2*mu0/(1+pow(1+pow(2*mu0*fabs(Ep)/vsat,BETAN),1.0/BETAN));
270 return mu;
272 AutoDScalar ElecMob(const AutoDScalar &p, const AutoDScalar &n, const AutoDScalar &Tl,
273 const AutoDScalar &Ep, const AutoDScalar &Et, const AutoDScalar &Tn) const
275 AutoDScalar vsat = (2.4e7*cm/s)/(1+0.8*exp(Tl/(2*T300)));
276 AutoDScalar mu0 = 1.0/(1.0/ElecMobPhilips(p,n,Tl)+1.0/ElecMobLombardi(p,n,Tl,Et));
277 AutoDScalar mu = 2*mu0/(1+pow(1+pow(2*mu0*fabs(Ep)/vsat,BETAN),1.0/BETAN));
278 return mu;
281 //---------------------------------------------------------------------------
282 // Hole mobility
283 PetscScalar HoleMob (const PetscScalar &p, const PetscScalar &n, const PetscScalar &Tl,
284 const PetscScalar &Ep, const PetscScalar &Et, const PetscScalar &Tp) const
286 PetscScalar vsat = (2.4e7*cm/s)/(1+0.8*exp(Tl/(2*T300)));
287 PetscScalar mu0 = 1.0/(1.0/HoleMobPhilips(p,n,Tl)+1.0/HoleMobLombardi(p,n,Tl,Et));
288 PetscScalar mu = 2*mu0/(1+pow(1+pow(2*mu0*fabs(Ep)/vsat,BETAP),1.0/BETAP));
289 return mu;
291 AutoDScalar HoleMob(const AutoDScalar &p, const AutoDScalar &n, const AutoDScalar &Tl,
292 const AutoDScalar &Ep, const AutoDScalar &Et, const AutoDScalar &Tp) const
294 AutoDScalar vsat = (2.4e7*cm/s)/(1+0.8*exp(Tl/(2*T300)));
295 AutoDScalar mu0 = 1.0/(1.0/HoleMobPhilips(p,n,Tl)+1.0/HoleMobLombardi(p,n,Tl,Et));
296 AutoDScalar mu = 2*mu0/(1+pow(1+pow(2*mu0*fabs(Ep)/vsat,BETAP),1.0/BETAP));
297 return mu;
301 // constructor
302 public:
303 GSS_Mob_Lucent(const PMIS_Environment &env):PMIS_Mobility(env)
305 Mob_Lucent_Init();
308 ~GSS_Mob_Lucent(){}}
311 /*---------------------------------------------------------------
312 * the interface function called by material databse controller
313 * and it setup Lucent mobility model
315 extern "C"
317 PMIS_Mobility* PMIS_SiGe_Mob_Lucent (const PMIS_Environment& env)
319 return new GSS_Mob_Lucent(env);