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))
122 template <
typename ScalarT>
125 template <
typename ScalarT>
128 template <
typename ScalarT>
131 template <
typename ScalarT>
134 template <
typename ScalarT>
137 template <
typename ScalarT>
140 template <
typename ScalarT>
143 template <
typename ScalarT>
146 double workfunc(std::string & metal);
147 double affin(
const std::string & material);
148 double bandgap(
const std::string & material,
double temp);
150 double calcLt (
bool holeFlag,
double conc);
152 double calcRsrh (
const std::string & material,
155 double tn,
double tp);
157 double calcRaug (
const std::string & material,
double ni,
double n,
double p);
159 double pdRsrhN (
const std::string & material,
double ni,
161 double tn,
double tp);
163 double pdRsrhP (
const std::string & material,
double ni,
165 double tn,
double tp);
167 double pdRaugN (
const std::string & material,
double ni,
double n,
double p);
168 double pdRaugP (
const std::string & material,
double ni,
double n,
double p);
170 double getNi (
const std::string & material,
double temp);
171 double getNi_old (
const std::string & material,
double temp);
173 double getRelPerm (
const std::string & material);
208 template <
typename ScalarT>
217 if(mobility==
"analytic" || mobility==
"caughey-thomas")
221 else if(mobility==
"arora")
225 else if(mobility==
"carr")
229 else if(mobility==
"carrier")
233 else if(mobility==
"surface" || mobility==
"lombardi")
237 else if(mobility==
"philips")
243 Report::UserFatal0() <<
"Mobility model " << mobility <<
" not recognized.";
251 #ifdef Xyce_DEBUG_DEVICE
252 if (mobil != 0.0 && !(mobil > 0.0) && !(mobil < 0.0))
254 Report::DevelFatal0().in(
"MaterialSupport::calcMob") <<
"Mobility calc = nan.";
275 template <
typename ScalarT>
281 double mun_min, mup_min;
282 double mun_max, mup_max;
283 double nun, nup, xin, xip, nrefn, nrefp, alphan, alphap;
287 mun_min = 55.24; mup_min = 49.7;
288 mun_max = 1429.23; mup_max = 479.37;
289 nrefn = 1.072e17; nrefp = 1.606e17;
290 nun = -2.3; nup = -2.2;
291 xin = -3.8; xip = -3.7;
292 alphan = 0.733; alphap = 0.70;
294 else if(mater==
"gaas")
296 mun_min = 0.0; mup_min = 0.0;
297 mun_max = 8500.0; mup_max = 400.0;
298 nrefn = 1.69e17; nrefp = 2.75e17;
299 nun = -1.0; nup = -2.1;
300 xin = 0.0; xip = 0.0;
301 alphan = 0.436; alphap = 0.395;
303 else if(mater==
"sio2")
305 mun_min = 1e1; mup_min = 1e-5;
306 mun_max = 2e1; mup_max = 1e-5;
307 nrefn = 1.072e17; nrefp = 1.606e17;
308 nun = -2.3; nup = -2.2;
309 xin = -3.8; xip = -3.7;
310 alphan = 0.733; alphap = 0.70;
312 else if (mater==
"inalas" || mater==
"alinas")
314 mun_min = 497.0; mup_min = 0.0;
315 mun_max = 2.41e4; mup_max = 480.0;
316 nrefn = 1.0e17; nrefp = 1.0e30;
317 nun = 0.0; nup = 0.0;
318 xin = 0.0; xip = 0.0;
319 alphan = 1.0; alphap = 1.0;
322 else if (mater==
"ingaas" || mater==
"gainas")
324 mun_min = 4000.0; mup_min = 0.0;
325 mun_max = 2.73e4; mup_max = 480.0;
326 nrefn = 3.63e17; nrefp = 1.0e30;
327 nun = 0.0; nup = 0.0;
328 xin = 0.0; xip = 0.0;
329 alphan = 1.0; alphap = 1.0;
331 else if (mater==
"inp")
333 mun_min = 497.0; mup_min = 0.0;
334 mun_max = 2.41e4; mup_max = 480.0;
335 nrefn = 1.0e17; nrefp = 1.0e30;
336 nun = 0.0; nup = 0.0;
337 xin = 0.0; xip = 0.0;
338 alphan = 1.0; alphap = 1.0;
340 else if (mater==
"ingap")
342 mun_min = 0.95; mup_min = 0.0;
343 mun_max = 200.0; mup_max = 150.0;
344 nrefn = 1.0e17; nrefp = 1.0e30;
345 nun = 0.0; nup = 0.0;
346 xin = 0.0; xip = 0.0;
347 alphan = 1.0; alphap = 1.0;
351 Report::UserFatal0() <<
"Analytic (Caughy-Thomas) mobility model not supported for " << mater;
358 (mup_max*pow((min.
T/min.
refTemp),nup) - mup_min)/
359 (1.0 + pow((min.
T/min.
refTemp),xip)*pow((min.
N/nrefp),alphap));
365 (mun_max*pow((min.
T/min.
refTemp),nun) - mun_min)/
366 (1.0 + pow((min.
T/min.
refTemp),xin)*pow((min.
N/nrefn),alphan));
387 template <
typename ScalarT>
393 double mun1_aro, mup1_aro, mun2_aro, mup2_aro, an_arora, ap_arora;
394 double cn_arora, cp_arora, exn1_aro, exp1_aro, exn2_aro, exp2_aro;
395 double exn3_aro, exp3_aro, exn4_aro, exp4_aro;
396 double alphan, alphap;
400 mun1_aro = 88.0; mup1_aro = 54.3;
401 mun2_aro = 1252.0; mup2_aro = 407.0;
402 an_arora = 0.88; ap_arora = 0.88;
403 cn_arora = 1.26e17; cp_arora = 2.35e17;
404 exn1_aro = -0.57; exp1_aro = -0.57;
405 exn2_aro = -2.33; exp2_aro = -2.33;
406 exn3_aro = 2.4; exp3_aro = 2.4;
407 exn4_aro = -0.146; exp4_aro = -0.146;
409 else if(mater==
"gaas")
411 mun1_aro = 8.5e3; mup1_aro = 4e2;
412 mun2_aro = 0.0; mup2_aro = 0.0;
413 an_arora = 0.0; ap_arora = 0.0;
414 cn_arora = 1.26e17; cp_arora = 2.35e17;
415 exn1_aro = -5.7e-1; exp1_aro = 0.0;
416 exn2_aro = 0.0; exp2_aro = 0.0;
417 exn3_aro = 0.0; exp3_aro = 0.0;
418 exn4_aro = 0.0; exp4_aro = 0.0;
420 else if(mater==
"sio2")
422 mun1_aro = 1e1; mup1_aro = 1e-5;
423 mun2_aro = 2e1; mup2_aro = 2e-5;
424 an_arora = 0.88; ap_arora = 0.88;
425 cn_arora = 1.26e17; cp_arora = 2.35e17;
426 exn1_aro = -0.57; exp1_aro = -0.57;
427 exn2_aro = -2.33; exp2_aro = -2.33;
428 exn3_aro = 2.4; exp3_aro = 2.4;
429 exn4_aro = -0.146; exp4_aro = -0.146;
431 else if (mater==
"inalas" || mater==
"alinas")
433 mun1_aro = 2.41e4; mup1_aro = 480.0;
434 mun2_aro = 0.0; mup2_aro = 0.0;
435 an_arora = 1.0; ap_arora = 1.0;
436 cn_arora = 1.0e20; cp_arora = 1.0e20;
437 exn1_aro = 0.0; exp1_aro = 0.0;
438 exn2_aro = 0.0; exp2_aro = 0.0;
439 exn3_aro = 0.0; exp3_aro = 0.0;
440 exn4_aro = 0.0; exp4_aro = 0.0;
442 else if (mater==
"ingaas" || mater==
"gainas")
444 mun1_aro = 2.73e4; mup1_aro = 480.0;
445 mun2_aro = 0.0; mup2_aro = 0.0;
446 an_arora = 1.0; ap_arora = 1.0;
447 cn_arora = 1.0e20; cp_arora = 1.0e20;
448 exn1_aro = 0.0; exp1_aro = 0.0;
449 exn2_aro = 0.0; exp2_aro = 0.0;
450 exn3_aro = 0.0; exp3_aro = 0.0;
451 exn4_aro = 0.0; exp4_aro = 0.0;
453 else if (mater==
"inp")
455 mun1_aro = 2.41e4; mup1_aro = 480.0;
456 mun2_aro = 0.0; mup2_aro = 0.0;
457 an_arora = 1.0; ap_arora = 1.0;
458 cn_arora = 1.0e20; cp_arora = 1.0e20;
459 exn1_aro = 0.0; exp1_aro = 0.0;
460 exn2_aro = 0.0; exp2_aro = 0.0;
461 exn3_aro = 0.0; exp3_aro = 0.0;
462 exn4_aro = 0.0; exp4_aro = 0.0;
464 else if (mater==
"ingap")
466 mun1_aro = 200.0; mup1_aro = 150.0;
467 mun2_aro = 0.0; mup2_aro = 0.0;
468 an_arora = 1.0; ap_arora = 1.0;
469 cn_arora = 1.0e20; cp_arora = 1.0e20;
470 exn1_aro = 0.0; exp1_aro = 0.0;
471 exn2_aro = 0.0; exp2_aro = 0.0;
472 exn3_aro = 0.0; exp3_aro = 0.0;
473 exn4_aro = 0.0; exp4_aro = 0.0;
477 Report::UserFatal0() <<
"Arora mobility model not supported for " << mater;
480 alphan = an_arora*pow((min.
T/min.
refTemp),exn4_aro);
481 alphap = ap_arora*pow((min.
T/min.
refTemp),exp4_aro);
485 mobil = mup1_aro*pow((min.
T/min.
refTemp),exp1_aro)+
486 (mup2_aro*pow((min.
T/min.
refTemp),exp2_aro))/
487 (1.0+pow((min.
N/cp_arora*pow((min.
T/min.
refTemp),exp3_aro)),alphap));
492 mun1_aro*pow((min.
T/min.
refTemp),exn1_aro)+
493 (mun2_aro*pow((min.
T/min.
refTemp),exn2_aro))/
494 (1.0+pow((min.
N/cn_arora*pow((min.
T/min.
refTemp),exn3_aro)),alphan));
518 template <
typename ScalarT>
525 double Al, Bl, Ai, Bi;
547 else if(mater==
"gaas")
566 Report::UserFatal0() <<
"Carrier-carrier mobility model not supported for " << mater;
570 mul = Al*pow((min.
T/min.
refTemp),Bl);
573 mui = (Ai*pow(min.
T,1.5)/min.
N)*(log(1.0+Bi*min.
T*min.
T/min.
N)-
574 Bi*min.
T*min.
T/(min.
N+Bi*min.
T*min.
T));
578 ScalarT N = fabs(min.
n);
if(N == 0.0) N = 1.0;
579 ScalarT P = fabs(min.
p);
if(P == 0.0) P = 1.0;
581 muc = (2.0e17*pow(min.
T,1.5)/sqrt(P*N))*
582 1.0/(log(1.0+8.28e8*min.
T*min.
T*pow(P*N,-1.0/3.0)));
584 X = sqrt(6.0*mul*(mui+muc)/(mui*muc));
585 mobil = mul*(1.025/(1.0+pow(X/1.68,1.43))-0.025);
587 #ifdef Xyce_DEBUG_DEVICE
588 if (mobil != 0.0 && !(mobil > 0.0) && !(mobil < 0.0))
590 Xyce::dout() <<
"mobil is nan" << std::endl;
591 Xyce::dout() <<
"mul = " << mul << std::endl;
592 Xyce::dout() <<
"mui = " << mui << std::endl;
593 Xyce::dout() <<
"muc = " << muc << std::endl;
594 Xyce::dout() <<
"X = " << X << std::endl;
595 Xyce::dout() <<
"T = " << min.
T << std::endl;
596 Xyce::dout() <<
"n = " << min.
n << std::endl;
597 Xyce::dout() <<
"p = " << min.
p << std::endl;
622 template <
typename ScalarT>
629 double a_ccs, b_ccs, a_lic, b_lic, c_lic;
630 double ex_lic, mun0_lat, exn_lat;
631 double an_iis, bn_iis, mup0_lat, exp_lat;
632 double ap_iis, bp_iis;
651 else if(mater==
"gaas")
668 else if (mater==
"inalas" || mater==
"alinas")
685 else if (mater==
"ingaas" || mater==
"gainas")
702 else if (mater==
"inp")
719 else if (mater==
"ingap")
738 Report::UserFatal0() <<
"Carrier-carrier mobility model not supported for " << mater;
741 ScalarT n_impurity = fabs(min.
N);
744 ScalarT N = fabs(min.
n);
if(N == 0.0) N = 1.0;
745 ScalarT P = fabs(min.
p);
if(P == 0.0) P = 1.0;
748 ScalarT muc = a_ccs*pow((min.
T/min.
refTemp),1.5)/sqrt(P*N)*
749 1.0/(log(1.0+b_ccs*pow((min.
T/min.
refTemp),2.0)*pow(P*N,-1.0/3.0)));
756 ScalarT mul_h = mup0_lat*pow((min.
T/min.
refTemp), -exp_lat);
759 ScalarT gB_hole = bp_iis*pow((min.
T/min.
refTemp), 2.0)/(N+P);
761 ScalarT mui_h = (ap_iis*pow((min.
T/min.
refTemp),1.5)/n_impurity)/
762 (log(1.0 + gB_hole) - gB_hole/(1.0 + gB_hole));
764 ScalarT muic_h = 1.0/(1.0/muc + 1.0/mui_h);
766 if (std::fabs(b_lic) < std::numeric_limits<double>::epsilon())
768 mobil = mul_h*(a_lic - c_lic);
772 mobil = mul_h*(a_lic/(1.0+pow(b_lic*(mul_h/muic_h),ex_lic))-c_lic);
779 ScalarT mul_e = mun0_lat*pow((min.
T/min.
refTemp), -exn_lat);
782 ScalarT gB_elec = bn_iis*pow((min.
T/min.
refTemp), 2.0)/(N+P);
784 ScalarT mui_e = (an_iis*pow((min.
T/min.
refTemp),1.5)/n_impurity)/
785 (log(1.0 + gB_elec) - gB_elec/(1.0 + gB_elec));
787 ScalarT muic_e = 1.0/(1.0/muc + 1.0/mui_e);
789 if (std::fabs(b_lic) < std::numeric_limits<double>::epsilon())
791 mobil = mul_e*(a_lic - c_lic);
795 mobil = mul_e*(a_lic/(1.0+pow(b_lic*(mul_e/muic_e),ex_lic))-c_lic);
821 template <
typename ScalarT>
830 ScalarT mun0_lsm, mun1_lsm, mun2_lsm, crn_lsm, csn_lsm;
831 double bn_lsm, cn_lsm, dn_lsm, exn1_lsm, exn2_lsm, exn3_lsm;
832 double exn4_lsm, exn8_lsm;
833 double mup0_lsm, mup1_lsm, mup2_lsm, crp_lsm, csp_lsm;
834 double bp_lsm, cp_lsm, dp_lsm, exp1_lsm, exp2_lsm, exp3_lsm;
835 double exp4_lsm, exp8_lsm, pc_lsm;
839 mun0_lsm = 52.2; mup0_lsm = 44.9;
840 mun1_lsm = 43.4; mup1_lsm = 29.0;
841 mun2_lsm = 1417.0; mup2_lsm = 470.5;
842 crn_lsm = 9.68e16; crp_lsm = 2.23e17;
843 csn_lsm = 3.43e20; csp_lsm = 6.1e20;
844 bn_lsm = 4.75e7; bp_lsm = 9.93e6;
845 cn_lsm = 1.74e5; cp_lsm = 8.84e5;
846 dn_lsm = 5.82e14; dp_lsm = 2.05e14;
847 exn1_lsm = 0.680; exp1_lsm = 0.719;
848 exn2_lsm = 2.0; exp2_lsm = 2.0;
849 exn3_lsm = 2.5; exp3_lsm = 2.2;
850 exn4_lsm = 0.125; exp4_lsm = 0.0317;
851 exn8_lsm = 2.0; exp8_lsm = 2.0;
854 else if(mater==
"gaas")
856 mun0_lsm = 0.0; mup0_lsm = 0.0;
857 mun1_lsm = 0.0; mup1_lsm = 0.0;
858 mun2_lsm = 1e6; mup2_lsm = 1.0;
859 crn_lsm = 9.68e16; crp_lsm = 2.23e17;
860 csn_lsm = 0.0; csp_lsm = 0.0;
861 bn_lsm = 1e10; bp_lsm = 1e10;
862 cn_lsm = 0.0; cp_lsm = 0.0;
863 dn_lsm = 1e6; dp_lsm = 1e6;
864 exn1_lsm = 0.0; exp1_lsm = 0.0;
865 exn2_lsm = 0.0; exp2_lsm = 0.0;
866 exn3_lsm = 0.0; exp3_lsm = 0.0;
867 exn4_lsm = 0.0; exp4_lsm = 0.0;
868 exn8_lsm = 0.0; exp8_lsm = 0.0;
871 else if (mater==
"inalas" || mater==
"alinas")
873 mun0_lsm = 0.0; mup0_lsm = 0.0;
874 mun1_lsm = 0.0; mup1_lsm = 0.0;
875 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
876 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
877 csn_lsm = 0.0; csp_lsm = 0.0;
878 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
879 cn_lsm = 0.0; cp_lsm = 0.0;
880 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
881 exn1_lsm = 0.0; exp1_lsm = 0.0;
882 exn2_lsm = 0.0; exp2_lsm = 0.0;
883 exn3_lsm = 0.0; exp3_lsm = 0.0;
884 exn4_lsm = 0.0; exp4_lsm = 0.0;
885 exn8_lsm = 0.0; exp8_lsm = 0.0;
888 else if (mater==
"ingaas" || mater==
"gainas")
890 mun0_lsm = 0.0; mup0_lsm = 0.0;
891 mun1_lsm = 0.0; mup1_lsm = 0.0;
892 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
893 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
894 csn_lsm = 0.0; csp_lsm = 0.0;
895 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
896 cn_lsm = 0.0; cp_lsm = 0.0;
897 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
898 exn1_lsm = 0.0; exp1_lsm = 0.0;
899 exn2_lsm = 0.0; exp2_lsm = 0.0;
900 exn3_lsm = 0.0; exp3_lsm = 0.0;
901 exn4_lsm = 0.0; exp4_lsm = 0.0;
902 exn8_lsm = 0.0; exp8_lsm = 0.0;
905 else if (mater==
"inp")
907 mun0_lsm = 0.0; mup0_lsm = 0.0;
908 mun1_lsm = 0.0; mup1_lsm = 0.0;
909 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
910 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
911 csn_lsm = 0.0; csp_lsm = 0.0;
912 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
913 cn_lsm = 0.0; cp_lsm = 0.0;
914 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
915 exn1_lsm = 0.0; exp1_lsm = 0.0;
916 exn2_lsm = 0.0; exp2_lsm = 0.0;
917 exn3_lsm = 0.0; exp3_lsm = 0.0;
918 exn4_lsm = 0.0; exp4_lsm = 0.0;
919 exn8_lsm = 0.0; exp8_lsm = 0.0;
922 else if (mater==
"ingap")
924 mun0_lsm = 0.0; mup0_lsm = 0.0;
925 mun1_lsm = 0.0; mup1_lsm = 0.0;
926 mun2_lsm = 1.0e6; mup2_lsm = 1.0e6;
927 crn_lsm = 1.0e20; crp_lsm = 1.0e20;
928 csn_lsm = 0.0; csp_lsm = 0.0;
929 bn_lsm = 1.0e10; bp_lsm = 1.0e10;
930 cn_lsm = 0.0; cp_lsm = 0.0;
931 dn_lsm = 1.0e6; dp_lsm = 1.0e6;
932 exn1_lsm = 0.0; exp1_lsm = 0.0;
933 exn2_lsm = 0.0; exp2_lsm = 0.0;
934 exn3_lsm = 0.0; exp3_lsm = 0.0;
935 exn4_lsm = 0.0; exp4_lsm = 0.0;
936 exn8_lsm = 0.0; exp8_lsm = 0.0;
941 Report::UserFatal0() <<
"Lobardi surface mobility model not supported for " << mater;
946 muac = bp_lsm/min.
eperp + cp_lsm*pow(min.
N,exp4_lsm)/(min.
T*pow(min.
eperp,1.0/3.0));
947 mumax = mup2_lsm*pow((min.
T/min.
refTemp),-exp3_lsm);
948 mub = mup0_lsm*exp(-pc_lsm/min.
N) + mumax/(1.0 + pow(min.
N/crp_lsm, exp1_lsm))-
949 mup1_lsm/(1.0 + pow(csp_lsm/min.
N, exp2_lsm));
950 musr = dp_lsm/pow(min.
eperp, exp8_lsm);
954 muac = bn_lsm/min.
eperp + cn_lsm*pow(min.
N,exn4_lsm)/(min.
T*pow(min.
eperp,1.0/3.0));
955 mumax = mun2_lsm*pow((min.
T/min.
refTemp),-exn3_lsm);
956 mub = mun0_lsm + (mumax - mun0_lsm)/(1.0 + pow(min.
N/crn_lsm, exn1_lsm))-
957 mun1_lsm/(1.0 + pow(csn_lsm/min.
N, exn2_lsm));
958 musr = dn_lsm/pow(min.
eperp, exn8_lsm);
961 mobil = 1.0/(1.0/muac + 1.0/mub + 1.0/musr);
982 template <
typename ScalarT>
989 double mmnn_um, mmxn_um, nrfn_um, alpn_um, tetn_um, nrfd_um, crfd_um;
990 double mmnp_um, mmxp_um, nrfp_um, alpp_um, tetp_um, nrfa_um, crfa_um;
994 mmnn_um = 52.2; mmnp_um = 44.9;
995 mmxn_um = 1.417e3; mmxp_um = 470.5;
996 nrfn_um = 9.68e16; nrfp_um = 2.23e17;
997 alpn_um = 0.68; alpp_um = 0.719;
998 tetn_um = 2.285; tetp_um = 2.247;
999 nrfd_um = 4.0e20; nrfa_um = 7.2e20;
1000 crfd_um = 0.21; crfa_um = 0.5;
1002 else if(mater==
"gaas")
1004 mmnn_um = 0.0; mmnp_um = 0.0;
1005 mmxn_um = 8.5e3; mmxp_um = 400.0;
1006 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1007 alpn_um = 1.0; alpp_um = 1.0;
1008 tetn_um = 0.0; tetp_um = 0.0;
1009 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1010 crfd_um = 1.0e30; crfa_um = 1.0e30;
1012 else if (mater==
"inalas" || mater==
"alinas")
1014 mmnn_um = 0.0; mmnp_um = 0.0;
1015 mmxn_um = 2.414e4; mmxp_um = 480.0;
1016 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1017 alpn_um = 1.0; alpp_um = 1.0;
1018 tetn_um = 0.0; tetp_um = 0.0;
1019 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1020 crfd_um = 1.0e30; crfa_um = 1.0e30;
1022 else if (mater==
"ingaas" || mater==
"gainas")
1024 mmnn_um = 0.0; mmnp_um = 0.0;
1025 mmxn_um = 2.725e4; mmxp_um = 400.0;
1026 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1027 alpn_um = 1.0; alpp_um = 1.0;
1028 tetn_um = 0.0; tetp_um = 0.0;
1029 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1030 crfd_um = 1.0e30; crfa_um = 1.0e30;
1032 else if (mater==
"inp")
1034 mmnn_um = 0.0; mmnp_um = 0.0;
1035 mmxn_um = 2.414e4; mmxp_um = 480.0;
1036 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1037 alpn_um = 1.0; alpp_um = 1.0;
1038 tetn_um = 0.0; tetp_um = 0.0;
1039 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1040 crfd_um = 1.0e30; crfa_um = 1.0e30;
1042 else if (mater==
"ingap")
1044 mmnn_um = 0.0; mmnp_um = 0.0;
1045 mmxn_um = 200.0; mmxp_um = 150.0;
1046 nrfn_um = 1.0e30; nrfp_um = 1.0e30;
1047 alpn_um = 1.0; alpp_um = 1.0;
1048 tetn_um = 0.0; tetp_um = 0.0;
1049 nrfd_um = 1.0e30; nrfa_um = 1.0e30;
1050 crfd_um = 1.0e30; crfa_um = 1.0e30;
1054 Report::UserFatal0() <<
"Philips mobility model not supported for " << mater;
1058 double mh_mo = 1.258;
1059 ScalarT Nd_doping = min.
Nd;
1060 ScalarT Na_doping = min.
Na;
1061 ScalarT n_dens = min.
n;
1062 ScalarT p_dens = min.
p;
1064 if (Nd_doping <= 1.0 ) Nd_doping = 1.0;
1065 if (Na_doping <= 1.0 ) Na_doping = 1.0;
1066 if (n_dens <= 1.0 ) n_dens = 1.0;
1067 if (p_dens <= 1.0 ) p_dens = 1.0;
1069 ScalarT Ndeff = Nd_doping * ( 1.0 + 1.0/(crfd_um + pow(nrfd_um/Nd_doping,2.0)));
1070 ScalarT Naeff = Na_doping * ( 1.0 + 1.0/(crfa_um + pow(nrfa_um/Na_doping,2.0)));
1072 double vsat = 2.4e7/(1.0+0.8*exp(min.
T/600.0));
1077 ScalarT Nscp = Ndeff + Naeff + n_dens;
1078 ScalarT Pp = Tps*Tps * (1.0/( 2.459/(3.97e13*pow(Nscp,-2.0/3.0))
1079 + 3.828/(1.36e20/(n_dens+p_dens)*mh_mo) ));
1083 ScalarT Ppmin = 0.2891;
1084 ScalarT FPpmin = 1.0;
1085 ScalarT dFPpmin = 1.0;
1087 while( (FPpmin > 0.00001) || (FPpmin < -0.00001) )
1089 FPpmin = 1.0 - (0.89233/pow(0.41372+Ppmin*pow(1.0/mh_mo*Tps,0.28227),0.19778))
1090 + (0.005978/pow(Ppmin*pow(mh_mo/Tps,0.72169),1.80618));
1092 dFPpmin = -0.89233*(-0.19778)*
1093 pow(0.41372+Ppmin*pow(1.0/mh_mo*Tps,0.28227),-1.19778)*
1094 pow(1.0/mh_mo*Tps,0.28227) +
1095 0.005978*(-1.80618)*
1096 pow(Ppmin*pow(mh_mo/Tps,0.72169),-2.80618)*
1097 pow(mh_mo/Tps,0.72169);
1099 Ppmin = Ppmin - FPpmin/dFPpmin;
1102 ScalarT FPp = (0.7643*pow(Pp,0.6478) + 2.2999 + 6.5502*mh_mo/me_mo)
1103 /(pow(Pp,0.6478) + 2.3670 - 0.8552*mh_mo/me_mo);
1105 ScalarT GPp = 1.0 - (0.89233/pow(0.41372+Pp*pow(1.0/mh_mo*Tps,0.28227),0.19778))
1106 + (0.005978/pow(Pp*pow(mh_mo/Tps,0.72169),1.80618));
1110 GPp = 1.0 - (0.89233/pow(0.41372+Ppmin*pow(1.0/mh_mo*Tps,0.28227),0.19778))
1111 + (0.005978/pow(Ppmin*pow(mh_mo/Tps,0.72169),1.80618));
1114 ScalarT Nsceffp = Ndeff*GPp + Naeff + n_dens/FPp;
1115 ScalarT mulattp = mmxp_um * pow(Tps,-tetp_um);
1117 ScalarT mu1p = mmxp_um*mmxp_um/(mmxp_um-mmnp_um)*pow(Tps,3.0*alpp_um-1.5);
1118 ScalarT mu2p = mmxp_um*mmnp_um/(mmxp_um-mmnp_um)*pow(Tps,-0.5);
1120 ScalarT muDAn = mu1p*(Nscp/Nsceffp)*pow(nrfp_um/Nscp,alpp_um)
1121 + mu2p*(n_dens+p_dens)/Nsceffp;
1123 mobil = 1.0/(1.0/mulattp+1.0/muDAn);
1129 ScalarT Nscn = Ndeff + Naeff + p_dens;
1130 ScalarT Pn = Tns*Tns * (1.0/(2.459/(3.97e13*pow(Nscn,-2.0/3.0))
1131 + 3.828/(1.36e20/(n_dens+p_dens)*me_mo)));
1135 ScalarT Pnmin = 0.3246;
1136 ScalarT FPnmin = 1.0;
1137 ScalarT dFPnmin = 1.0;
1139 while( (FPnmin > 0.00001) || (FPnmin < -0.00001) )
1141 FPnmin = 1.0 - (0.89233/pow(0.41372+Pnmin*pow(1.0/me_mo*Tns,0.28227),0.19778))
1142 + (0.005978/pow(Pnmin*pow(me_mo/Tns,0.72169),1.80618));
1144 dFPnmin = -0.89233*(-0.19778)*
1145 pow(0.41372+Pnmin*pow(1.0/me_mo*Tns,0.28227),-1.19778)*
1146 pow(1.0/me_mo*Tns,0.28227) +
1147 0.005978*(-1.80618)*
1148 pow(Pnmin*pow(me_mo/Tns,0.72169),-2.80618)*
1149 pow(me_mo/Tns,0.72169);
1151 Pnmin = Pnmin - FPnmin/dFPnmin;
1154 ScalarT FPn = (0.7643*pow(Pn,0.6478) + 2.2999 + 6.5502*me_mo/mh_mo)
1155 /(pow(Pn,0.6478) + 2.3670 - 0.8552*me_mo/mh_mo);
1157 ScalarT GPn = 1.0 - (0.89233/pow(0.41372+Pn*pow(1.0/me_mo*Tns,0.28227),0.19778))
1158 + (0.005978/pow(Pn*pow(me_mo/Tns,0.72169),1.80618));
1162 GPn = 1.0 - (0.89233/pow(0.41372+Pnmin*pow(1.0/me_mo*Tns,0.28227),0.19778))
1163 + (0.005978/pow(Pnmin*pow(me_mo/Tns,0.72169),1.80618));
1166 ScalarT Nsceffn = Ndeff + Naeff*GPn + p_dens/FPn;
1167 ScalarT mulattn = mmxn_um * pow(Tns,-tetn_um);
1168 ScalarT mu1n = mmxn_um*mmxn_um/(mmxn_um-mmnn_um)*pow(Tns,3.0*alpn_um-1.5);
1169 ScalarT mu2n = mmxn_um*mmnn_um/(mmxn_um-mmnn_um)*pow(Tns,-0.5);
1171 ScalarT muDAp = mu1n*(Nscn/Nsceffn)*pow(nrfn_um/Nscn,alpn_um)
1172 + mu2n*(n_dens+p_dens)/Nsceffn;
1174 mobil = 1.0/(1.0/mulattn+1.0/muDAp);
1178 #if 0 // from Myers 1D:
1194 cd1 = (1.0d0+1.0d0/(0.21d0+(4.0d20/(cd+1.0))**2))*(cd+1.0d0)
1195 ca1 = (1.0d0+1.0d0/(0.50d0+(7.2d20/(ca+1.0))**2))*(ca+1.0d0)
1196 cscn = cd1+ca1+ch+1.0d0
1197 cscp = cd1+ca1+ce+1.0d0
1198 pn = 2.459d0/3.97d13*cscn**0.666666
1199 pn = pn+3.828d0/1.36d20/em*(ce+ch+1.0d0)
1201 pp = 2.459d0/3.97d13*cscp**0.666666
1202 pp = pp+3.828d0/1.36d20/hm*(ce+ch+1.0d0)
1204 fpn = (0.7643d0*pn**0.6478+2.2999d0+6.5502d0*em/hm) /(pn**0.6478+2.3670d0-0.8552d0*em/hm)
1205 fpp = (0.7643d0*pp**0.6478+2.2999d0+6.5502d0*hm/em) /(pp**0.6478+2.3670d0-0.8552d0*hm/em)
1206 par1 = (0.41372d0+pn*(tk300/em)**0.28227)**0.19778
1207 par2 = (pn*(em/tk300)**0.72169)**1.80618
1208 gpn = 1.0d0-0.89223d0/par1+0.005978d0/par2
1209 par1 = (0.41372d0+pp*(tk300/hm)**0.28227)**0.19778
1210 par2 = (pp*(hm/tk300)**0.72169)**1.80618
1211 gpp = 1.0d0-0.89223d0/par1+0.005978d0/par2
1212 cscneff = cd1+ca1*gpn+ch/fpn+1.0d0
1213 cscpeff = ca1+cd1*gpp+ce/fpp+1.0d0
1214 u1n = 1417.0d0**2/(1417.0d0-52.2d0)*tk300**(3.0*0.68-1.5)
1215 u2n = 1417.0d0*52.2d0/(1417.0d0-52.2d0)/sqrt(tk300)
1216 u1p = 470.5d0**2/(470.5d0-44.9d0)*tk300**(3.0*0.719-1.5)
1217 u2p = 470.5d0*44.9d0/(470.5d0-44.9d0)/sqrt(tk300)
1218 undap = u1n*cscn/cscneff*(9.68d16/cscn)**0.68 +u2n*(ce+ch+1.0d0)/cscneff
1219 updan =u1p*cscp/cscpeff*(2.23d17/cscp)**0.719 +u2p*(ce+ch+1.0d0)/cscpeff
1220 ulattn = 1417.0d0/tk300**2.285
1221 ulattp = 470.5d0/tk300**2.247
1222 eu0 = 1.0d0/(1.0d0/ulattn+1.0d0/undap)
1223 hu0 = 1.0d0/(1.0d0/ulattp+1.0d0/updan)
1224 vsat = 2.4d7/(1.0d0+0.8d0*exp(tk/600.0d0))
1225 eu = 1.0d0+(eu0*abs(dv)/vsat)**2
1227 hu = 1.0d0+hu0*abs(dv)/vsat
1265 template <
typename ScalarT>
1269 ScalarT mob0 = mobil;
1274 double vsatn, betan, eon, vsatp, betan_ha, betap, eop, betap_ha, vsn_x1, vsn_x2;
1275 double en_x1, en_x2;
1279 vsatn = 1.035e7; betan = 2.0; eon = 4000.0;
1280 vsatp = 1.035e7; betan_ha = 2.0; betap = 1.0;
1281 eop = 4000.0; betap_ha = 2.0; vsn_x1 = 0.0;
1282 vsn_x2 = 0.0; en_x1 = 0.0; en_x2 = 0.0;
1287 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1291 mobil = mob0/ (1.0 + mob0*min.
epar/vsatn);
1294 else if(mater==
"ge")
1296 vsatn = 1.035e7; betan = 2.0; eon = 4000.0;
1297 vsatp = 1.035e7; betan_ha = 2.0; betap = 1.0;
1298 eop = 4000.0; betap_ha = 2.0; vsn_x1 = 0.0;
1299 vsn_x2 = 0.0; en_x1 = 0.0; en_x2 = 0.0;
1304 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1308 mobil = mob0/ (1.0 + mob0*min.
epar/vsatn);
1311 else if(mater==
"gaas")
1313 vsatn = 7.7e6; betan = 1.0; eon = 4000.0;
1314 vsatp = 7.7e6; betan_ha = 2.0; betap = 1.0;
1315 eop = 4000.0; betap_ha = 2.0; vsn_x1 = 0.0;
1316 vsn_x2 = 0.0; en_x1 = 0.0; en_x2 = 0.0;
1320 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1324 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1325 (1.0 + pow((min.
epar/eon),4.0));
1328 else if (mater==
"inalas" || mater==
"alinas")
1330 vsatn = 4.70e+06; betan = 1.0; eon = 8.40e+03;
1331 vsatp = 3.00e+6; betan_ha = 2.0; betap = 1.0;
1332 eop = 8.40e+03; betap_ha = 2.0; vsn_x1 = -0.7493;
1333 vsn_x2 = 0.0; en_x1 = 4.169; en_x2 = 0.0;
1337 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1341 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1342 (1.0 + pow((min.
epar/eon),4.0));
1345 else if (mater==
"ingaas" || mater==
"gainas")
1347 vsatn = 8.40e+06; betan = 1.0; eon = 5.07e+03;
1348 vsatp = 4.80e+06; betan_ha = 2.0; betap = 1.0;
1349 eop = 5.07e+03; betap_ha = 2.0; vsn_x1 = -1.019;
1350 vsn_x2 = 0.709; en_x1 = -0.7956; en_x2 = 0.63;
1354 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1358 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1359 (1.0 + pow((min.
epar/eon),4.0));
1362 else if (mater==
"inp")
1364 vsatn = 1.3e+07; betan = 1.0; eon = 1.06e+04;
1365 vsatp = 6.6e6; betan_ha = 2.0; betap = 1.0;
1366 eop = 1.06e+04; betap_ha = 2.0; vsn_x1 = -0.332;
1367 vsn_x2 = 0.0; en_x1 = 5.883; en_x2 = 0.0;
1371 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1375 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1376 (1.0 + pow((min.
epar/eon),4.0));
1379 else if (mater==
"ingap")
1381 vsatn = 7.7e6; betan = 1.0; eon = 4000.0;
1382 vsatp = 7.7e6; betan_ha = 2.0; betap = 1.0;
1383 eop = 4000.0; betap_ha = 2.0; vsn_x1 = -0.0341;
1384 vsn_x2 = 0.0; en_x1 = 1.533; en_x2 = 0.0;
1388 mobil = mob0/ (1.0 + mob0*min.
epar/vsatp);
1392 mobil = (mob0 + (vsatn/min.
epar)*pow((min.
epar/eon),4.0))/
1393 (1.0 + pow((min.
epar/eon),4.0));