46 #ifndef Xyce_N_DEV_DevicePDEInstance_h
47 #define Xyce_N_DEV_DevicePDEInstance_h
51 #include <N_UTL_Misc.h>
90 double a1,
a2,
a3,
a4,
a5,
a6,
a7,
a8,
x10,
y10,
yp10,
x20,
y20,
yp20,
c1,
c2;
96 double c_b2 = 4.0/3.0;
100 a2 = 0.1875 - sqrt(3.0) / 9.0;
101 a3 = sqrt(2.0) * 5.0 / 48.0 + 0.125 - sqrt(6.0) / 9.0;
102 a4 = sqrt(2.0) * 5.0 / 32.0 + 1585.0/6912.0 - sqrt(3.0) * 5.0/24.0 - sqrt(5.0) / 25.0;
103 d__1 = sqrt(
pi) * 3.0/4.0;
111 yp10 = 1.0/x10 +
a1 +
a2 * 2.0 * x10 +
a3 * 3.0 * (x10 *
x10) +
a4 * 4.0 * (x10 * x10 * x10);
121 template <
typename ScalarT>
124 ScalarT ret_val = 0.0;
125 ScalarT tempVal = 0.0;
128 if (ratio > 0.0 && ratio <= 7.5)
130 tempVal = ratio*ratio;
131 ret_val = log(ratio) +
a1 * ratio +
a2*(ratio*ratio) +
a3*(ratio*ratio*ratio) +
a4*(tempVal*tempVal);
135 if (ratio > 7.5 && ratio <= 8.0)
137 ScalarT diff = ratio - 7.5;
138 ret_val =
y10 +
yp10*diff +
c1*(diff*diff);
140 if (ratio > 8. && ratio < 8.5)
142 ScalarT diff = 8.5-ratio;
143 ret_val =
y20 -
yp20*diff -
c2*(diff*diff);
147 ret_val = sqrt(
a5 * pow(ratio,
a6) -
a7);
181 double pi = 4.0*atan(1.0);
183 double nu_eta = pow(arg, 4.0) + 50.0 +
184 33.6*arg*(1.0 - 0.68*exp(-0.17*pow(arg+1.0,2)));
186 double xi = 3.0*sqrt(pi)/(4.0*pow(nu_eta,0.375));
188 return 1.0/(exp(-arg)+xi);
201 double aux1 (
double x);
202 double aux2 (
double x);
208 double Jn (
double n1,
double n2,
double E,
double u,
double h);
210 double dJndV1 (
double n1,
double n2,
double E,
double u,
double h);
211 double dJndV2 (
double n1,
double n2,
double E,
double u,
double h);
212 double dJndn1 (
double n1,
double n2,
double E,
double u,
double h);
213 double dJndn2 (
double n1,
double n2,
double E,
double u,
double h);
215 double Jp (
double p1,
double p2,
double E,
double u,
double h);
217 double dJpdV1 (
double p1,
double p2,
double E,
double u,
double h);
218 double dJpdV2 (
double p1,
double p2,
double E,
double u,
double h);
219 double dJpdn1 (
double p1,
double p2,
double E,
double u,
double h);
220 double dJpdn2 (
double p1,
double p2,
double E,
double u,
double h);
223 double J_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
233 else retVal=(x / sinh(x));
254 {
return J_qdep (n1, n2, E, u.val(), h, z); }
256 double dJdV1_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
257 double dJdV2_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
258 double dJdn1_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
259 double dJdn2_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
274 double nsdep(
double x,
double W,
double Dt);
276 double ngdep(
double x,
double y,
double W,
double ax,
double ay);
277 double ngdep2(
double x,
double y,
double ax,
double ay);
280 double erf(
double x);
287 template <
typename ScalarT>
289 ScalarT
const& hole_dens,
291 ScalarT
const& cond_band,
292 ScalarT
const& vale_band,
293 ScalarT
const& eff_dens_cond,
294 ScalarT
const& eff_dens_vale,
295 ScalarT
const& temp);
298 template <
typename ScalarT>
299 void n0_and_p0 ( ScalarT
const& elec_dens,
300 ScalarT
const& hole_dens,
302 ScalarT
const& cond_band,
303 ScalarT
const& vale_band,
304 ScalarT
const& eff_dens_cond,
305 ScalarT
const& eff_dens_vale,
391 template <
typename T>
int sgn(T val)
393 return (val > T(0)) - (val < T(0));
408 const time_t now = time( NULL );
412 strftime( timeDate, 80,
"TIME='%I:%M:%S %p' DATE='%b %d, %Y' ",
415 return std::string( timeDate );
428 const time_t now = time( NULL );
432 strftime( timeDate, 80,
"TIME= \" %I:%M:%S %p %b %d, %Y \" ",
435 return std::string( timeDate );
448 template <
typename ScalarT>
450 ( ScalarT
const& elec_dens,
451 ScalarT
const& hole_dens,
453 ScalarT
const& cond_band,
454 ScalarT
const& vale_band,
455 ScalarT
const& eff_dens_cond,
456 ScalarT
const& eff_dens_vale,
459 ScalarT product = 0.0;
464 ScalarT kbq = 8.6173324e-5;
466 if (elec_dens > hole_dens)
468 a_ = elec_dens - hole_dens;
471 n0 = (a_ + std::sqrt(a_*a_ + 4.0*Ni*Ni))/2.0;
472 ScalarT n_ratio = n0/eff_dens_cond;
473 eta_ = fdinvObj(n_ratio);
474 ScalarT fermi_lev = cond_band + (kbq *temp)*eta_;
475 p0 = eff_dens_vale * exp((vale_band - fermi_lev)/(kbq*temp));
481 a_ = hole_dens - elec_dens;
484 p0 = (a_ + std::sqrt(a_*a_ + 4.0*Ni*Ni))/2.0;
485 ScalarT p_ratio = p0/eff_dens_vale;
486 eta_ = fdinvObj(p_ratio);
487 ScalarT fermi_lev = vale_band - (kbq*temp)*eta_;
488 n0 = eff_dens_cond * exp((fermi_lev - cond_band)/(kbq*temp));
507 template <
typename ScalarT>
509 ( ScalarT
const& elec_dens,
510 ScalarT
const& hole_dens,
512 ScalarT
const& cond_band,
513 ScalarT
const& vale_band,
514 ScalarT
const& eff_dens_cond,
515 ScalarT
const& eff_dens_vale,
522 ScalarT kbq = 8.6173324e-5;
524 if (elec_dens > hole_dens)
526 a_ = elec_dens - hole_dens;
529 n0 = (a_ + std::sqrt(a_*a_ + 4.0*Ni*Ni))/2.0;
530 ScalarT n_ratio = n0/eff_dens_cond;
531 eta_ = fdinvObj(n_ratio);
532 ScalarT fermi_lev = cond_band + (kbq *temp)*eta_;
533 p0 = eff_dens_vale * exp((vale_band - fermi_lev)/(kbq*temp));
538 a_ = hole_dens - elec_dens;
541 p0 = (a_ + std::sqrt(a_*a_ + 4.0*Ni*Ni))/2.0;
542 ScalarT p_ratio = p0/eff_dens_vale;
543 eta_ = fdinvObj(p_ratio);
544 ScalarT fermi_lev = vale_band - (kbq*temp)*eta_;
545 n0 = eff_dens_cond * exp((fermi_lev - cond_band)/(kbq*temp));
556 #endif // Xyce_N_DEV_DevicePDEInstance_h