46 #ifndef Xyce_N_DEV_DevicePDEInstance_h
47 #define Xyce_N_DEV_DevicePDEInstance_h
50 #include <N_UTL_Math.h>
102 double pi = 4.0*atan(1.0);
104 double nu_eta = pow(arg, 4.0) + 50.0 +
105 33.6*arg*(1.0 - 0.68*exp(-0.17*pow(arg+1.0,2)));
107 double xi = 3.0*sqrt(pi)/(4.0*pow(nu_eta,0.375));
109 return 1.0/(exp(-arg)+xi);
122 double aux1 (
double x);
123 double aux2 (
double x);
129 double Jn (
double n1,
double n2,
double E,
double u,
double h);
131 double dJndV1 (
double n1,
double n2,
double E,
double u,
double h);
132 double dJndV2 (
double n1,
double n2,
double E,
double u,
double h);
133 double dJndn1 (
double n1,
double n2,
double E,
double u,
double h);
134 double dJndn2 (
double n1,
double n2,
double E,
double u,
double h);
136 double Jp (
double p1,
double p2,
double E,
double u,
double h);
138 double dJpdV1 (
double p1,
double p2,
double E,
double u,
double h);
139 double dJpdV2 (
double p1,
double p2,
double E,
double u,
double h);
140 double dJpdn1 (
double p1,
double p2,
double E,
double u,
double h);
141 double dJpdn2 (
double p1,
double p2,
double E,
double u,
double h);
144 double J_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
154 else retVal=(x / sinh(x));
175 {
return J_qdep (n1, n2, E, u.val(), h, z); }
177 double dJdV1_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
178 double dJdV2_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
179 double dJdn1_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
180 double dJdn2_qdep (
double n1,
double n2,
double E,
double u,
double h,
int z);
195 double nsdep(
double x,
double W,
double Dt);
197 double ngdep(
double x,
double y,
double W,
double ax,
double ay);
198 double ngdep2(
double x,
double y,
double ax,
double ay);
201 double erf(
double x);
208 template <
typename ScalarT>
210 ScalarT
const& hole_dens,
212 ScalarT
const& cond_band,
213 ScalarT
const& vale_band,
214 ScalarT
const& eff_dens_cond,
215 ScalarT
const& eff_dens_vale,
216 ScalarT
const& temp);
219 template <
typename ScalarT>
220 void n0_and_p0 ( ScalarT
const& elec_dens,
221 ScalarT
const& hole_dens,
223 ScalarT
const& cond_band,
224 ScalarT
const& vale_band,
225 ScalarT
const& eff_dens_cond,
226 ScalarT
const& eff_dens_vale,
232 template <
typename ScalarT>
296 template <
typename T>
int sgn(T val)
298 return (val > T(0)) - (val < T(0));
313 const time_t now = time( NULL );
317 strftime( timeDate, 80,
"TIME='%I:%M:%S %p' DATE='%b %d, %Y' ",
320 return std::string( timeDate );
333 const time_t now = time( NULL );
337 strftime( timeDate, 80,
"TIME= \" %I:%M:%S %p %b %d, %Y \" ",
340 return std::string( timeDate );
353 template <
typename ScalarT>
355 ( ScalarT
const& elec_dens,
356 ScalarT
const& hole_dens,
358 ScalarT
const& cond_band,
359 ScalarT
const& vale_band,
360 ScalarT
const& eff_dens_cond,
361 ScalarT
const& eff_dens_vale,
364 ScalarT product = 0.0;
369 ScalarT kbq = 8.6173324e-5;
371 if (elec_dens > hole_dens)
373 a_ = elec_dens - hole_dens;
376 n0 = (a_ + std::sqrt(a_*a_ + 4.0*Ni*Ni))/2.0;
377 ScalarT n_ratio = n0/eff_dens_cond;
378 eta_ = fdinvObj(n_ratio);
379 ScalarT fermi_lev = cond_band + (kbq *temp)*eta_;
380 p0 = eff_dens_vale * exp((vale_band - fermi_lev)/(kbq*temp));
386 a_ = hole_dens - elec_dens;
389 p0 = (a_ + std::sqrt(a_*a_ + 4.0*Ni*Ni))/2.0;
390 ScalarT p_ratio = p0/eff_dens_vale;
391 eta_ = fdinvObj(p_ratio);
392 ScalarT fermi_lev = vale_band - (kbq*temp)*eta_;
393 n0 = eff_dens_cond * exp((fermi_lev - cond_band)/(kbq*temp));
412 template <
typename ScalarT>
414 ( ScalarT
const& elec_dens,
415 ScalarT
const& hole_dens,
417 ScalarT
const& cond_band,
418 ScalarT
const& vale_band,
419 ScalarT
const& eff_dens_cond,
420 ScalarT
const& eff_dens_vale,
427 ScalarT kbq = 8.6173324e-5;
429 if (elec_dens > hole_dens)
431 a_ = elec_dens - hole_dens;
434 n0 = (a_ + std::sqrt(a_*a_ + 4.0*Ni*Ni))/2.0;
435 ScalarT n_ratio = n0/eff_dens_cond;
436 eta_ = fdinvObj(n_ratio);
437 ScalarT fermi_lev = cond_band + (kbq *temp)*eta_;
438 p0 = eff_dens_vale * exp((vale_band - fermi_lev)/(kbq*temp));
443 a_ = hole_dens - elec_dens;
446 p0 = (a_ + std::sqrt(a_*a_ + 4.0*Ni*Ni))/2.0;
447 ScalarT p_ratio = p0/eff_dens_vale;
448 eta_ = fdinvObj(p_ratio);
449 ScalarT fermi_lev = vale_band - (kbq*temp)*eta_;
450 n0 = eff_dens_cond * exp((fermi_lev - cond_band)/(kbq*temp));
465 template <
typename ScalarT>
477 ScalarT kbq = 8.6173324e-5;
479 ScalarT kT = kbq*temp;
481 ScalarT fermiArg1 = n1/DOS;
483 ScalarT fermiArg2 = n2/DOS;
487 ScalarT commonFactor = (V1-V2)/(2.0*kT);
491 ScalarT buffer = kT*1.e-3;
493 if(-z*commonFactor < 0.0)buffer *= -1.0;
495 ScalarT fluxDenominator = exp(-z*commonFactor+buffer/(2.0*kT)) - exp(z*commonFactor-buffer/(2.0*kT));
497 ScalarT concProduct = n1*n2;
499 if(n1*n2 < 0.0)concProduct = abs(buffer);
501 ScalarT fluxPrefactor = -mu*(-z*(V1-V2)+buffer)/h*sqrt(concProduct);
503 ScalarT fluxNumerator = exp(-z*(commonFactor + fdFactor)) -
504 exp( z*(commonFactor + fdFactor));
509 if(abs(commonFactor) > 50.0 || abs(fdFactor) > 50.00)
513 fluxDenominator = -1.0;
515 fluxDenominator = 1.0;
518 ScalarT flux = fluxPrefactor*fluxNumerator/fluxDenominator;
528 #endif // Xyce_N_DEV_DevicePDEInstance_h
double Jn(double n1, double n2, double E, double u, double h)
double J_qdep(double n1, double n2, double E, pdeFadType &u, double h, int z)
double dJdbm1_qdep(double n1, double n2, double E, const pdeFadType &u, double h, int z)
double dJndV2(double n1, double n2, double E, double u, double h)
pdeFadType nMidpoint(pdeFadType &n1, pdeFadType &n2, pdeFadType &E, double h, int z)
void n0_and_p0(ScalarT const &elec_dens, ScalarT const &hole_dens, ScalarT const &Ni, ScalarT const &cond_band, ScalarT const &vale_band, ScalarT const &eff_dens_cond, ScalarT const &eff_dens_vale, ScalarT const &temp, ScalarT &n0, ScalarT &p0)
ScalarT FDCarrierFlux(ScalarT n1, ScalarT n2, ScalarT V1, ScalarT V2, ScalarT mu, ScalarT temp, double h, double z, double DOS)
Pure virtual class to augment a linear system.
double Jp(double p1, double p2, double E, double u, double h)
ScalarT np0_calculation(ScalarT const &elec_dens, ScalarT const &hole_dens, ScalarT const &Ni, ScalarT const &cond_band, ScalarT const &vale_band, ScalarT const &eff_dens_cond, ScalarT const &eff_dens_vale, ScalarT const &temp)
DevicePDEInstance(const InstanceBlock &IB, ParametricData< void > ¶metric_data, const FactoryBlock &factory_block)
double dJdp2_qdep(double n1, double n2, double E, const pdeFadType &u, double h, int z)
pdeFadType aux2(pdeFadType &x)
double dJdpp2_qdep(double n1, double n2, double E, const pdeFadType &u, double h, int z)
bool fieldDependentMobility
bool fieldDependentMobilityGiven
Sacado::Fad::SFad< double, 10 > pdeFadType
virtual ~DevicePDEInstance()
double dJdV2_qdep(double n1, double n2, double E, double u, double h, int z)
double dJpdV2(double p1, double p2, double E, double u, double h)
inverse_fermi_one_half_N fdinvObj
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
BernouliSupport bernSupport
double dJdn1_qdep(double n1, double n2, double E, double u, double h, int z)
Class ParametricData manages the configuration information and the parameter binding map...
double getVoltDepElecDens(double Vmax, double V, double Nd)
double dJndn2(double n1, double n2, double E, double u, double h)
double dJpdn2(double p1, double p2, double E, double u, double h)
fermi_minus_one_half fminusonehalfObj
fermi_one_half fonehalfObj
double fermi_one_half_B(double arg)
double dJdV1_qdep(double n1, double n2, double E, double u, double h, int z)
const std::string tecplotTimeDateStamp()
std::map< std::string, DopeInfo * > dopeInfoMap
double dJpdV1(double p1, double p2, double E, double u, double h)
double dJndV1(double n1, double n2, double E, double u, double h)
pdeFadType aux1(pdeFadType &x)
double J_qdep(double n1, double n2, double E, double u, double h, int z)
double dJdn2_qdep(double n1, double n2, double E, double u, double h, int z)
double dJpdn1(double p1, double p2, double E, double u, double h)
double dJdbm2_qdep(double n1, double n2, double E, const pdeFadType &u, double h, int z)
double getVoltDepHoleDens(double Vmin, double V, double Na)
const std::string timeDateStamp()
double dJdpp1_qdep(double n1, double n2, double E, const pdeFadType &u, double h, int z)
InstanceBlock represent a device instance line from the netlist.
double dJdp1_qdep(double n1, double n2, double E, const pdeFadType &u, double h, int z)
DevicePDEInstance & operator=(const DevicePDEInstance &right)
double dJndn1(double n1, double n2, double E, double u, double h)
bool enableContinuationCalled