initial checkin, based on GSS 0.46 CVS
[gss-tcad.git] / src / material / Si / Si_mob_Philips.cc
blob526c5a194ee74c37ecb0261c444030249d9e9779
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: Silicon
25 #include "PMI.h"
27 class GSS_Mob_Philips : public PMIS_Mobility
29 private:
30 // parameters for Philips 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 high field modification
54 PetscScalar BETAN;
55 PetscScalar BETAP;
56 void Mob_Philips_Init()
58 MMNN_UM = 5.220000E+01*cm*cm/V/s;
59 MMXN_UM = 1.417000E+03*cm*cm/V/s;
60 NRFN_UM = 9.680000E+16*pow(cm,-3);
61 ALPN_UM = 6.800000E-01;
62 TETN_UM = 2.285000E+00;
63 NRFD_UM = 4.000000E+20*pow(cm,-3);
64 CRFD_UM = 2.100000E-01;
66 MMNP_UM = 4.490000E+01*cm*cm/V/s;
67 MMXP_UM = 4.705000E+02*cm*cm/V/s;
68 NRFP_UM = 2.230000E+17*pow(cm,-3);
69 ALPP_UM = 7.190000E-01;
70 TETP_UM = 2.247000E+00;
71 NRFA_UM = 7.200000E+20*pow(cm,-3);
72 CRFA_UM = 5.000000E-01;
74 NSC_REF = 3.97e13*pow(cm,-2);
75 CAR_REF = 1.36e20*pow(cm,-3);
76 me_over_m0 = 1.0;
77 mh_over_m0 = 1.258;
78 me_over_mh = 1.0/1.258;
79 T300 = 300.0*K;
81 BETAN = 2.000000E+00;
82 BETAP = 1.000000E+00;
85 //---------------------------------------------------------------------------
86 // Electron low field mobility
87 PetscScalar ElecMobPhilips(const PetscScalar &p,const PetscScalar &n,const PetscScalar &Tl) const
89 PetscScalar mu_lattice = MMXN_UM*pow(Tl/T300,-TETN_UM);
90 PetscScalar mu1 = MMXN_UM*MMXN_UM/(MMXN_UM-MMNN_UM)*pow(Tl/T300,3*ALPN_UM-1.5);
91 PetscScalar mu2 = MMXN_UM*MMNN_UM/(MMXN_UM-MMNN_UM)*sqrt(T300/Tl);
92 PetscScalar Na = ReadDopingNa()+1e0*pow(cm,-3);
93 PetscScalar Nd = ReadDopingNd()+1e0*pow(cm,-3);
94 PetscScalar Nds = Nd*(1.0+1.0/(CRFD_UM+(NRFD_UM/Nd)*(NRFD_UM/Nd)));
95 PetscScalar Nas = Na*(1.0+1.0/(CRFA_UM+(NRFA_UM/Na)*(NRFA_UM/Na)));
96 PetscScalar Nsc = Nds+Nas+fabs(p);
98 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);
99 PetscScalar pp1 = pow(P,PetscScalar(0.6478));
100 PetscScalar F = (0.7643*pp1+2.2999+6.5502*me_over_mh)/(pp1+2.3670-0.8552*me_over_mh);
101 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/me_over_m0,0.28227),0.19778)+0.005978/pow(P*pow(Tl/T300/me_over_m0,0.72169),1.80618);
102 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));
103 PetscScalar Nsce = Nds+Nas*G+fabs(p)/F;
104 PetscScalar mu_scatt = mu1*(Nsc/Nsce)*pow(NRFN_UM/Nsc,ALPN_UM)+mu2*(fabs(n+p)/Nsce);
105 return 1.0/(1.0/mu_lattice+1.0/mu_scatt);
107 AutoDScalar ElecMobPhilips(const AutoDScalar &p,const AutoDScalar &n,const AutoDScalar &Tl) const
109 AutoDScalar mu_lattice = MMXN_UM*pow(Tl/T300,-TETN_UM);
110 AutoDScalar mu1 = MMXN_UM*MMXN_UM/(MMXN_UM-MMNN_UM)*pow(Tl/T300,3*ALPN_UM-1.5);
111 AutoDScalar mu2 = MMXN_UM*MMNN_UM/(MMXN_UM-MMNN_UM)*sqrt(T300/Tl);
112 PetscScalar Na = ReadDopingNa()+1e0*pow(cm,-3);
113 PetscScalar Nd = ReadDopingNd()+1e0*pow(cm,-3);
114 PetscScalar Nds = Nd*(1.0+1.0/(CRFD_UM+(NRFD_UM/Nd)*(NRFD_UM/Nd)));
115 PetscScalar Nas = Na*(1.0+1.0/(CRFA_UM+(NRFA_UM/Na)*(NRFA_UM/Na)));
116 AutoDScalar Nsc = Nds+Nas+fabs(p);
118 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);
119 AutoDScalar pp1 = pow(P,PetscScalar(0.6478));
120 AutoDScalar F = (0.7643*pp1+2.2999+6.5502*me_over_mh)/(pp1+2.3670-0.8552*me_over_mh);
121 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/me_over_m0,0.28227),0.19778)+0.005978/pow(P*pow(Tl/T300/me_over_m0,0.72169),1.80618);
122 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));
123 AutoDScalar Nsce = Nds+Nas*G+fabs(p)/F;
124 AutoDScalar mu_scatt = mu1*(Nsc/Nsce)*pow(NRFN_UM/Nsc,ALPN_UM)+mu2*(fabs(n+p)/Nsce);
125 return 1.0/(1.0/mu_lattice+1.0/mu_scatt);
128 //---------------------------------------------------------------------------
129 // Hole low field mobility
130 PetscScalar HoleMobPhilips(const PetscScalar &p,const PetscScalar &n,const PetscScalar &Tl) const
132 PetscScalar mu_lattice = MMXP_UM*pow(Tl/T300,-TETP_UM);
133 PetscScalar mu1 = MMXP_UM*MMXP_UM/(MMXP_UM-MMNP_UM)*pow(Tl/T300,3*ALPP_UM-1.5);
134 PetscScalar mu2 = MMXP_UM*MMNP_UM/(MMXP_UM-MMNP_UM)*sqrt(T300/Tl);
135 PetscScalar Na = ReadDopingNa()+1e0*pow(cm,-3);
136 PetscScalar Nd = ReadDopingNd()+1e0*pow(cm,-3);
137 PetscScalar Nds = Nd*(1.0+1.0/(CRFD_UM+(NRFD_UM/Nd)*(NRFD_UM/Nd)));
138 PetscScalar Nas = Na*(1.0+1.0/(CRFA_UM+(NRFA_UM/Na)*(NRFA_UM/Na)));
139 PetscScalar Nsc = Nds+Nas+fabs(n);
141 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);
142 PetscScalar pp1 = pow(P,PetscScalar(0.6478));
143 PetscScalar F = (0.7643*pp1+2.2999+6.5502/me_over_mh)/(pp1+2.3670-0.8552/me_over_mh);
144 //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);
145 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));
146 PetscScalar Nsce = Nas+Nds*G+fabs(n)/F;
147 PetscScalar mu_scatt = mu1*(Nsc/Nsce)*pow(NRFP_UM/Nsc,ALPP_UM)+mu2*(fabs(n+p)/Nsce);
148 return 1.0/(1.0/mu_lattice+1.0/mu_scatt);
150 AutoDScalar HoleMobPhilips(const AutoDScalar &p,const AutoDScalar &n,const AutoDScalar &Tl) const
152 AutoDScalar mu_lattice = MMXP_UM*pow(Tl/T300,-TETP_UM);
153 AutoDScalar mu1 = MMXP_UM*MMXP_UM/(MMXP_UM-MMNP_UM)*pow(Tl/T300,3*ALPP_UM-1.5);
154 AutoDScalar mu2 = MMXP_UM*MMNP_UM/(MMXP_UM-MMNP_UM)*sqrt(T300/Tl);
155 PetscScalar Na = ReadDopingNa()+1e0*pow(cm,-3);
156 PetscScalar Nd = ReadDopingNd()+1e0*pow(cm,-3);
157 PetscScalar Nds = Nd*(1.0+1.0/(CRFD_UM+(NRFD_UM/Nd)*(NRFD_UM/Nd)));
158 PetscScalar Nas = Na*(1.0+1.0/(CRFA_UM+(NRFA_UM/Na)*(NRFA_UM/Na)));
159 AutoDScalar Nsc = Nds+Nas+fabs(n);
161 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);
162 AutoDScalar pp1 = pow(P,PetscScalar(0.6478));
163 AutoDScalar F = (0.7643*pp1+2.2999+6.5502/me_over_mh)/(pp1+2.3670-0.8552/me_over_mh);
164 //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);
165 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));
166 AutoDScalar Nsce = Nas+Nds*G+fabs(n)/F;
167 AutoDScalar mu_scatt = mu1*(Nsc/Nsce)*pow(NRFP_UM/Nsc,ALPP_UM)+mu2*(fabs(n+p)/Nsce);
168 return 1.0/(1.0/mu_lattice+1.0/mu_scatt);
170 public:
172 //---------------------------------------------------------------------------
173 // Electron mobility
174 PetscScalar ElecMob(const PetscScalar &p, const PetscScalar &n, const PetscScalar &Tl,
175 const PetscScalar &Ep, const PetscScalar &Et, const PetscScalar &Tn) const
177 PetscScalar vsat = (2.4e7*cm/s)/(1+0.8*exp(Tl/(2*T300)));
178 PetscScalar mu0 = ElecMobPhilips(p,n,Tl);
179 return mu0/pow(1+pow(mu0*fabs(Ep)/vsat,BETAN),1.0/BETAN);
181 AutoDScalar ElecMob(const AutoDScalar &p, const AutoDScalar &n, const AutoDScalar &Tl,
182 const AutoDScalar &Ep, const AutoDScalar &Et, const AutoDScalar &Tn) const
184 AutoDScalar vsat = (2.4e7*cm/s)/(1+0.8*exp(Tl/(2*T300)));
185 AutoDScalar mu0 = ElecMobPhilips(p,n,Tl);
186 return mu0/pow(1+pow(mu0*fabs(Ep)/vsat,BETAN),1.0/BETAN);
189 //---------------------------------------------------------------------------
190 // Hole mobility
191 PetscScalar HoleMob (const PetscScalar &p, const PetscScalar &n, const PetscScalar &Tl,
192 const PetscScalar &Ep, const PetscScalar &Et, const PetscScalar &Tp) const
194 PetscScalar vsat = (2.4e7*cm/s)/(1+0.8*exp(Tl/(2*T300)));
195 PetscScalar mu0 = HoleMobPhilips(p,n,Tl);
196 return mu0/pow(1+pow(mu0*fabs(Ep)/vsat,BETAP),1.0/BETAP);
198 AutoDScalar HoleMob(const AutoDScalar &p, const AutoDScalar &n, const AutoDScalar &Tl,
199 const AutoDScalar &Ep, const AutoDScalar &Et, const AutoDScalar &Tp) const
201 AutoDScalar vsat = (2.4e7*cm/s)/(1+0.8*exp(Tl/(2*T300)));
202 AutoDScalar mu0 = HoleMobPhilips(p,n,Tl);
203 return mu0/pow(1+pow(mu0*fabs(Ep)/vsat,BETAP),1.0/BETAP);
206 // constructor
207 public:
208 GSS_Mob_Philips(const PMIS_Environment &env):PMIS_Mobility(env)
210 Mob_Philips_Init();
212 ~GSS_Mob_Philips(){}
216 /*---------------------------------------------------------------
217 * the interface function called by material databse controller
218 * and it setup Philips mobility model
220 extern "C"
222 PMIS_Mobility* PMIS_Si_Mob_Philips (const PMIS_Environment& env)
224 return new GSS_Mob_Philips(env);