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);
178 double pi = 4.0*atan(1.0);
180 double nu_eta = pow(arg, 4.0) + 50.0 +
181 33.6*arg*(1.0 - 0.68*exp(-0.17*pow(arg+1.0,2)));
183 double xi = 3.0*sqrt(pi)/(4.0*pow(nu_eta,0.375));
185 return 1.0/(exp(-arg)+xi);
198 double aux1 (
double x);
199 double aux2 (
double x);
205 double Jn (
double n1,
double n2,
double E,
double u,
double h);
207 double dJndV1 (
double n1,
double n2,
double E,
double u,
double h);
208 double dJndV2 (
double n1,
double n2,
double E,
double u,
double h);
209 double dJndn1 (
double n1,
double n2,
double E,
double u,
double h);
210 double dJndn2 (
double n1,
double n2,
double E,
double u,
double h);
212 double Jp (
double p1,
double p2,
double E,
double u,
double h);
214 double dJpdV1 (
double p1,
double p2,
double E,
double u,
double h);
215 double dJpdV2 (
double p1,
double p2,
double E,
double u,
double h);
216 double dJpdn1 (
double p1,
double p2,
double E,
double u,
double h);
217 double dJpdn2 (
double p1,
double p2,
double E,
double u,
double h);
220 double J_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
230 else retVal=(x / sinh(x));
251 {
return J_qdep (n1, n2, E, u.val(), h, z); }
253 double dJdV1_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
254 double dJdV2_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
255 double dJdn1_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
256 double dJdn2_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
271 double nsdep(
double x,
double W,
double Dt);
273 double ngdep(
double x,
double y,
double W,
double ax,
double ay);
274 double ngdep2(
double x,
double y,
double ax,
double ay);
277 double erf(
double x);
367 template <
typename T>
int sgn(T val)
369 return (val > T(0)) - (val < T(0));
384 const time_t now = time( NULL );
388 strftime( timeDate, 80,
"TIME='%I:%M:%S %p' DATE='%b %d, %Y' ",
391 return std::string( timeDate );
404 const time_t now = time( NULL );
408 strftime( timeDate, 80,
"TIME= \" %I:%M:%S %p %b %d, %Y \" ",
411 return std::string( timeDate );
419 #endif // Xyce_N_DEV_DevicePDEInstance_h