46 #include <Xyce_config.h>
56 #ifdef Xyce_DEBUG_DEVICE
79 ExtendedString mater = material;
88 mass = pow((ml*mt*mt),1.0/3.0);
90 else if (mater ==
"ge" )
94 mass = pow((1.64*0.082*0.082),1.0/3.0);
96 else if (mater ==
"gaas")
101 else if (mater==
"inalas" || mater==
"alinas")
106 else if (mater==
"ingaas" || mater==
"gainas")
111 else if (mater ==
"ingap")
116 else if (mater ==
"inp")
123 Report::UserFatal0() << material <<
" material not recognized.";
142 ExtendedString mater = material;
150 mass = pow((pow(mlh,1.5) + pow(mhh,1.5)),2.0/3.0);
152 else if (mater ==
"ge" )
156 mass = pow((pow(mlh, 1.5) + pow(mhh, 1.5)),2.0/3.0);
158 else if (mater ==
"gaas")
174 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
187 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
194 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
197 else if (mater==
"inalas" || mater==
"alinas")
201 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
203 else if (mater==
"ingaas" || mater==
"gainas")
207 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
209 else if (mater==
"ingap")
213 mass = 6.65007285e-1;
215 else if (mater ==
"inp")
219 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
223 Report::UserFatal0() << material <<
" material not recognized.";
242 ExtendedString mater = material;
251 mass = pow(Mc,2.0/3.0)*pow((ml*mt*mt),1.0/3.0);
254 else if (mater ==
"ge")
259 mass = pow(Mc,2.0/3.0)*pow((ml*mt*mt),1.0/3.0);
262 else if (mater ==
"gaas")
266 else if (mater==
"inalas" || mater==
"alinas")
271 else if (mater==
"ingaas" || mater==
"gainas")
276 else if (mater==
"ingap")
280 mass = 8.29952143e-2;
282 else if (mater ==
"inp")
288 Report::UserFatal0() << material <<
" material not recognized.";
326 double kb (1.3806488e-23);
328 double dnbnd0 = 2.0*
M_PI*meDOS*e_mass*kb*temp/(h_planck*h_planck);
329 double Nc = 2.0*pow(dnbnd0,1.5)/1.0e6;
349 double kb (1.3806488e-23);
351 double dnbnd0 = 2.0*
M_PI*mhDOS*e_mass*kb*temp/(h_planck*h_planck);
352 double Nv = 2.0*pow(dnbnd0,1.5)/1.0e6;
366 ExtendedString mater = material;
369 double kbq = 8.6173324e-5;
370 double bg =
bandgap(mater,temp);
371 double Nc =
getNc(mater,temp);
372 double Nv =
getNv(mater,temp);
373 ni = sqrt (Nc * Nv) * exp(-bg/(2.0 * kbq * temp));
387 ExtendedString mater = material;
395 * pow(6.0,0.5) * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
396 (2.0 * 8.6174e-5 * temp));
399 else if (mater ==
"gaas")
403 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
404 (2.0 * 8.6174e-5 * temp));
407 else if (mater ==
"ge")
411 * 2.0 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
412 (2.0 * 8.6174e-5 * temp));
418 else if (mater==
"inalas" || mater==
"alinas")
422 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
423 (2.0 * 8.6174e-5 * temp));
425 else if (mater==
"ingaas" || mater==
"gainas")
429 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
430 (2.0 * 8.6174e-5 * temp));
432 else if (mater ==
"inp")
436 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
437 (2.0 * 8.6174e-5 * temp));
441 std::string msg =
"MaterialSupport::getNi: ";
443 msg +=
" material not recognized.\n";
444 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL_0,msg);
460 ExtendedString mater = material;
468 else if (mater ==
"sio2")
472 else if (mater ==
"ge" )
476 else if (mater ==
"gaas")
480 else if (mater==
"inalas" || mater==
"alinas")
484 else if (mater==
"ingaas" || mater==
"gainas")
488 else if (mater ==
"inp")
494 Report::UserFatal0() << material <<
" material not recognized.";
516 (
const std::string & material,
double ni,
double n,
double p,
double tn,
double tp)
522 double B = (tp*(n+Ni)+tn*(p+Ni));
525 if (B >= exp(arg)) B = exp(arg);
547 (
const std::string & material,
double ni,
double n,
double p,
double tn,
double tp)
560 if (A1 >= exp(arg)) A1 = exp(arg);
564 C1 = (tp*(n+Ni)+tn*(p+Ni));
565 if (C1 >= exp(arg)) C1 = exp(arg);
568 dBdn = -1.0/(C1*C1) * tp;
570 pdRsrhN = dAdn * B1 + dBdn * A1;
592 (
const std::string & material,
double ni,
double n,
double p,
double tn,
double tp)
605 if (A1 >= exp(arg)) A1 = exp(arg);
609 C1 = (tp*(n+Ni)+tn*(p+Ni));
610 if (C1 >= exp(arg)) C1 = exp(arg);
613 dBdp = -1.0/(C1*C1) * tn;
615 pdRsrhP = dAdp * B1 + dBdp * A1;
638 (
const std::string & material,
double ni,
double n,
double p)
646 double C = (Cn*n+Cp*p);
649 if (C >= exp(arg)) C = exp(arg);
672 (
const std::string & material,
double ni,
double n,
double p)
686 if (A1 >= exp(arg)) A1 = exp(arg);
691 if (B1 >= exp(arg)) B1 = exp(arg);
695 pdRaugN = dAdn*B1 + A1*dBdn;
718 (
const std::string & material,
double ni,
double n,
double p)
732 if (A1 >= exp(arg)) A1 = exp(arg);
737 if (B1 >= exp(arg)) B1 = exp(arg);
741 pdRaugP = dAdp*B1 + A1*dBdp;
761 ExtendedString metalName = metal;
762 metalName.toLower ();
768 else if (metalName==
"ppoly")
772 else if (metalName==
"npoly")
776 else if (metalName==
"mo")
780 else if (metalName==
"w")
784 else if (metalName==
"modi")
788 else if (metalName==
"wdi")
792 else if (metalName==
"cu")
796 else if (metalName==
"pt")
800 else if (metalName==
"au")
804 else if (metalName==
"neutral")
810 Report::UserFatal0() << metalName <<
" material not recognized.";
831 ExtendedString materialName = material;
832 materialName.toLower();
834 if (materialName==
"si")
838 else if (materialName==
"ge")
842 else if (materialName==
"gaas")
846 else if (materialName==
"sio2")
850 else if (materialName==
"nitride")
854 else if (materialName==
"sapphire")
860 Report::UserError0() << materialName <<
" material not recognized.";
884 ExtendedString materialName = material;
885 materialName.toLower();
887 if (materialName==
"si")
889 gap = 1.17 - 4.73e-4*pow(temp,2.0)/(temp + 636.0);
891 else if (materialName==
"ge")
893 gap = 0.7437 - 4.774e-4*pow(temp,2.0)/(temp + 235);
895 else if (materialName==
"gaas")
897 gap = 1.519 - 5.405e-4*pow(temp,2.0)/(temp + 204);
899 else if (materialName==
"ingap")
903 else if (materialName==
"sio2")
907 else if (materialName==
"nitride")
911 else if (materialName==
"sapphire")
915 else if (materialName==
"inalas" || materialName==
"alinas")
919 else if (materialName==
"ingaas" || materialName==
"gainas")
923 else if (materialName==
"inp")
929 Report::UserError0() << materialName <<
" material not recognized.";
945 const std::string & material,
946 const std::string & bgnModel,
954 ExtendedString bgnModelName = bgnModel;
955 bgnModelName.toLower();
957 if (bgnModelName==
"slotboom")
959 ExtendedString materialName = material;
960 materialName.toLower();
962 if (materialName==
"si")
970 double n0_bgn = 1.3e17;
971 double v0_bgn = 6.92e-3;
972 double con_bgn = 0.5;
975 else if (materialName==
"ge")
981 else if (materialName==
"gaas")
987 else if (materialName==
"ingap")
993 else if (materialName==
"sio2")
1000 else if (materialName==
"nitride")
1006 else if (materialName==
"sapphire")
1012 else if (materialName==
"inalas" || materialName==
"alinas")
1018 else if (materialName==
"ingaas" || materialName==
"gainas")
1022 else if (materialName==
"inp")
1029 Report::UserError0() << materialName <<
" material not recognized.";
1032 double tmp1 = log(dope/n0_bgn);
1033 Ebgn = (v0_bgn) * (tmp1 + sqrt(tmp1*tmp1 + con_bgn));
1035 else if (
"bennet-wilson")
1037 ExtendedString materialName = material;
1038 materialName.toLower();
1040 if (materialName==
"si")
1042 double Eref = 6.84e-3;
1043 double Nref = 3.162e+18;
1046 Ebgn = Eref*pow(log(dope/Nref),2.0);
1055 else if (bgnModelName==
"jain")
1082 const std::string & material,
1087 double deltaEcn=0.0;
1088 double deltaEvn=0.0;
1089 double deltaEcp=0.0;
1090 double deltaEvp=0.0;
1092 double anc_bgn = 0.0;
1093 double bnc_bgn = 0.0;
1094 double cnc_bgn = 0.0;
1095 double anv_bgn = 0.0;
1096 double bnv_bgn = 0.0;
1097 double cnv_bgn = 0.0;
1098 double apc_bgn = 0.0;
1099 double bpc_bgn = 0.0;
1100 double cpc_bgn = 0.0;
1101 double apv_bgn = 0.0;
1102 double bpv_bgn = 0.0;
1103 double cpv_bgn = 0.0;
1105 ExtendedString materialName = material;
1106 materialName.toLower();
1108 if (materialName==
"si")
1110 anc_bgn = -14.84e-3;
1119 bpc_bgn = -16.27e-3;
1126 else if (materialName==
"ge")
1141 else if (materialName==
"gaas")
1143 anc_bgn = -16.30e-3;
1145 cnc_bgn = -18.13e-3;
1156 else if (materialName==
"ingap")
1160 cnc_bgn = -18.13e-3;
1171 else if (materialName==
"sio2")
1173 anc_bgn = -14.84e-3;
1182 bpc_bgn = -16.27e-3;
1190 else if (materialName==
"nitride")
1194 else if (materialName==
"sapphire")
1199 else if (materialName==
"inalas" || materialName==
"alinas")
1203 cnc_bgn = -18.13e-3;
1214 else if (materialName==
"ingaas" || materialName==
"gainas")
1218 cnc_bgn = -18.13e-3;
1229 else if (materialName==
"inp")
1233 cnc_bgn = -18.13e-3;
1246 Report::UserError0() << materialName <<
" material not recognized.";
1249 double dopeScaled=fabs(dope)/1.0e+18;
1254 +anc_bgn*pow(dopeScaled,(1.0/3.0))
1255 +bnc_bgn*pow(dopeScaled,(0.25))
1256 +cnc_bgn*pow(dopeScaled,(0.5));
1259 +anv_bgn*pow(dopeScaled,(1.0/3.0))
1260 +bnv_bgn*pow(dopeScaled,(0.25))
1261 +cnv_bgn*pow(dopeScaled,(0.5));
1263 Ebgn = deltaEcn-deltaEvn;
1268 +apc_bgn*pow(dopeScaled,(1.0/3.0))
1269 +bpc_bgn*pow(dopeScaled,(0.25))
1270 +cpc_bgn*pow(dopeScaled,(0.5));
1273 +apv_bgn*pow(dopeScaled,(1.0/3.0))
1274 +bpv_bgn*pow(dopeScaled,(0.25))
1275 +cpv_bgn*pow(dopeScaled,(0.5));
1277 Ebgn = deltaEcp-deltaEvp;
1319 lt = LT0 / (1.0 + conc / Nref);
1325 lt = LT0 / (1.0 + conc / Nref);