44 #ifndef Xyce_N_DEV_MaterialSupport_h
45 #define Xyce_N_DEV_MaterialSupport_h
54 #include <N_UTL_Param.h>
55 #include <N_ERH_ErrorMgr.h>
69 template <
typename ScalarT>
83 p(static_cast<ScalarT>(1.45e10)),
84 n(static_cast<ScalarT>(1.45e10)),
85 epar(static_cast<ScalarT>(0.0)),
86 eperp(static_cast<ScalarT>(1.5e4))
105 namespace MaterialSupport {
107 template <
typename ScalarT>
110 template <
typename ScalarT>
113 template <
typename ScalarT>
116 template <
typename ScalarT>
119 template <
typename ScalarT>
122 template <
typename ScalarT>
125 template <
typename ScalarT>
128 template <
typename ScalarT>
131 double workfunc(std::string & metal);
132 double affin(
const std::string & material);
133 double bandgap(
const std::string & material,
double temp);
134 double Ebgn(
const std::string & material,
const std::string & bgnModel,
double dope);
135 double jainEbgn(
const std::string & material,
double dope);
137 double calcLt (
bool holeFlag,
double conc);
139 double calcRsrh (
const std::string & material,
142 double tn,
double tp);
144 double calcRaug (
const std::string & material,
double ni,
double n,
double p);
146 double pdRsrhN (
const std::string & material,
double ni,
148 double tn,
double tp);
150 double pdRsrhP (
const std::string & material,
double ni,
152 double tn,
double tp);
154 double pdRaugN (
const std::string & material,
double ni,
double n,
double p);
155 double pdRaugP (
const std::string & material,
double ni,
double n,
double p);
157 double getNc (
const std::string & material,
double temp);
158 double getNv (
const std::string & material,
double temp);
160 double getNi (
const std::string & material,
double temp);
161 double getNi_old (
const std::string & material,
double temp);
163 double getRelPerm (
const std::string & material);
187 template <
typename ScalarT>
196 if(mobility==
"analytic" || mobility==
"caughey-thomas")
200 else if(mobility==
"arora")
204 else if(mobility==
"carr")
208 else if(mobility==
"carrier")
212 else if(mobility==
"surface" || mobility==
"lombardi")
216 else if(mobility==
"philips")
222 Report::UserFatal0() <<
"Mobility model " << mobility <<
" not recognized.";
230 #ifdef Xyce_DEBUG_DEVICE
231 if (mobil != 0.0 && !(mobil > 0.0) && !(mobil < 0.0))
233 Report::DevelFatal0().in(
"MaterialSupport::calcMob") <<
"Mobility calc = nan.";
254 template <
typename ScalarT>
260 double mun_min, mup_min;
261 double mun_max, mup_max;
262 double nun, nup, xin, xip, nrefn, nrefp, alphan, alphap;
266 mun_min = 55.24; mup_min = 49.7;
267 mun_max = 1429.23; mup_max = 479.37;
268 nrefn = 1.072e17; nrefp = 1.606e17;
269 nun = -2.3; nup = -2.2;
270 xin = -3.8; xip = -3.7;
271 alphan = 0.733; alphap = 0.70;
273 else if(mater==
"gaas")
275 mun_min = 0.0; mup_min = 0.0;
276 mun_max = 8500.0; mup_max = 400.0;
277 nrefn = 1.69e17; nrefp = 2.75e17;
278 nun = -1.0; nup = -2.1;
279 xin = 0.0; xip = 0.0;
280 alphan = 0.436; alphap = 0.395;
282 else if(mater==
"sio2")
284 mun_min = 1e1; mup_min = 1e-5;
285 mun_max = 2e1; mup_max = 1e-5;
286 nrefn = 1.072e17; nrefp = 1.606e17;
287 nun = -2.3; nup = -2.2;
288 xin = -3.8; xip = -3.7;
289 alphan = 0.733; alphap = 0.70;
291 else if (mater==
"inalas" || mater==
"alinas")
293 mun_min = 497.0; mup_min = 0.0;
294 mun_max = 2.41e4; mup_max = 480.0;
295 nrefn = 1.0e17; nrefp = 1.0e30;
296 nun = 0.0; nup = 0.0;
297 xin = 0.0; xip = 0.0;
298 alphan = 1.0; alphap = 1.0;
301 else if (mater==
"ingaas" || mater==
"gainas")
303 mun_min = 4000.0; mup_min = 0.0;
304 mun_max = 2.73e4; mup_max = 480.0;
305 nrefn = 3.63e17; nrefp = 1.0e30;
306 nun = 0.0; nup = 0.0;
307 xin = 0.0; xip = 0.0;
308 alphan = 1.0; alphap = 1.0;
310 else if (mater==
"inp")
312 mun_min = 497.0; mup_min = 0.0;
313 mun_max = 2.41e4; mup_max = 480.0;
314 nrefn = 1.0e17; nrefp = 1.0e30;
315 nun = 0.0; nup = 0.0;
316 xin = 0.0; xip = 0.0;
317 alphan = 1.0; alphap = 1.0;
319 else if (mater==
"ingap")
321 mun_min = 0.95; mup_min = 0.0;
322 mun_max = 200.0; mup_max = 150.0;
323 nrefn = 1.0e17; nrefp = 1.0e30;
324 nun = 0.0; nup = 0.0;
325 xin = 0.0; xip = 0.0;
326 alphan = 1.0; alphap = 1.0;
330 Report::UserFatal0() <<
"Analytic (Caughy-Thomas) mobility model not supported for " << mater;
337 (mup_max*pow((min.
T/min.
refTemp),nup) - mup_min)/
338 (1.0 + pow((min.
T/min.
refTemp),xip)*pow((min.
N/nrefp),alphap));
344 (mun_max*pow((min.
T/min.
refTemp),nun) - mun_min)/
345 (1.0 + pow((min.
T/min.
refTemp),xin)*pow((min.
N/nrefn),alphan));
366 template <
typename ScalarT>
372 double mun1_aro, mup1_aro, mun2_aro, mup2_aro, an_arora, ap_arora;
373 double cn_arora, cp_arora, exn1_aro, exp1_aro, exn2_aro, exp2_aro;
374 double exn3_aro, exp3_aro, exn4_aro, exp4_aro;
375 double alphan, alphap;
379 mun1_aro = 88.0; mup1_aro = 54.3;
380 mun2_aro = 1252.0; mup2_aro = 407.0;
381 an_arora = 0.88; ap_arora = 0.88;
382 cn_arora = 1.26e17; cp_arora = 2.35e17;
383 exn1_aro = -0.57; exp1_aro = -0.57;
384 exn2_aro = -2.33; exp2_aro = -2.33;
385 exn3_aro = 2.4; exp3_aro = 2.4;
386 exn4_aro = -0.146; exp4_aro = -0.146;
388 else if(mater==
"gaas")
390 mun1_aro = 8.5e3; mup1_aro = 4e2;
391 mun2_aro = 0.0; mup2_aro = 0.0;
392 an_arora = 0.0; ap_arora = 0.0;
393 cn_arora = 1.26e17; cp_arora = 2.35e17;
394 exn1_aro = -5.7e-1; exp1_aro = 0.0;
395 exn2_aro = 0.0; exp2_aro = 0.0;
396 exn3_aro = 0.0; exp3_aro = 0.0;
397 exn4_aro = 0.0; exp4_aro = 0.0;
399 else if(mater==
"sio2")
401 mun1_aro = 1e1; mup1_aro = 1e-5;
402 mun2_aro = 2e1; mup2_aro = 2e-5;
403 an_arora = 0.88; ap_arora = 0.88;
404 cn_arora = 1.26e17; cp_arora = 2.35e17;
405 exn1_aro = -0.57; exp1_aro = -0.57;
406 exn2_aro = -2.33; exp2_aro = -2.33;
407 exn3_aro = 2.4; exp3_aro = 2.4;
408 exn4_aro = -0.146; exp4_aro = -0.146;
410 else if (mater==
"inalas" || mater==
"alinas")
412 mun1_aro = 2.41e4; mup1_aro = 480.0;
413 mun2_aro = 0.0; mup2_aro = 0.0;
414 an_arora = 1.0; ap_arora = 1.0;
415 cn_arora = 1.0e20; cp_arora = 1.0e20;
416 exn1_aro = 0.0; exp1_aro = 0.0;
417 exn2_aro = 0.0; exp2_aro = 0.0;
418 exn3_aro = 0.0; exp3_aro = 0.0;
419 exn4_aro = 0.0; exp4_aro = 0.0;
421 else if (mater==
"ingaas" || mater==
"gainas")
423 mun1_aro = 2.73e4; mup1_aro = 480.0;
424 mun2_aro = 0.0; mup2_aro = 0.0;
425 an_arora = 1.0; ap_arora = 1.0;
426 cn_arora = 1.0e20; cp_arora = 1.0e20;
427 exn1_aro = 0.0; exp1_aro = 0.0;
428 exn2_aro = 0.0; exp2_aro = 0.0;
429 exn3_aro = 0.0; exp3_aro = 0.0;
430 exn4_aro = 0.0; exp4_aro = 0.0;
432 else if (mater==
"inp")
434 mun1_aro = 2.41e4; mup1_aro = 480.0;
435 mun2_aro = 0.0; mup2_aro = 0.0;
436 an_arora = 1.0; ap_arora = 1.0;
437 cn_arora = 1.0e20; cp_arora = 1.0e20;
438 exn1_aro = 0.0; exp1_aro = 0.0;
439 exn2_aro = 0.0; exp2_aro = 0.0;
440 exn3_aro = 0.0; exp3_aro = 0.0;
441 exn4_aro = 0.0; exp4_aro = 0.0;
443 else if (mater==
"ingap")
445 mun1_aro = 200.0; mup1_aro = 150.0;
446 mun2_aro = 0.0; mup2_aro = 0.0;
447 an_arora = 1.0; ap_arora = 1.0;
448 cn_arora = 1.0e20; cp_arora = 1.0e20;
449 exn1_aro = 0.0; exp1_aro = 0.0;
450 exn2_aro = 0.0; exp2_aro = 0.0;
451 exn3_aro = 0.0; exp3_aro = 0.0;
452 exn4_aro = 0.0; exp4_aro = 0.0;
456 Report::UserFatal0() <<
"Arora mobility model not supported for " << mater;
459 alphan = an_arora*pow((min.
T/min.
refTemp),exn4_aro);
460 alphap = ap_arora*pow((min.
T/min.
refTemp),exp4_aro);
464 mobil = mup1_aro*pow((min.
T/min.
refTemp),exp1_aro)+
465 (mup2_aro*pow((min.
T/min.
refTemp),exp2_aro))/
466 (1.0+pow((min.
N/cp_arora*pow((min.
T/min.
refTemp),exp3_aro)),alphap));
471 mun1_aro*pow((min.
T/min.
refTemp),exn1_aro)+
472 (mun2_aro*pow((min.
T/min.
refTemp),exn2_aro))/
473 (1.0+pow((min.
N/cn_arora*pow((min.
T/min.
refTemp),exn3_aro)),alphan));
495 template <
typename ScalarT>
502 double Al, Bl, Ai, Bi;
524 else if(mater==
"gaas")
543 Report::UserFatal0() <<
"Carrier-carrier mobility model not supported for " << mater;
547 mul = Al*pow((min.
T/min.
refTemp),Bl);
550 mui = (Ai*pow(min.
T,1.5)/min.
N)*(log(1.0+Bi*min.
T*min.
T/min.
N)-
551 Bi*min.
T*min.
T/(min.
N+Bi*min.
T*min.
T));
555 ScalarT N = fabs(min.
n);
if(N == 0.0) N = 1.0;
556 ScalarT P = fabs(min.
p);
if(P == 0.0) P = 1.0;
558 muc = (2.0e17*pow(min.
T,1.5)/sqrt(P*N))*
559 1.0/(log(1.0+8.28e8*min.
T*min.
T*pow(P*N,-1.0/3.0)));
561 X = sqrt(6.0*mul*(mui+muc)/(mui*muc));
562 mobil = mul*(1.025/(1.0+pow(X/1.68,1.43))-0.025);
564 #ifdef Xyce_DEBUG_DEVICE
565 if (mobil != 0.0 && !(mobil > 0.0) && !(mobil < 0.0))
567 Xyce::dout() <<
"mobil is nan" << std::endl;
568 Xyce::dout() <<
"mul = " << mul << std::endl;
569 Xyce::dout() <<
"mui = " << mui << std::endl;
570 Xyce::dout() <<
"muc = " << muc << std::endl;
571 Xyce::dout() <<
"X = " << X << std::endl;
572 Xyce::dout() <<
"T = " << min.
T << std::endl;
573 Xyce::dout() <<
"n = " << min.
n << std::endl;
574 Xyce::dout() <<
"p = " << min.
p << std::endl;
599 template <
typename ScalarT>
606 double a_ccs, b_ccs, a_lic, b_lic, c_lic;
607 double ex_lic, mun0_lat, exn_lat;
608 double an_iis, bn_iis, mup0_lat, exp_lat;
609 double ap_iis, bp_iis;
628 else if(mater==
"gaas")
645 else if (mater==
"inalas" || mater==
"alinas")
662 else if (mater==
"ingaas" || mater==
"gainas")
679 else if (mater==
"inp")
696 else if (mater==
"ingap")
715 Report::UserFatal0() <<
"Carrier-carrier mobility model not supported for " << mater;
718 ScalarT n_impurity = fabs(min.
N);
721 ScalarT N = fabs(min.
n);
if(N == 0.0) N = 1.0;
722 ScalarT P = fabs(min.
p);
if(P == 0.0) P = 1.0;
725 ScalarT muc = a_ccs*pow((min.
T/min.
refTemp),1.5)/sqrt(P*N)*
726 1.0/(log(1.0+b_ccs*pow((min.
T/min.
refTemp),2.0)*pow(P*N,-1.0/3.0)));
733 ScalarT mul_h = mup0_lat*pow((min.
T/min.
refTemp), -exp_lat);
736 ScalarT gB_hole = bp_iis*pow((min.
T/min.
refTemp), 2.0)/(N+P);
738 ScalarT mui_h = (ap_iis*pow((min.
T/min.
refTemp),1.5)/n_impurity)/
739 (log(1.0 + gB_hole) - gB_hole/(1.0 + gB_hole));
741 ScalarT muic_h = 1.0/(1.0/muc + 1.0/mui_h);
743 if (std::fabs(b_lic) < std::numeric_limits<double>::epsilon())
745 mobil = mul_h*(a_lic - c_lic);
749 mobil = mul_h*(a_lic/(1.0+pow(b_lic*(mul_h/muic_h),ex_lic))-c_lic);
756 ScalarT mul_e = mun0_lat*pow((min.
T/min.
refTemp), -exn_lat);
759 ScalarT gB_elec = bn_iis*pow((min.
T/min.
refTemp), 2.0)/(N+P);
761 ScalarT mui_e = (an_iis*pow((min.
T/min.
refTemp),1.5)/n_impurity)/
762 (log(1.0 + gB_elec) - gB_elec/(1.0 + gB_elec));
764 ScalarT muic_e = 1.0/(1.0/muc + 1.0/mui_e);
766 if (std::fabs(b_lic) < std::numeric_limits<double>::epsilon())
768 mobil = mul_e*(a_lic - c_lic);
772 mobil = mul_e*(a_lic/(1.0+pow(b_lic*(mul_e/muic_e),ex_lic))-c_lic);
798 template <
typename ScalarT>
807 ScalarT mun0_lsm, mun1_lsm, mun2_lsm, crn_lsm, csn_lsm;
808 double bn_lsm, cn_lsm, dn_lsm, exn1_lsm, exn2_lsm, exn3_lsm;
809 double exn4_lsm, exn8_lsm;
810 double mup0_lsm, mup1_lsm, mup2_lsm, crp_lsm, csp_lsm;
811 double bp_lsm, cp_lsm, dp_lsm, exp1_lsm, exp2_lsm, exp3_lsm;
812 double exp4_lsm, exp8_lsm, pc_lsm;
816 mun0_lsm = 52.2; mup0_lsm = 44.9;
817 mun1_lsm = 43.4; mup1_lsm = 29.0;
818 mun2_lsm = 1417.0; mup2_lsm = 470.5;
819 crn_lsm = 9.68e16; crp_lsm = 2.23e17;
820 csn_lsm = 3.43e20; csp_lsm = 6.1e20;
821 bn_lsm = 4.75e7; bp_lsm = 9.93e6;
822 cn_lsm = 1.74e5; cp_lsm = 8.84e5;
823 dn_lsm = 5.82e14; dp_lsm = 2.05e14;
824 exn1_lsm = 0.680; exp1_lsm = 0.719;
825 exn2_lsm = 2.0; exp2_lsm = 2.0;
826 exn3_lsm = 2.5; exp3_lsm = 2.2;
827 exn4_lsm = 0.125; exp4_lsm = 0.0317;
828 exn8_lsm = 2.0; exp8_lsm = 2.0;
831 else if(mater==
"gaas")
833 mun0_lsm = 0.0; mup0_lsm = 0.0;
834 mun1_lsm = 0.0; mup1_lsm = 0.0;
835 mun2_lsm = 1e6; mup2_lsm = 1.0;
836 crn_lsm = 9.68e16; crp_lsm = 2.23e17;
837 csn_lsm = 0.0; csp_lsm = 0.0;
838 bn_lsm = 1e10; bp_lsm = 1e10;
839 cn_lsm = 0.0; cp_lsm = 0.0;
840 dn_lsm = 1e6; dp_lsm = 1e6;
841 exn1_lsm = 0.0; exp1_lsm = 0.0;
842 exn2_lsm = 0.0; exp2_lsm = 0.0;
843 exn3_lsm = 0.0; exp3_lsm = 0.0;
844 exn4_lsm = 0.0; exp4_lsm = 0.0;
845 exn8_lsm = 0.0; exp8_lsm = 0.0;
848 else if (mater==
"inalas" || mater==
"alinas")
850 mun0_lsm = 0.0; mup0_lsm = 0.0;
851 mun1_lsm = 0.0; mup1_lsm = 0.0;
852 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
853 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
854 csn_lsm = 0.0; csp_lsm = 0.0;
855 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
856 cn_lsm = 0.0; cp_lsm = 0.0;
857 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
858 exn1_lsm = 0.0; exp1_lsm = 0.0;
859 exn2_lsm = 0.0; exp2_lsm = 0.0;
860 exn3_lsm = 0.0; exp3_lsm = 0.0;
861 exn4_lsm = 0.0; exp4_lsm = 0.0;
862 exn8_lsm = 0.0; exp8_lsm = 0.0;
865 else if (mater==
"ingaas" || mater==
"gainas")
867 mun0_lsm = 0.0; mup0_lsm = 0.0;
868 mun1_lsm = 0.0; mup1_lsm = 0.0;
869 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
870 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
871 csn_lsm = 0.0; csp_lsm = 0.0;
872 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
873 cn_lsm = 0.0; cp_lsm = 0.0;
874 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
875 exn1_lsm = 0.0; exp1_lsm = 0.0;
876 exn2_lsm = 0.0; exp2_lsm = 0.0;
877 exn3_lsm = 0.0; exp3_lsm = 0.0;
878 exn4_lsm = 0.0; exp4_lsm = 0.0;
879 exn8_lsm = 0.0; exp8_lsm = 0.0;
882 else if (mater==
"inp")
884 mun0_lsm = 0.0; mup0_lsm = 0.0;
885 mun1_lsm = 0.0; mup1_lsm = 0.0;
886 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
887 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
888 csn_lsm = 0.0; csp_lsm = 0.0;
889 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
890 cn_lsm = 0.0; cp_lsm = 0.0;
891 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
892 exn1_lsm = 0.0; exp1_lsm = 0.0;
893 exn2_lsm = 0.0; exp2_lsm = 0.0;
894 exn3_lsm = 0.0; exp3_lsm = 0.0;
895 exn4_lsm = 0.0; exp4_lsm = 0.0;
896 exn8_lsm = 0.0; exp8_lsm = 0.0;
899 else if (mater==
"ingap")
901 mun0_lsm = 0.0; mup0_lsm = 0.0;
902 mun1_lsm = 0.0; mup1_lsm = 0.0;
903 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
904 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
905 csn_lsm = 0.0; csp_lsm = 0.0;
906 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
907 cn_lsm = 0.0; cp_lsm = 0.0;
908 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
909 exn1_lsm = 0.0; exp1_lsm = 0.0;
910 exn2_lsm = 0.0; exp2_lsm = 0.0;
911 exn3_lsm = 0.0; exp3_lsm = 0.0;
912 exn4_lsm = 0.0; exp4_lsm = 0.0;
913 exn8_lsm = 0.0; exp8_lsm = 0.0;
918 Report::UserFatal0() <<
"Lobardi surface mobility model not supported for " << mater;
923 muac = bp_lsm/min.
eperp + cp_lsm*pow(min.
N,exp4_lsm)/(min.
T*pow(min.
eperp,1.0/3.0));
924 mumax = mup2_lsm*pow((min.
T/min.
refTemp),-exp3_lsm);
925 mub = mup0_lsm*exp(-pc_lsm/min.
N) + mumax/(1.0 + pow(min.
N/crp_lsm, exp1_lsm))-
926 mup1_lsm/(1.0 + pow(csp_lsm/min.
N, exp2_lsm));
927 musr = dp_lsm/pow(min.
eperp, exp8_lsm);
931 muac = bn_lsm/min.
eperp + cn_lsm*pow(min.
N,exn4_lsm)/(min.
T*pow(min.
eperp,1.0/3.0));
932 mumax = mun2_lsm*pow((min.
T/min.
refTemp),-exn3_lsm);
933 mub = mun0_lsm + (mumax - mun0_lsm)/(1.0 + pow(min.
N/crn_lsm, exn1_lsm))-
934 mun1_lsm/(1.0 + pow(csn_lsm/min.
N, exn2_lsm));
935 musr = dn_lsm/pow(min.
eperp, exn8_lsm);
938 mobil = 1.0/(1.0/muac + 1.0/mub + 1.0/musr);
959 template <
typename ScalarT>
966 double mmnn_um, mmxn_um, nrfn_um, alpn_um, tetn_um, nrfd_um, crfd_um;
967 double mmnp_um, mmxp_um, nrfp_um, alpp_um, tetp_um, nrfa_um, crfa_um;
971 mmnn_um = 52.2; mmnp_um = 44.9;
972 mmxn_um = 1.417e3; mmxp_um = 470.5;
973 nrfn_um = 9.68e16; nrfp_um = 2.23e17;
974 alpn_um = 0.68; alpp_um = 0.719;
975 tetn_um = 2.285; tetp_um = 2.247;
976 nrfd_um = 4.0e20; nrfa_um = 7.2e20;
977 crfd_um = 0.21; crfa_um = 0.5;
979 else if(mater==
"gaas")
981 mmnn_um = 0.0; mmnp_um = 0.0;
982 mmxn_um = 8.5e3; mmxp_um = 400.0;
983 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
984 alpn_um = 1.0; alpp_um = 1.0;
985 tetn_um = 0.0; tetp_um = 0.0;
986 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
987 crfd_um = 1.0e30; crfa_um = 1.0e30;
989 else if (mater==
"inalas" || mater==
"alinas")
991 mmnn_um = 0.0; mmnp_um = 0.0;
992 mmxn_um = 2.414e4; mmxp_um = 480.0;
993 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
994 alpn_um = 1.0; alpp_um = 1.0;
995 tetn_um = 0.0; tetp_um = 0.0;
996 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
997 crfd_um = 1.0e30; crfa_um = 1.0e30;
999 else if (mater==
"ingaas" || mater==
"gainas")
1001 mmnn_um = 0.0; mmnp_um = 0.0;
1002 mmxn_um = 2.725e4; mmxp_um = 400.0;
1003 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1004 alpn_um = 1.0; alpp_um = 1.0;
1005 tetn_um = 0.0; tetp_um = 0.0;
1006 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1007 crfd_um = 1.0e30; crfa_um = 1.0e30;
1009 else if (mater==
"inp")
1011 mmnn_um = 0.0; mmnp_um = 0.0;
1012 mmxn_um = 2.414e4; mmxp_um = 480.0;
1013 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1014 alpn_um = 1.0; alpp_um = 1.0;
1015 tetn_um = 0.0; tetp_um = 0.0;
1016 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1017 crfd_um = 1.0e30; crfa_um = 1.0e30;
1019 else if (mater==
"ingap")
1021 mmnn_um = 0.0; mmnp_um = 0.0;
1022 mmxn_um = 200.0; mmxp_um = 150.0;
1023 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1024 alpn_um = 1.0; alpp_um = 1.0;
1025 tetn_um = 0.0; tetp_um = 0.0;
1026 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1027 crfd_um = 1.0e30; crfa_um = 1.0e30;
1031 Report::UserFatal0() <<
"Philips mobility model not supported for " << mater;
1035 double mh_mo = 1.258;
1036 ScalarT Nd_doping = min.
Nd;
1037 ScalarT Na_doping = min.
Na;
1038 ScalarT n_dens = min.
n;
1039 ScalarT p_dens = min.
p;
1041 if (Nd_doping <= 1.0 ) Nd_doping = 1.0;
1042 if (Na_doping <= 1.0 ) Na_doping = 1.0;
1043 if (n_dens <= 1.0 ) n_dens = 1.0;
1044 if (p_dens <= 1.0 ) p_dens = 1.0;
1046 ScalarT Ndeff = Nd_doping * ( 1.0 + 1.0/(crfd_um + pow(nrfd_um/Nd_doping,2.0)));
1047 ScalarT Naeff = Na_doping * ( 1.0 + 1.0/(crfa_um + pow(nrfa_um/Na_doping,2.0)));
1049 double vsat = 2.4e7/(1.0+0.8*exp(min.
T/600.0));
1054 ScalarT Nscp = Ndeff + Naeff + n_dens;
1055 ScalarT Pp = Tps*Tps * (1.0/( 2.459/(3.97e13*pow(Nscp,-2.0/3.0))
1056 + 3.828/(1.36e20/(n_dens+p_dens)*mh_mo) ));
1060 ScalarT Ppmin = 0.2891;
1061 ScalarT FPpmin = 1.0;
1062 ScalarT dFPpmin = 1.0;
1064 while( (FPpmin > 0.00001) || (FPpmin < -0.00001) )
1066 FPpmin = 1.0 - (0.89233/pow(0.41372+Ppmin*pow(1.0/mh_mo*Tps,0.28227),0.19778))
1067 + (0.005978/pow(Ppmin*pow(mh_mo/Tps,0.72169),1.80618));
1069 dFPpmin = -0.89233*(-0.19778)*
1070 pow(0.41372+Ppmin*pow(1.0/mh_mo*Tps,0.28227),-1.19778)*
1071 pow(1.0/mh_mo*Tps,0.28227) +
1072 0.005978*(-1.80618)*
1073 pow(Ppmin*pow(mh_mo/Tps,0.72169),-2.80618)*
1074 pow(mh_mo/Tps,0.72169);
1076 Ppmin = Ppmin - FPpmin/dFPpmin;
1079 ScalarT FPp = (0.7643*pow(Pp,0.6478) + 2.2999 + 6.5502*mh_mo/me_mo)
1080 /(pow(Pp,0.6478) + 2.3670 - 0.8552*mh_mo/me_mo);
1082 ScalarT GPp = 1.0 - (0.89233/pow(0.41372+Pp*pow(1.0/mh_mo*Tps,0.28227),0.19778))
1083 + (0.005978/pow(Pp*pow(mh_mo/Tps,0.72169),1.80618));
1087 GPp = 1.0 - (0.89233/pow(0.41372+Ppmin*pow(1.0/mh_mo*Tps,0.28227),0.19778))
1088 + (0.005978/pow(Ppmin*pow(mh_mo/Tps,0.72169),1.80618));
1091 ScalarT Nsceffp = Ndeff*GPp + Naeff + n_dens/FPp;
1092 ScalarT mulattp = mmxp_um * pow(Tps,-tetp_um);
1094 ScalarT mu1p = mmxp_um*mmxp_um/(mmxp_um-mmnp_um)*pow(Tps,3.0*alpp_um-1.5);
1095 ScalarT mu2p = mmxp_um*mmnp_um/(mmxp_um-mmnp_um)*pow(Tps,-0.5);
1097 ScalarT muDAn = mu1p*(Nscp/Nsceffp)*pow(nrfp_um/Nscp,alpp_um)
1098 + mu2p*(n_dens+p_dens)/Nsceffp;
1100 mobil = 1.0/(1.0/mulattp+1.0/muDAn);
1106 ScalarT Nscn = Ndeff + Naeff + p_dens;
1107 ScalarT Pn = Tns*Tns * (1.0/(2.459/(3.97e13*pow(Nscn,-2.0/3.0))
1108 + 3.828/(1.36e20/(n_dens+p_dens)*me_mo)));
1112 ScalarT Pnmin = 0.3246;
1113 ScalarT FPnmin = 1.0;
1114 ScalarT dFPnmin = 1.0;
1116 while( (FPnmin > 0.00001) || (FPnmin < -0.00001) )
1118 FPnmin = 1.0 - (0.89233/pow(0.41372+Pnmin*pow(1.0/me_mo*Tns,0.28227),0.19778))
1119 + (0.005978/pow(Pnmin*pow(me_mo/Tns,0.72169),1.80618));
1121 dFPnmin = -0.89233*(-0.19778)*
1122 pow(0.41372+Pnmin*pow(1.0/me_mo*Tns,0.28227),-1.19778)*
1123 pow(1.0/me_mo*Tns,0.28227) +
1124 0.005978*(-1.80618)*
1125 pow(Pnmin*pow(me_mo/Tns,0.72169),-2.80618)*
1126 pow(me_mo/Tns,0.72169);
1128 Pnmin = Pnmin - FPnmin/dFPnmin;
1131 ScalarT FPn = (0.7643*pow(Pn,0.6478) + 2.2999 + 6.5502*me_mo/mh_mo)
1132 /(pow(Pn,0.6478) + 2.3670 - 0.8552*me_mo/mh_mo);
1134 ScalarT GPn = 1.0 - (0.89233/pow(0.41372+Pn*pow(1.0/me_mo*Tns,0.28227),0.19778))
1135 + (0.005978/pow(Pn*pow(me_mo/Tns,0.72169),1.80618));
1139 GPn = 1.0 - (0.89233/pow(0.41372+Pnmin*pow(1.0/me_mo*Tns,0.28227),0.19778))
1140 + (0.005978/pow(Pnmin*pow(me_mo/Tns,0.72169),1.80618));
1143 ScalarT Nsceffn = Ndeff + Naeff*GPn + p_dens/FPn;
1144 ScalarT mulattn = mmxn_um * pow(Tns,-tetn_um);
1145 ScalarT mu1n = mmxn_um*mmxn_um/(mmxn_um-mmnn_um)*pow(Tns,3.0*alpn_um-1.5);
1146 ScalarT mu2n = mmxn_um*mmnn_um/(mmxn_um-mmnn_um)*pow(Tns,-0.5);
1148 ScalarT muDAp = mu1n*(Nscn/Nsceffn)*pow(nrfn_um/Nscn,alpn_um)
1149 + mu2n*(n_dens+p_dens)/Nsceffn;
1151 mobil = 1.0/(1.0/mulattn+1.0/muDAp);
1188 template <
typename ScalarT>
1192 ScalarT mob0 = mobil;
1197 double vsatn, betan, eon, vsatp, betan_ha, betap, eop, betap_ha, vsn_x1, vsn_x2;
1198 double en_x1, en_x2;
1202 vsatn = 1.035e7; betan = 2.0; eon = 4000.0;
1203 vsatp = 1.035e7; betan_ha = 2.0; betap = 1.0;
1204 eop = 4000.0; betap_ha = 2.0; vsn_x1 = 0.0;
1205 vsn_x2 = 0.0; en_x1 = 0.0; en_x2 = 0.0;
1210 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1214 mobil = mob0/ (1.0 + mob0*min.
epar/vsatn);
1217 else if(mater==
"ge")
1219 vsatn = 1.035e7; betan = 2.0; eon = 4000.0;
1220 vsatp = 1.035e7; betan_ha = 2.0; betap = 1.0;
1221 eop = 4000.0; betap_ha = 2.0; vsn_x1 = 0.0;
1222 vsn_x2 = 0.0; en_x1 = 0.0; en_x2 = 0.0;
1227 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1231 mobil = mob0/ (1.0 + mob0*min.
epar/vsatn);
1234 else if(mater==
"gaas")
1236 vsatn = 7.7e6; betan = 1.0; eon = 4000.0;
1237 vsatp = 7.7e6; betan_ha = 2.0; betap = 1.0;
1238 eop = 4000.0; betap_ha = 2.0; vsn_x1 = 0.0;
1239 vsn_x2 = 0.0; en_x1 = 0.0; en_x2 = 0.0;
1243 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1247 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1248 (1.0 + pow((min.
epar/eon),4.0));
1251 else if (mater==
"inalas" || mater==
"alinas")
1253 vsatn = 4.70e+06; betan = 1.0; eon = 8.40e+03;
1254 vsatp = 3.00e+6; betan_ha = 2.0; betap = 1.0;
1255 eop = 8.40e+03; betap_ha = 2.0; vsn_x1 = -0.7493;
1256 vsn_x2 = 0.0; en_x1 = 4.169; en_x2 = 0.0;
1260 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1264 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1265 (1.0 + pow((min.
epar/eon),4.0));
1268 else if (mater==
"ingaas" || mater==
"gainas")
1270 vsatn = 8.40e+06; betan = 1.0; eon = 5.07e+03;
1271 vsatp = 4.80e+06; betan_ha = 2.0; betap = 1.0;
1272 eop = 5.07e+03; betap_ha = 2.0; vsn_x1 = -1.019;
1273 vsn_x2 = 0.709; en_x1 = -0.7956; en_x2 = 0.63;
1277 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1281 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1282 (1.0 + pow((min.
epar/eon),4.0));
1285 else if (mater==
"inp")
1287 vsatn = 1.3e+07; betan = 1.0; eon = 1.06e+04;
1288 vsatp = 6.6e6; betan_ha = 2.0; betap = 1.0;
1289 eop = 1.06e+04; betap_ha = 2.0; vsn_x1 = -0.332;
1290 vsn_x2 = 0.0; en_x1 = 5.883; en_x2 = 0.0;
1294 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1298 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1299 (1.0 + pow((min.
epar/eon),4.0));
1302 else if (mater==
"ingap")
1304 vsatn = 7.7e6; betan = 1.0; eon = 4000.0;
1305 vsatp = 7.7e6; betan_ha = 2.0; betap = 1.0;
1306 eop = 4000.0; betap_ha = 2.0; vsn_x1 = -0.0341;
1307 vsn_x2 = 0.0; en_x1 = 1.533; en_x2 = 0.0;
1311 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1315 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1316 (1.0 + pow((min.
epar/eon),4.0));