46 #include <Xyce_config.h>
53 #include <N_UTL_Math.h>
71 ExtendedString mater = material;
80 mass = pow((ml*mt*mt),1.0/3.0);
82 else if (mater ==
"ge" )
86 mass = pow((1.64*0.082*0.082),1.0/3.0);
88 else if (mater ==
"gaas")
93 else if (mater==
"inalas" || mater==
"alinas")
98 else if (mater==
"ingaas" || mater==
"gainas")
103 else if (mater ==
"ingap")
108 else if (mater ==
"inp")
115 Report::UserFatal0() << material <<
" material not recognized.";
134 ExtendedString mater = material;
142 mass = pow((pow(mlh,1.5) + pow(mhh,1.5)),2.0/3.0);
144 else if (mater ==
"ge" )
148 mass = pow((pow(mlh, 1.5) + pow(mhh, 1.5)),2.0/3.0);
150 else if (mater ==
"gaas")
166 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
179 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
186 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
189 else if (mater==
"inalas" || mater==
"alinas")
193 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
195 else if (mater==
"ingaas" || mater==
"gainas")
199 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
201 else if (mater==
"ingap")
205 mass = 6.65007285e-1;
207 else if (mater ==
"inp")
211 mass = pow((pow(mlh,1.5) + pow(mhh, 1.5)), 2.0/3.0);
215 Report::UserFatal0() << material <<
" material not recognized.";
234 ExtendedString mater = material;
243 mass = pow(Mc,2.0/3.0)*pow((ml*mt*mt),1.0/3.0);
246 else if (mater ==
"ge")
251 mass = pow(Mc,2.0/3.0)*pow((ml*mt*mt),1.0/3.0);
254 else if (mater ==
"gaas")
258 else if (mater==
"inalas" || mater==
"alinas")
263 else if (mater==
"ingaas" || mater==
"gainas")
268 else if (mater==
"ingap")
272 mass = 8.29952143e-2;
274 else if (mater ==
"inp")
280 Report::UserFatal0() << material <<
" material not recognized.";
318 double kb (1.3806488e-23);
320 double dnbnd0 = 2.0*
M_PI*meDOS*e_mass*kb*temp/(h_planck*h_planck);
321 double Nc = 2.0*pow(dnbnd0,1.5)/1.0e6;
342 double kb (1.3806488e-23);
344 double dnbnd0 = 2.0*
M_PI*mhDOS*e_mass*kb*temp/(h_planck*h_planck);
345 double Nv = 2.0*pow(dnbnd0,1.5)/1.0e6;
360 ExtendedString mater = material;
363 double kbq = 8.6173324e-5;
364 double bg =
bandgap(mater,temp);
365 double Nc =
getNc(mater,temp);
366 double Nv =
getNv(mater,temp);
367 ni = sqrt (Nc * Nv) * exp(-bg/(2.0 * kbq * temp));
381 ExtendedString mater = material;
389 * pow(6.0,0.5) * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
390 (2.0 * 8.6174e-5 * temp));
393 else if (mater ==
"gaas")
397 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
398 (2.0 * 8.6174e-5 * temp));
400 else if (mater ==
"ge")
404 * 2.0 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
405 (2.0 * 8.6174e-5 * temp));
411 else if (mater==
"inalas" || mater==
"alinas")
415 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
416 (2.0 * 8.6174e-5 * temp));
418 else if (mater==
"ingaas" || mater==
"gainas")
422 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
423 (2.0 * 8.6174e-5 * temp));
425 else if (mater ==
"inp")
429 * pow(temp, 1.5) * exp(-
bandgap(mater,temp)/
430 (2.0 * 8.6174e-5 * temp));
434 std::string msg =
"MaterialSupport::getNi: ";
436 msg +=
" material not recognized.\n";
437 N_ERH_ErrorMgr::report( N_ERH_ErrorMgr::DEV_FATAL_0,msg);
453 ExtendedString mater = material;
461 else if (mater ==
"sio2")
465 else if (mater ==
"ge" )
469 else if (mater ==
"gaas")
473 else if (mater==
"inalas" || mater==
"alinas")
477 else if (mater==
"ingaas" || mater==
"gainas")
481 else if (mater ==
"inp")
487 Report::UserFatal0() << material <<
" material not recognized.";
509 (
const std::string & material,
double ni,
double n,
double p,
double tn,
double tp)
515 double B = (tp*(n+Ni)+tn*(p+Ni));
518 if (B >= exp(arg)) B = exp(arg);
540 (
const std::string & material,
double ni,
double n,
double p,
double tn,
double tp)
553 if (A1 >= exp(arg)) A1 = exp(arg);
557 C1 = (tp*(n+Ni)+tn*(p+Ni));
558 if (C1 >= exp(arg)) C1 = exp(arg);
561 dBdn = -1.0/(C1*C1) * tp;
563 pdRsrhN = dAdn * B1 + dBdn * A1;
585 (
const std::string & material,
double ni,
double n,
double p,
double tn,
double tp)
598 if (A1 >= exp(arg)) A1 = exp(arg);
602 C1 = (tp*(n+Ni)+tn*(p+Ni));
603 if (C1 >= exp(arg)) C1 = exp(arg);
606 dBdp = -1.0/(C1*C1) * tn;
608 pdRsrhP = dAdp * B1 + dBdp * A1;
631 (
const std::string & material,
double ni,
double n,
double p)
639 double C = (Cn*n+Cp*p);
642 if (C >= exp(arg)) C = exp(arg);
665 (
const std::string & material,
double ni,
double n,
double p)
679 if (A1 >= exp(arg)) A1 = exp(arg);
684 if (B1 >= exp(arg)) B1 = exp(arg);
688 pdRaugN = dAdn*B1 + A1*dBdn;
711 (
const std::string & material,
double ni,
double n,
double p)
725 if (A1 >= exp(arg)) A1 = exp(arg);
730 if (B1 >= exp(arg)) B1 = exp(arg);
734 pdRaugP = dAdp*B1 + A1*dBdp;
754 ExtendedString metalName = metal;
755 metalName.toLower ();
761 else if (metalName==
"ppoly")
765 else if (metalName==
"npoly")
769 else if (metalName==
"mo")
773 else if (metalName==
"w")
777 else if (metalName==
"modi")
781 else if (metalName==
"wdi")
785 else if (metalName==
"cu")
789 else if (metalName==
"pt")
793 else if (metalName==
"au")
797 else if (metalName==
"neutral")
803 Report::UserFatal0() << metalName <<
" material not recognized.";
824 ExtendedString materialName = material;
825 materialName.toLower();
827 if (materialName==
"si")
831 else if (materialName==
"ge")
835 else if (materialName==
"gaas")
839 else if (materialName==
"sio2")
843 else if (materialName==
"nitride")
847 else if (materialName==
"sapphire")
853 Report::UserError0() << materialName <<
" material not recognized.";
877 ExtendedString materialName = material;
878 materialName.toLower();
880 if (materialName==
"si")
882 gap = 1.17 - 4.73e-4*pow(temp,2.0)/(temp + 636.0);
884 else if (materialName==
"ge")
886 gap = 0.7437 - 4.774e-4*pow(temp,2.0)/(temp + 235);
888 else if (materialName==
"gaas")
890 gap = 1.519 - 5.405e-4*pow(temp,2.0)/(temp + 204);
892 else if (materialName==
"ingap")
896 else if (materialName==
"sio2")
900 else if (materialName==
"nitride")
904 else if (materialName==
"sapphire")
908 else if (materialName==
"inalas" || materialName==
"alinas")
912 else if (materialName==
"ingaas" || materialName==
"gainas")
916 else if (materialName==
"inp")
922 Report::UserError0() << materialName <<
" material not recognized.";
939 const std::string & material,
940 const std::string & bgnModel,
946 if (bgnModel==
"slotboom")
950 else if (bgnModel==
"bennet-wilson")
954 else if (bgnModel==
"jain")
956 Ebgn =
jainEbgn( material, dope, ntype) ;
958 else if (bgnModel==
"jain2")
960 Ebgn =
jain2Ebgn( material, dope, ntype) ;
962 else if (bgnModel==
"jain3")
964 Ebgn =
jain3Ebgn( material, dope, ntype) ;
968 Ebgn =
jainEbgn( material, dope, ntype) ;
988 double Eref = 6.84e-3;
989 double Nref = 3.162e+18;
992 Ebgn = Eref*std::pow(log(dope/Nref),2.0);
1026 double n0_bgn = 1.3e17;
1027 double v0_bgn = 6.92e-3;
1028 double con_bgn = 0.5;
1031 else if (material==
"ge")
1037 else if (material==
"gaas")
1043 else if (material==
"ingap")
1049 else if (material==
"sio2")
1057 else if (material==
"nitride")
1063 else if (material==
"sapphire")
1069 else if (material==
"inalas" || material==
"alinas")
1075 else if (material==
"ingaas" || material==
"gainas")
1079 else if (material==
"inp")
1086 Report::UserError() << material <<
" material not recognized";
1090 double tmp1 = log(dope/n0_bgn);
1091 Ebgn = (v0_bgn) * (tmp1 + sqrt(tmp1*tmp1 + con_bgn));
1113 double deltaEcn=0.0;
1114 double deltaEvn=0.0;
1115 double deltaEcp=0.0;
1116 double deltaEvp=0.0;
1118 double anc_bgn = 0.0;
1119 double bnc_bgn = 0.0;
1120 double cnc_bgn = 0.0;
1121 double anv_bgn = 0.0;
1122 double bnv_bgn = 0.0;
1123 double cnv_bgn = 0.0;
1124 double apc_bgn = 0.0;
1125 double bpc_bgn = 0.0;
1126 double cpc_bgn = 0.0;
1127 double apv_bgn = 0.0;
1128 double bpv_bgn = 0.0;
1129 double cpv_bgn = 0.0;
1133 anc_bgn = -14.84e-3;
1142 bpc_bgn = -16.27e-3;
1149 else if (material==
"ge")
1164 else if (material==
"gaas")
1166 anc_bgn = -16.30e-3;
1168 cnc_bgn = -18.13e-3;
1179 else if (material==
"ingap")
1183 cnc_bgn = -18.13e-3;
1194 else if (material==
"sio2")
1196 anc_bgn = -14.84e-3;
1205 bpc_bgn = -16.27e-3;
1214 else if (material==
"nitride")
1218 else if (material==
"sapphire")
1223 else if (material==
"inalas" || material==
"alinas")
1227 cnc_bgn = -18.13e-3;
1238 else if (material==
"ingaas" || material==
"gainas")
1242 cnc_bgn = -18.13e-3;
1254 else if (material==
"inp")
1258 cnc_bgn = -18.13e-3;
1271 Report::UserError() << material <<
" material not recognized";
1275 double dopeScaled=fabs(dope)/1.0e+18;
1280 +anc_bgn*std::pow(dopeScaled,(1.0/3.0))
1281 +bnc_bgn*std::pow(dopeScaled,(0.25))
1282 +cnc_bgn*std::pow(dopeScaled,(0.5));
1285 +anv_bgn*std::pow(dopeScaled,(1.0/3.0))
1286 +bnv_bgn*std::pow(dopeScaled,(0.25))
1287 +cnv_bgn*std::pow(dopeScaled,(0.5));
1289 Ebgn = deltaEcn-deltaEvn;
1294 +apc_bgn*std::pow(dopeScaled,(1.0/3.0))
1295 +bpc_bgn*std::pow(dopeScaled,(0.25))
1296 +cpc_bgn*std::pow(dopeScaled,(0.5));
1299 +apv_bgn*std::pow(dopeScaled,(1.0/3.0))
1300 +bpv_bgn*std::pow(dopeScaled,(0.25))
1301 +cpv_bgn*std::pow(dopeScaled,(0.5));
1303 Ebgn = deltaEcp-deltaEvp;
1326 double deltaEbgn=0.0;
1340 else if (material==
"ge")
1346 if (material==
"gaas")
1357 else if (material==
"ingap")
1360 else if (material==
"sio2")
1363 else if (material==
"nitride")
1367 else if (material==
"sapphire")
1371 else if (material==
"inalas" || material==
"alinas")
1375 else if (material==
"ingaas" || material==
"gainas")
1386 else if (material==
"inp")
1392 Report::UserError() << material <<
" material not recognized";
1396 double dopeScaled=fabs(dope);
1401 +A_n*std::pow(dopeScaled,(1.0/3.0))
1402 +B_n*std::pow(dopeScaled,(0.25))
1403 +C_n*std::pow(dopeScaled,(0.5));
1408 +A_p*std::pow(dopeScaled,(1.0/3.0))
1409 +B_p*std::pow(dopeScaled,(0.25))
1410 +C_p*std::pow(dopeScaled,(0.5));
1428 double deltaEbgn=0.0;
1436 else if (material==
"ge")
1442 if (material==
"gaas")
1448 else if (material==
"ingap")
1451 else if (material==
"sio2")
1454 else if (material==
"nitride")
1458 else if (material==
"sapphire")
1462 else if (material==
"inalas" || material==
"alinas")
1466 else if (material==
"ingaas" || material==
"gainas")
1471 else if (material==
"gasb")
1477 Report::UserError() << material <<
" material not recognized";
1481 double dopeScaled=fabs(dope);
1485 deltaEbgn=A_n*std::pow(dopeScaled,(1.0/3.0));
1489 deltaEbgn=A_p*std::pow(dopeScaled,(1.0/3.0));
1530 lt = LT0 / (1.0 + conc / Nref);
1536 lt = LT0 / (1.0 + conc / Nref);
double getNi_old(const std::string &material, double temp)
double get_DOS_EffectiveMassP(const std::string &material)
Pure virtual class to augment a linear system.
double getEffectiveMassP(const std::string &material)
double pdRaugN(const std::string &material, double ni, double n, double p)
double calcLt(bool holeFlag, double conc)
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)
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 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)
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)