44 #ifndef Xyce_N_DEV_MaterialSupport_h
45 #define Xyce_N_DEV_MaterialSupport_h
50 #include <N_UTL_Math.h>
55 #include <N_ERH_ErrorMgr.h>
56 #include <N_UTL_FeatureTest.h>
57 #include <N_UTL_ExtendedString.h>
58 #include <N_UTL_Param.h>
72 template <
typename ScalarT>
86 p(static_cast<ScalarT>(1.45e10)),
87 n(static_cast<ScalarT>(1.45e10)),
88 epar(static_cast<ScalarT>(0.0)),
89 eperp(static_cast<ScalarT>(1.5e4))
108 namespace MaterialSupport {
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 template <
typename ScalarT>
134 template <
typename ScalarT>
137 double workfunc(std::string & metal);
138 double affin(
const std::string & material);
139 double bandgap(
const std::string & material,
double temp);
141 double Ebgn(
const std::string & material,
const std::string & bgnModel,
double dope,
bool ntype);
142 double bennetWilsonEbgn (
const std::string & material,
double dope,
bool ntype);
143 double slotboomEbgn (
const std::string & material,
double dope,
bool ntype);
144 double jainEbgn (
const std::string & material,
double dope,
bool ntype);
145 double jain2Ebgn (
const std::string & material,
double dope,
bool ntype);
146 double jain3Ebgn (
const std::string & material,
double dope,
bool ntype);
148 double calcLt (
bool holeFlag,
double conc, std::string material=
"si");
150 double calcRsrh (
const std::string & material,
153 double tn,
double tp);
155 double calcRaug (
const std::string & material,
double ni,
double n,
double p);
157 double pdRsrhN (
const std::string & material,
double ni,
159 double tn,
double tp);
161 double pdRsrhP (
const std::string & material,
double ni,
163 double tn,
double tp);
165 double pdRaugN (
const std::string & material,
double ni,
double n,
double p);
166 double pdRaugP (
const std::string & material,
double ni,
double n,
double p);
168 double getNc (
const std::string & material,
double temp);
169 double getNv (
const std::string & material,
double temp);
171 double getNi (
const std::string & material,
double temp);
172 double getNi_old (
const std::string & material,
double temp);
174 double getRelPerm (
const std::string & material);
201 template <
typename ScalarT>
210 if(mobility==
"analytic" || mobility==
"caughey-thomas")
214 else if(mobility==
"arora")
218 else if(mobility==
"carr")
222 else if(mobility==
"carrier")
226 else if(mobility==
"surface" || mobility==
"lombardi")
230 else if(mobility==
"philips")
234 else if(mobility==
"iii-v")
240 Report::UserFatal0() <<
"Mobility model " << mobility <<
" not recognized.";
248 if (DEBUG_DEVICE && mobil != 0.0 && !(mobil > 0.0) && !(mobil < 0.0))
250 Report::DevelFatal0().in(
"MaterialSupport::calcMob") <<
"Mobility calc = nan.";
270 template <
typename ScalarT>
276 double mun_min, mup_min;
277 double mun_max, mup_max;
278 double nun, nup, xin, xip, nrefn, nrefp, alphan, alphap;
282 mun_min = 55.24; mup_min = 49.7;
283 mun_max = 1429.23; mup_max = 479.37;
284 nrefn = 1.072e17; nrefp = 1.606e17;
285 nun = -2.3; nup = -2.2;
286 xin = -3.8; xip = -3.7;
287 alphan = 0.733; alphap = 0.70;
289 else if(mater==
"gaas")
291 mun_min = 0.0; mup_min = 0.0;
292 mun_max = 8500.0; mup_max = 400.0;
293 nrefn = 1.69e17; nrefp = 2.75e17;
294 nun = -1.0; nup = -2.1;
295 xin = 0.0; xip = 0.0;
296 alphan = 0.436; alphap = 0.395;
298 else if(mater==
"sio2")
300 mun_min = 1e1; mup_min = 1e-5;
301 mun_max = 2e1; mup_max = 1e-5;
302 nrefn = 1.072e17; nrefp = 1.606e17;
303 nun = -2.3; nup = -2.2;
304 xin = -3.8; xip = -3.7;
305 alphan = 0.733; alphap = 0.70;
307 else if (mater==
"inalas" || mater==
"alinas")
309 mun_min = 497.0; mup_min = 0.0;
310 mun_max = 2.41e4; mup_max = 480.0;
311 nrefn = 1.0e17; nrefp = 1.0e30;
312 nun = 0.0; nup = 0.0;
313 xin = 0.0; xip = 0.0;
314 alphan = 1.0; alphap = 1.0;
317 else if (mater==
"ingaas" || mater==
"gainas")
319 mun_min = 4000.0; mup_min = 0.0;
320 mun_max = 2.73e4; mup_max = 480.0;
321 nrefn = 3.63e17; nrefp = 1.0e30;
322 nun = 0.0; nup = 0.0;
323 xin = 0.0; xip = 0.0;
324 alphan = 1.0; alphap = 1.0;
326 else if (mater==
"inp")
328 mun_min = 497.0; mup_min = 0.0;
329 mun_max = 2.41e4; mup_max = 480.0;
330 nrefn = 1.0e17; nrefp = 1.0e30;
331 nun = 0.0; nup = 0.0;
332 xin = 0.0; xip = 0.0;
333 alphan = 1.0; alphap = 1.0;
335 else if (mater==
"ingap")
337 mun_min = 0.95; mup_min = 0.0;
338 mun_max = 200.0; mup_max = 150.0;
339 nrefn = 1.0e17; nrefp = 1.0e30;
340 nun = 0.0; nup = 0.0;
341 xin = 0.0; xip = 0.0;
342 alphan = 1.0; alphap = 1.0;
346 Report::UserFatal0() <<
"Analytic (Caughy-Thomas) mobility model not supported for " << mater;
353 (mup_max*pow((min.
T/min.
refTemp),nup) - mup_min)/
354 (1.0 + pow((min.
T/min.
refTemp),xip)*pow((min.
N/nrefp),alphap));
360 (mun_max*pow((min.
T/min.
refTemp),nun) - mun_min)/
361 (1.0 + pow((min.
T/min.
refTemp),xin)*pow((min.
N/nrefn),alphan));
382 template <
typename ScalarT>
388 double mun1_aro, mup1_aro, mun2_aro, mup2_aro, an_arora, ap_arora;
389 double cn_arora, cp_arora, exn1_aro, exp1_aro, exn2_aro, exp2_aro;
390 double exn3_aro, exp3_aro, exn4_aro, exp4_aro;
391 double alphan, alphap;
395 mun1_aro = 88.0; mup1_aro = 54.3;
396 mun2_aro = 1252.0; mup2_aro = 407.0;
397 an_arora = 0.88; ap_arora = 0.88;
398 cn_arora = 1.26e17; cp_arora = 2.35e17;
399 exn1_aro = -0.57; exp1_aro = -0.57;
400 exn2_aro = -2.33; exp2_aro = -2.33;
401 exn3_aro = 2.4; exp3_aro = 2.4;
402 exn4_aro = -0.146; exp4_aro = -0.146;
404 else if(mater==
"gaas")
406 mun1_aro = 8.5e3; mup1_aro = 4e2;
407 mun2_aro = 0.0; mup2_aro = 0.0;
408 an_arora = 0.0; ap_arora = 0.0;
409 cn_arora = 1.26e17; cp_arora = 2.35e17;
410 exn1_aro = -5.7e-1; exp1_aro = 0.0;
411 exn2_aro = 0.0; exp2_aro = 0.0;
412 exn3_aro = 0.0; exp3_aro = 0.0;
413 exn4_aro = 0.0; exp4_aro = 0.0;
415 else if(mater==
"sio2")
417 mun1_aro = 1e1; mup1_aro = 1e-5;
418 mun2_aro = 2e1; mup2_aro = 2e-5;
419 an_arora = 0.88; ap_arora = 0.88;
420 cn_arora = 1.26e17; cp_arora = 2.35e17;
421 exn1_aro = -0.57; exp1_aro = -0.57;
422 exn2_aro = -2.33; exp2_aro = -2.33;
423 exn3_aro = 2.4; exp3_aro = 2.4;
424 exn4_aro = -0.146; exp4_aro = -0.146;
426 else if (mater==
"inalas" || mater==
"alinas")
428 mun1_aro = 2.41e4; mup1_aro = 480.0;
429 mun2_aro = 0.0; mup2_aro = 0.0;
430 an_arora = 1.0; ap_arora = 1.0;
431 cn_arora = 1.0e20; cp_arora = 1.0e20;
432 exn1_aro = 0.0; exp1_aro = 0.0;
433 exn2_aro = 0.0; exp2_aro = 0.0;
434 exn3_aro = 0.0; exp3_aro = 0.0;
435 exn4_aro = 0.0; exp4_aro = 0.0;
437 else if (mater==
"ingaas" || mater==
"gainas")
439 mun1_aro = 2.73e4; mup1_aro = 480.0;
440 mun2_aro = 0.0; mup2_aro = 0.0;
441 an_arora = 1.0; ap_arora = 1.0;
442 cn_arora = 1.0e20; cp_arora = 1.0e20;
443 exn1_aro = 0.0; exp1_aro = 0.0;
444 exn2_aro = 0.0; exp2_aro = 0.0;
445 exn3_aro = 0.0; exp3_aro = 0.0;
446 exn4_aro = 0.0; exp4_aro = 0.0;
448 else if (mater==
"inp")
450 mun1_aro = 2.41e4; mup1_aro = 480.0;
451 mun2_aro = 0.0; mup2_aro = 0.0;
452 an_arora = 1.0; ap_arora = 1.0;
453 cn_arora = 1.0e20; cp_arora = 1.0e20;
454 exn1_aro = 0.0; exp1_aro = 0.0;
455 exn2_aro = 0.0; exp2_aro = 0.0;
456 exn3_aro = 0.0; exp3_aro = 0.0;
457 exn4_aro = 0.0; exp4_aro = 0.0;
459 else if (mater==
"ingap")
461 mun1_aro = 200.0; mup1_aro = 150.0;
462 mun2_aro = 0.0; mup2_aro = 0.0;
463 an_arora = 1.0; ap_arora = 1.0;
464 cn_arora = 1.0e20; cp_arora = 1.0e20;
465 exn1_aro = 0.0; exp1_aro = 0.0;
466 exn2_aro = 0.0; exp2_aro = 0.0;
467 exn3_aro = 0.0; exp3_aro = 0.0;
468 exn4_aro = 0.0; exp4_aro = 0.0;
472 Report::UserFatal0() <<
"Arora mobility model not supported for " << mater;
475 alphan = an_arora*pow((min.
T/min.
refTemp),exn4_aro);
476 alphap = ap_arora*pow((min.
T/min.
refTemp),exp4_aro);
480 mobil = mup1_aro*pow((min.
T/min.
refTemp),exp1_aro)+
481 (mup2_aro*pow((min.
T/min.
refTemp),exp2_aro))/
482 (1.0+pow((min.
N/cp_arora*pow((min.
T/min.
refTemp),exp3_aro)),alphap));
487 mun1_aro*pow((min.
T/min.
refTemp),exn1_aro)+
488 (mun2_aro*pow((min.
T/min.
refTemp),exn2_aro))/
489 (1.0+pow((min.
N/cn_arora*pow((min.
T/min.
refTemp),exn3_aro)),alphan));
511 template <
typename ScalarT>
518 double Al, Bl, Ai, Bi;
540 else if(mater==
"gaas")
559 Report::UserFatal0() <<
"Carrier-carrier mobility model not supported for " << mater;
563 mul = Al*pow((min.
T/min.
refTemp),Bl);
566 mui = (Ai*pow(min.
T,1.5)/min.
N)*(log(1.0+Bi*min.
T*min.
T/min.
N)-
567 Bi*min.
T*min.
T/(min.
N+Bi*min.
T*min.
T));
571 ScalarT N = std::fabs(min.
n);
if(N == 0.0) N = 1.0;
572 ScalarT P = std::fabs(min.
p);
if(P == 0.0) P = 1.0;
574 muc = (2.0e17*pow(min.
T,1.5)/std::sqrt(P*N))*
575 1.0/(log(1.0+8.28e8*min.
T*min.
T*pow(P*N,-1.0/3.0)));
577 X = sqrt(6.0*mul*(mui+muc)/(mui*muc));
578 mobil = mul*(1.025/(1.0+pow(X/1.68,1.43))-0.025);
580 if (DEBUG_DEVICE && mobil != 0.0 && !(mobil > 0.0) && !(mobil < 0.0))
582 Xyce::dout() <<
"mobil is nan" << std::endl;
583 Xyce::dout() <<
"mul = " << mul << std::endl;
584 Xyce::dout() <<
"mui = " << mui << std::endl;
585 Xyce::dout() <<
"muc = " << muc << std::endl;
586 Xyce::dout() <<
"X = " << X << std::endl;
587 Xyce::dout() <<
"T = " << min.
T << std::endl;
588 Xyce::dout() <<
"n = " << min.
n << std::endl;
589 Xyce::dout() <<
"p = " << min.
p << std::endl;
613 template <
typename ScalarT>
620 double a_ccs, b_ccs, a_lic, b_lic, c_lic;
621 double ex_lic, mun0_lat, exn_lat;
622 double an_iis, bn_iis, mup0_lat, exp_lat;
623 double ap_iis, bp_iis;
642 else if(mater==
"gaas")
659 else if (mater==
"inalas" || mater==
"alinas")
676 else if (mater==
"ingaas" || mater==
"gainas")
693 else if (mater==
"inp")
710 else if (mater==
"ingap")
729 Report::UserFatal0() <<
"Carrier-carrier mobility model not supported for " << mater;
732 ScalarT n_impurity = std::fabs(min.
N);
735 ScalarT N = std::fabs(min.
n);
if(N == 0.0) N = 1.0;
736 ScalarT P = std::fabs(min.
p);
if(P == 0.0) P = 1.0;
739 ScalarT muc = a_ccs*pow((min.
T/min.
refTemp),1.5)/std::sqrt(P*N)*
740 1.0/(log(1.0+b_ccs*pow((min.
T/min.
refTemp),2.0)*pow(P*N,-1.0/3.0)));
747 ScalarT mul_h = mup0_lat*pow((min.
T/min.
refTemp), -exp_lat);
750 ScalarT gB_hole = bp_iis*pow((min.
T/min.
refTemp), 2.0)/(N+P);
752 ScalarT mui_h = (ap_iis*pow((min.
T/min.
refTemp),1.5)/n_impurity)/
753 (log(1.0 + gB_hole) - gB_hole/(1.0 + gB_hole));
755 ScalarT muic_h = 1.0/(1.0/muc + 1.0/mui_h);
757 if (std::fabs(b_lic) < std::numeric_limits<double>::epsilon())
759 mobil = mul_h*(a_lic - c_lic);
763 mobil = mul_h*(a_lic/(1.0+pow(b_lic*(mul_h/muic_h),ex_lic))-c_lic);
770 ScalarT mul_e = mun0_lat*pow((min.
T/min.
refTemp), -exn_lat);
773 ScalarT gB_elec = bn_iis*pow((min.
T/min.
refTemp), 2.0)/(N+P);
775 ScalarT mui_e = (an_iis*pow((min.
T/min.
refTemp),1.5)/n_impurity)/
776 (log(1.0 + gB_elec) - gB_elec/(1.0 + gB_elec));
778 ScalarT muic_e = 1.0/(1.0/muc + 1.0/mui_e);
780 if (std::fabs(b_lic) < std::numeric_limits<double>::epsilon())
782 mobil = mul_e*(a_lic - c_lic);
786 mobil = mul_e*(a_lic/(1.0+pow(b_lic*(mul_e/muic_e),ex_lic))-c_lic);
812 template <
typename ScalarT>
821 ScalarT mun0_lsm, mun1_lsm, mun2_lsm, crn_lsm, csn_lsm;
822 double bn_lsm, cn_lsm, dn_lsm, exn1_lsm, exn2_lsm, exn3_lsm;
823 double exn4_lsm, exn8_lsm;
824 double mup0_lsm, mup1_lsm, mup2_lsm, crp_lsm, csp_lsm;
825 double bp_lsm, cp_lsm, dp_lsm, exp1_lsm, exp2_lsm, exp3_lsm;
826 double exp4_lsm, exp8_lsm, pc_lsm;
830 mun0_lsm = 52.2; mup0_lsm = 44.9;
831 mun1_lsm = 43.4; mup1_lsm = 29.0;
832 mun2_lsm = 1417.0; mup2_lsm = 470.5;
833 crn_lsm = 9.68e16; crp_lsm = 2.23e17;
834 csn_lsm = 3.43e20; csp_lsm = 6.1e20;
835 bn_lsm = 4.75e7; bp_lsm = 9.93e6;
836 cn_lsm = 1.74e5; cp_lsm = 8.84e5;
837 dn_lsm = 5.82e14; dp_lsm = 2.05e14;
838 exn1_lsm = 0.680; exp1_lsm = 0.719;
839 exn2_lsm = 2.0; exp2_lsm = 2.0;
840 exn3_lsm = 2.5; exp3_lsm = 2.2;
841 exn4_lsm = 0.125; exp4_lsm = 0.0317;
842 exn8_lsm = 2.0; exp8_lsm = 2.0;
845 else if(mater==
"gaas")
847 mun0_lsm = 0.0; mup0_lsm = 0.0;
848 mun1_lsm = 0.0; mup1_lsm = 0.0;
849 mun2_lsm = 1e6; mup2_lsm = 1.0;
850 crn_lsm = 9.68e16; crp_lsm = 2.23e17;
851 csn_lsm = 0.0; csp_lsm = 0.0;
852 bn_lsm = 1e10; bp_lsm = 1e10;
853 cn_lsm = 0.0; cp_lsm = 0.0;
854 dn_lsm = 1e6; dp_lsm = 1e6;
855 exn1_lsm = 0.0; exp1_lsm = 0.0;
856 exn2_lsm = 0.0; exp2_lsm = 0.0;
857 exn3_lsm = 0.0; exp3_lsm = 0.0;
858 exn4_lsm = 0.0; exp4_lsm = 0.0;
859 exn8_lsm = 0.0; exp8_lsm = 0.0;
862 else if (mater==
"inalas" || mater==
"alinas")
864 mun0_lsm = 0.0; mup0_lsm = 0.0;
865 mun1_lsm = 0.0; mup1_lsm = 0.0;
866 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
867 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
868 csn_lsm = 0.0; csp_lsm = 0.0;
869 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
870 cn_lsm = 0.0; cp_lsm = 0.0;
871 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
872 exn1_lsm = 0.0; exp1_lsm = 0.0;
873 exn2_lsm = 0.0; exp2_lsm = 0.0;
874 exn3_lsm = 0.0; exp3_lsm = 0.0;
875 exn4_lsm = 0.0; exp4_lsm = 0.0;
876 exn8_lsm = 0.0; exp8_lsm = 0.0;
879 else if (mater==
"ingaas" || mater==
"gainas")
881 mun0_lsm = 0.0; mup0_lsm = 0.0;
882 mun1_lsm = 0.0; mup1_lsm = 0.0;
883 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
884 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
885 csn_lsm = 0.0; csp_lsm = 0.0;
886 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
887 cn_lsm = 0.0; cp_lsm = 0.0;
888 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
889 exn1_lsm = 0.0; exp1_lsm = 0.0;
890 exn2_lsm = 0.0; exp2_lsm = 0.0;
891 exn3_lsm = 0.0; exp3_lsm = 0.0;
892 exn4_lsm = 0.0; exp4_lsm = 0.0;
893 exn8_lsm = 0.0; exp8_lsm = 0.0;
896 else if (mater==
"inp")
898 mun0_lsm = 0.0; mup0_lsm = 0.0;
899 mun1_lsm = 0.0; mup1_lsm = 0.0;
900 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
901 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
902 csn_lsm = 0.0; csp_lsm = 0.0;
903 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
904 cn_lsm = 0.0; cp_lsm = 0.0;
905 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
906 exn1_lsm = 0.0; exp1_lsm = 0.0;
907 exn2_lsm = 0.0; exp2_lsm = 0.0;
908 exn3_lsm = 0.0; exp3_lsm = 0.0;
909 exn4_lsm = 0.0; exp4_lsm = 0.0;
910 exn8_lsm = 0.0; exp8_lsm = 0.0;
913 else if (mater==
"ingap")
915 mun0_lsm = 0.0; mup0_lsm = 0.0;
916 mun1_lsm = 0.0; mup1_lsm = 0.0;
917 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
918 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
919 csn_lsm = 0.0; csp_lsm = 0.0;
920 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
921 cn_lsm = 0.0; cp_lsm = 0.0;
922 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
923 exn1_lsm = 0.0; exp1_lsm = 0.0;
924 exn2_lsm = 0.0; exp2_lsm = 0.0;
925 exn3_lsm = 0.0; exp3_lsm = 0.0;
926 exn4_lsm = 0.0; exp4_lsm = 0.0;
927 exn8_lsm = 0.0; exp8_lsm = 0.0;
932 Report::UserFatal0() <<
"Lobardi surface mobility model not supported for " << mater;
937 muac = bp_lsm/min.
eperp + cp_lsm*pow(min.
N,exp4_lsm)/(min.
T*pow(min.
eperp,1.0/3.0));
938 mumax = mup2_lsm*pow((min.
T/min.
refTemp),-exp3_lsm);
939 mub = mup0_lsm*exp(-pc_lsm/min.
N) + mumax/(1.0 + pow(min.
N/crp_lsm, exp1_lsm))-
940 mup1_lsm/(1.0 + pow(csp_lsm/min.
N, exp2_lsm));
941 musr = dp_lsm/pow(min.
eperp, exp8_lsm);
945 muac = bn_lsm/min.
eperp + cn_lsm*pow(min.
N,exn4_lsm)/(min.
T*pow(min.
eperp,1.0/3.0));
946 mumax = mun2_lsm*pow((min.
T/min.
refTemp),-exn3_lsm);
947 mub = mun0_lsm + (mumax - mun0_lsm)/(1.0 + pow(min.
N/crn_lsm, exn1_lsm))-
948 mun1_lsm/(1.0 + pow(csn_lsm/min.
N, exn2_lsm));
949 musr = dn_lsm/pow(min.
eperp, exn8_lsm);
952 mobil = 1.0/(1.0/muac + 1.0/mub + 1.0/musr);
973 template <
typename ScalarT>
980 double mmnn_um, mmxn_um, nrfn_um, alpn_um, tetn_um, nrfd_um, crfd_um;
981 double mmnp_um, mmxp_um, nrfp_um, alpp_um, tetp_um, nrfa_um, crfa_um;
985 mmnn_um = 52.2; mmnp_um = 44.9;
986 mmxn_um = 1.417e3; mmxp_um = 470.5;
987 nrfn_um = 9.68e16; nrfp_um = 2.23e17;
988 alpn_um = 0.68; alpp_um = 0.719;
989 tetn_um = 2.285; tetp_um = 2.247;
990 nrfd_um = 4.0e20; nrfa_um = 7.2e20;
991 crfd_um = 0.21; crfa_um = 0.5;
993 else if(mater==
"gaas")
995 mmnn_um = 0.0; mmnp_um = 0.0;
996 mmxn_um = 8.5e3; mmxp_um = 400.0;
997 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
998 alpn_um = 1.0; alpp_um = 1.0;
999 tetn_um = 0.0; tetp_um = 0.0;
1000 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1001 crfd_um = 1.0e30; crfa_um = 1.0e30;
1003 else if (mater==
"inalas" || mater==
"alinas")
1005 mmnn_um = 0.0; mmnp_um = 0.0;
1006 mmxn_um = 2.414e4; mmxp_um = 480.0;
1007 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1008 alpn_um = 1.0; alpp_um = 1.0;
1009 tetn_um = 0.0; tetp_um = 0.0;
1010 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1011 crfd_um = 1.0e30; crfa_um = 1.0e30;
1013 else if (mater==
"ingaas" || mater==
"gainas")
1015 mmnn_um = 0.0; mmnp_um = 0.0;
1016 mmxn_um = 2.725e4; mmxp_um = 400.0;
1017 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1018 alpn_um = 1.0; alpp_um = 1.0;
1019 tetn_um = 0.0; tetp_um = 0.0;
1020 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1021 crfd_um = 1.0e30; crfa_um = 1.0e30;
1023 else if (mater==
"inp")
1025 mmnn_um = 0.0; mmnp_um = 0.0;
1026 mmxn_um = 2.414e4; mmxp_um = 480.0;
1027 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1028 alpn_um = 1.0; alpp_um = 1.0;
1029 tetn_um = 0.0; tetp_um = 0.0;
1030 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1031 crfd_um = 1.0e30; crfa_um = 1.0e30;
1033 else if (mater==
"ingap")
1035 mmnn_um = 0.0; mmnp_um = 0.0;
1036 mmxn_um = 200.0; mmxp_um = 150.0;
1037 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1038 alpn_um = 1.0; alpp_um = 1.0;
1039 tetn_um = 0.0; tetp_um = 0.0;
1040 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1041 crfd_um = 1.0e30; crfa_um = 1.0e30;
1045 Report::UserFatal0() <<
"Philips mobility model not supported for " << mater;
1049 double mh_mo = 1.258;
1050 ScalarT Nd_doping = min.
Nd;
1051 ScalarT Na_doping = min.
Na;
1052 ScalarT n_dens = min.
n;
1053 ScalarT p_dens = min.
p;
1055 if (Nd_doping <= 1.0 ) Nd_doping = 1.0;
1056 if (Na_doping <= 1.0 ) Na_doping = 1.0;
1057 if (n_dens <= 1.0 ) n_dens = 1.0;
1058 if (p_dens <= 1.0 ) p_dens = 1.0;
1060 ScalarT Ndeff = Nd_doping * ( 1.0 + 1.0/(crfd_um + pow(nrfd_um/Nd_doping,2.0)));
1061 ScalarT Naeff = Na_doping * ( 1.0 + 1.0/(crfa_um + pow(nrfa_um/Na_doping,2.0)));
1063 double vsat = 2.4e7/(1.0+0.8*exp(min.
T/600.0));
1068 ScalarT Nscp = Ndeff + Naeff + n_dens;
1069 ScalarT Pp = Tps*Tps * (1.0/( 2.459/(3.97e13*pow(Nscp,-2.0/3.0))
1070 + 3.828/(1.36e20/(n_dens+p_dens)*mh_mo) ));
1074 ScalarT Ppmin = 0.2891;
1075 ScalarT FPpmin = 1.0;
1076 ScalarT dFPpmin = 1.0;
1078 while( (FPpmin > 0.00001) || (FPpmin < -0.00001) )
1080 FPpmin = 1.0 - (0.89233/pow(0.41372+Ppmin*pow(1.0/mh_mo*Tps,0.28227),0.19778))
1081 + (0.005978/pow(Ppmin*pow(mh_mo/Tps,0.72169),1.80618));
1083 dFPpmin = -0.89233*(-0.19778)*
1084 pow(0.41372+Ppmin*pow(1.0/mh_mo*Tps,0.28227),-1.19778)*
1085 pow(1.0/mh_mo*Tps,0.28227) +
1086 0.005978*(-1.80618)*
1087 pow(Ppmin*pow(mh_mo/Tps,0.72169),-2.80618)*
1088 pow(mh_mo/Tps,0.72169);
1090 Ppmin = Ppmin - FPpmin/dFPpmin;
1093 ScalarT FPp = (0.7643*pow(Pp,0.6478) + 2.2999 + 6.5502*mh_mo/me_mo)
1094 /(pow(Pp,0.6478) + 2.3670 - 0.8552*mh_mo/me_mo);
1096 ScalarT GPp = 1.0 - (0.89233/pow(0.41372+Pp*pow(1.0/mh_mo*Tps,0.28227),0.19778))
1097 + (0.005978/pow(Pp*pow(mh_mo/Tps,0.72169),1.80618));
1101 GPp = 1.0 - (0.89233/pow(0.41372+Ppmin*pow(1.0/mh_mo*Tps,0.28227),0.19778))
1102 + (0.005978/pow(Ppmin*pow(mh_mo/Tps,0.72169),1.80618));
1105 ScalarT Nsceffp = Ndeff*GPp + Naeff + n_dens/FPp;
1106 ScalarT mulattp = mmxp_um * pow(Tps,-tetp_um);
1108 ScalarT mu1p = mmxp_um*mmxp_um/(mmxp_um-mmnp_um)*pow(Tps,3.0*alpp_um-1.5);
1109 ScalarT mu2p = mmxp_um*mmnp_um/(mmxp_um-mmnp_um)*pow(Tps,-0.5);
1111 ScalarT muDAn = mu1p*(Nscp/Nsceffp)*pow(nrfp_um/Nscp,alpp_um)
1112 + mu2p*(n_dens+p_dens)/Nsceffp;
1114 mobil = 1.0/(1.0/mulattp+1.0/muDAn);
1120 ScalarT Nscn = Ndeff + Naeff + p_dens;
1121 ScalarT Pn = Tns*Tns * (1.0/(2.459/(3.97e13*pow(Nscn,-2.0/3.0))
1122 + 3.828/(1.36e20/(n_dens+p_dens)*me_mo)));
1126 ScalarT Pnmin = 0.3246;
1127 ScalarT FPnmin = 1.0;
1128 ScalarT dFPnmin = 1.0;
1130 while( (FPnmin > 0.00001) || (FPnmin < -0.00001) )
1132 FPnmin = 1.0 - (0.89233/pow(0.41372+Pnmin*pow(1.0/me_mo*Tns,0.28227),0.19778))
1133 + (0.005978/pow(Pnmin*pow(me_mo/Tns,0.72169),1.80618));
1135 dFPnmin = -0.89233*(-0.19778)*
1136 pow(0.41372+Pnmin*pow(1.0/me_mo*Tns,0.28227),-1.19778)*
1137 pow(1.0/me_mo*Tns,0.28227) +
1138 0.005978*(-1.80618)*
1139 pow(Pnmin*pow(me_mo/Tns,0.72169),-2.80618)*
1140 pow(me_mo/Tns,0.72169);
1142 Pnmin = Pnmin - FPnmin/dFPnmin;
1145 ScalarT FPn = (0.7643*pow(Pn,0.6478) + 2.2999 + 6.5502*me_mo/mh_mo)
1146 /(pow(Pn,0.6478) + 2.3670 - 0.8552*me_mo/mh_mo);
1148 ScalarT GPn = 1.0 - (0.89233/pow(0.41372+Pn*pow(1.0/me_mo*Tns,0.28227),0.19778))
1149 + (0.005978/pow(Pn*pow(me_mo/Tns,0.72169),1.80618));
1153 GPn = 1.0 - (0.89233/pow(0.41372+Pnmin*pow(1.0/me_mo*Tns,0.28227),0.19778))
1154 + (0.005978/pow(Pnmin*pow(me_mo/Tns,0.72169),1.80618));
1157 ScalarT Nsceffn = Ndeff + Naeff*GPn + p_dens/FPn;
1158 ScalarT mulattn = mmxn_um * pow(Tns,-tetn_um);
1159 ScalarT mu1n = mmxn_um*mmxn_um/(mmxn_um-mmnn_um)*pow(Tns,3.0*alpn_um-1.5);
1160 ScalarT mu2n = mmxn_um*mmnn_um/(mmxn_um-mmnn_um)*pow(Tns,-0.5);
1162 ScalarT muDAp = mu1n*(Nscn/Nsceffn)*pow(nrfn_um/Nscn,alpn_um)
1163 + mu2n*(n_dens+p_dens)/Nsceffn;
1165 mobil = 1.0/(1.0/mulattn+1.0/muDAp);
1185 template <
typename ScalarT>
1192 double hole0FieldMob,electron0FieldMob;
1193 double fieldSat,electronVSat,holeVSat;
1199 else if(mater==
"gaas")
1201 hole0FieldMob = 30.0;
1202 electron0FieldMob = 2240.0;
1204 electronVSat = 7.7e6;
1207 else if (mater==
"inalas" || mater==
"alinas")
1211 else if (mater==
"ingaas" || mater==
"gainas")
1215 else if (mater==
"inp")
1219 else if (mater==
"ingap")
1225 Report::UserFatal0() <<
"III-V mobility model not supported for " << mater;
1232 ScalarT ratio = hole0FieldMob*abs(min.
epar)/holeVSat;
1234 mobil = hole0FieldMob/(1.0+ratio);
1240 ScalarT fieldRatio = pow(pow(abs(min.
epar),0.75)/fieldSat,4.0);
1242 ScalarT vfRatio = electronVSat;
1244 ScalarT eMobNumerator = electron0FieldMob + vfRatio*fieldRatio;
1246 ScalarT eMobDenominator = 1.0 + abs(min.
epar)*fieldRatio;
1248 mobil = eMobNumerator/eMobDenominator;
1285 template <
typename ScalarT>
1289 ScalarT mob0 = mobil;
1294 double vsatn, betan, eon, vsatp, betan_ha, betap, eop, betap_ha, vsn_x1, vsn_x2;
1295 double en_x1, en_x2;
1299 vsatn = 1.035e7; betan = 2.0; eon = 4000.0;
1300 vsatp = 1.035e7; betan_ha = 2.0; betap = 1.0;
1301 eop = 4000.0; betap_ha = 2.0; vsn_x1 = 0.0;
1302 vsn_x2 = 0.0; en_x1 = 0.0; en_x2 = 0.0;
1307 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1311 mobil = mob0/ (1.0 + mob0*min.
epar/vsatn);
1314 else if(mater==
"ge")
1316 vsatn = 1.035e7; betan = 2.0; eon = 4000.0;
1317 vsatp = 1.035e7; betan_ha = 2.0; betap = 1.0;
1318 eop = 4000.0; betap_ha = 2.0; vsn_x1 = 0.0;
1319 vsn_x2 = 0.0; en_x1 = 0.0; en_x2 = 0.0;
1324 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1328 mobil = mob0/ (1.0 + mob0*min.
epar/vsatn);
1331 else if(mater==
"gaas")
1333 vsatn = 7.7e6; betan = 1.0; eon = 4000.0;
1334 vsatp = 7.7e6; betan_ha = 2.0; betap = 1.0;
1335 eop = 4000.0; betap_ha = 2.0; vsn_x1 = 0.0;
1336 vsn_x2 = 0.0; en_x1 = 0.0; en_x2 = 0.0;
1340 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1344 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1345 (1.0 + pow((min.
epar/eon),4.0));
1348 else if (mater==
"inalas" || mater==
"alinas")
1350 vsatn = 4.70e+06; betan = 1.0; eon = 8.40e+03;
1351 vsatp = 3.00e+6; betan_ha = 2.0; betap = 1.0;
1352 eop = 8.40e+03; betap_ha = 2.0; vsn_x1 = -0.7493;
1353 vsn_x2 = 0.0; en_x1 = 4.169; en_x2 = 0.0;
1357 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1361 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1362 (1.0 + pow((min.
epar/eon),4.0));
1365 else if (mater==
"ingaas" || mater==
"gainas")
1367 vsatn = 8.40e+06; betan = 1.0; eon = 5.07e+03;
1368 vsatp = 4.80e+06; betan_ha = 2.0; betap = 1.0;
1369 eop = 5.07e+03; betap_ha = 2.0; vsn_x1 = -1.019;
1370 vsn_x2 = 0.709; en_x1 = -0.7956; en_x2 = 0.63;
1374 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1378 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1379 (1.0 + pow((min.
epar/eon),4.0));
1382 else if (mater==
"inp")
1384 vsatn = 1.3e+07; betan = 1.0; eon = 1.06e+04;
1385 vsatp = 6.6e6; betan_ha = 2.0; betap = 1.0;
1386 eop = 1.06e+04; betap_ha = 2.0; vsn_x1 = -0.332;
1387 vsn_x2 = 0.0; en_x1 = 5.883; en_x2 = 0.0;
1391 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1395 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1396 (1.0 + pow((min.
epar/eon),4.0));
1399 else if (mater==
"ingap")
1401 vsatn = 7.7e6; betan = 1.0; eon = 4000.0;
1402 vsatp = 7.7e6; betan_ha = 2.0; betap = 1.0;
1403 eop = 4000.0; betap_ha = 2.0; vsn_x1 = -0.0341;
1404 vsn_x2 = 0.0; en_x1 = 1.533; en_x2 = 0.0;
1408 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1412 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1413 (1.0 + pow((min.
epar/eon),4.0));
ScalarT calcAroraMob(MobInfo< ScalarT > &min)
double getNi_old(const std::string &material, double temp)
double get_DOS_EffectiveMassP(const std::string &material)
ScalarT calcCarrierMobNew(MobInfo< ScalarT > &min)
Pure virtual class to augment a linear system.
ScalarT calcCarrierMobOld(MobInfo< ScalarT > &min)
double getEffectiveMassP(const std::string &material)
double pdRaugN(const std::string &material, double ni, double n, double p)
void applyHighFieldMobilityModel(MobInfo< ScalarT > &min, ScalarT &mobil)
double getCarrierThermalVelocity(const std::string &material, const std::string &carrier)
double getNc(const std::string &material, double temp)
double calcRaug(const std::string &material, double ni, double n, double p)
double getRelPerm(const std::string &material)
double workfunc(std::string &metal)
double bandgap(const std::string &material, double temp)
double bennetWilsonEbgn(const std::string &material, double dope, bool ntype)
double Ebgn(const std::string &material, const std::string &bgnModel, double dope, bool ntype)
ScalarT calcAnalyticMob(MobInfo< ScalarT > &min)
ScalarT calcIIIVMob(MobInfo< ScalarT > &min)
double getEffectiveMassN(const std::string &material)
double calcRsrh(const std::string &material, double ni, double n, double p, double tn, double tp)
double slotboomEbgn(const std::string &material, double dope, bool ntype)
double calcLt(bool holeFlag, double conc, std::string material="si")
ScalarT calcLombardiMob(MobInfo< ScalarT > &min)
double pdRsrhN(const std::string &material, double ni, double n, double p, double tn, double tp)
double pdRaugP(const std::string &material, double ni, double n, double p)
double jain3Ebgn(const std::string &material, double dope, bool ntype)
double jain2Ebgn(const std::string &material, double dope, bool ntype)
double jainEbgn(const std::string &material, double dope, bool ntype)
double affin(const std::string &material)
ScalarT calcPhilipsMob(MobInfo< ScalarT > &min)
ScalarT calcMob(MobInfo< ScalarT > &min)
double getNv(const std::string &material, double temp)
double getNi(const std::string &material, double temp)
double pdRsrhP(const std::string &material, double ni, double n, double p, double tn, double tp)
double get_DOS_EffectiveMassN(const std::string &material)