You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

121 lines
2.8 KiB

/**********
Copyright 1992 Regents of the University of California. All rights reserved.
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group
**********/
#include "ngspice/ngspice.h"
#include "ngspice/numglobs.h"
#include "ngspice/numconst.h"
#include "ngspice/onemesh.h"
#include "../../maths/misc/accuracy.h"
#include "onedext.h"
#include "oneddefs.h"
void
ONEQfreezeOut(ONEnode *pNode, double *ndFac, double *naFac, double *dNdFac,
double *dNaFac)
{
double temp1, temp2;
double eLev;
ONEmaterial *info;
if (pNode->pRightElem && pNode->pRightElem->evalNodes[0]) {
info = pNode->pRightElem->matlInfo;
} else {
info = pNode->pLeftElem->matlInfo;
}
eLev = info->eDon;
if (info->material != GAAS) {
eLev -= LEVEL_ALPHA_SI * pow(pNode->nd * NNorm, 1.0 / 3.0);
if (eLev < 0.0)
eLev = 0.0;
}
if (eLev >= ExpLim) {
*ndFac = 0.0;
*dNdFac = 0.0;
} else if (eLev <= -ExpLim) {
*ndFac = 1.0;
*dNdFac = 0.0;
} else {
temp1 = info->gDon * pNode->nConc * NNorm * exp(eLev) / info->nc0;
temp2 = 1.0 / (1.0 + temp1);
*ndFac = temp2;
*dNdFac = -temp2 * temp2 * temp1;
}
eLev = info->eAcc;
if (info->material != GAAS) {
eLev -= LEVEL_ALPHA_SI * pow(pNode->na * NNorm, 1.0 / 3.0);
if (eLev < 0.0)
eLev = 0.0;
}
if (eLev >= ExpLim) {
*naFac = 0.0;
*dNaFac = 0.0;
} else if (eLev <= -ExpLim) {
*naFac = 1.0;
*dNaFac = 0.0;
} else {
temp1 = info->gAcc * pNode->pConc * NNorm * exp(eLev) / info->nv0;
temp2 = 1.0 / (1.0 + temp1);
*naFac = temp2;
*dNaFac = temp2 * temp2 * temp1;
}
}
void
ONE_freezeOut(ONEnode *pNode, double nConc, double pConc, double *ndFac,
double *naFac, double *dNdFac, double *dNaFac)
{
double temp1, temp2;
double eLev;
ONEmaterial *info;
if (pNode->pRightElem && pNode->pRightElem->evalNodes[0]) {
info = pNode->pRightElem->matlInfo;
} else {
info = pNode->pLeftElem->matlInfo;
}
eLev = info->eDon;
if (info->material != GAAS) {
eLev -= LEVEL_ALPHA_SI * pow(pNode->nd * NNorm, 1.0 / 3.0);
if (eLev < 0.0)
eLev = 0.0;
}
if (eLev >= ExpLim) {
*ndFac = 0.0;
*dNdFac = 0.0;
} else if (eLev <= -ExpLim) {
*ndFac = 1.0;
*dNdFac = 0.0;
} else {
temp1 = info->gDon * exp(eLev) * NNorm / info->nc0;
temp2 = 1.0 / (1.0 + nConc * temp1);
*ndFac = temp2;
*dNdFac = -temp2 * temp2 * temp1;
}
eLev = info->eAcc;
if (info->material != GAAS) {
eLev -= LEVEL_ALPHA_SI * pow(pNode->na * NNorm, 1.0 / 3.0);
if (eLev < 0.0)
eLev = 0.0;
}
if (eLev >= ExpLim) {
*naFac = 0.0;
*dNaFac = 0.0;
} else if (eLev <= -ExpLim) {
*naFac = 1.0;
*dNaFac = 0.0;
} else {
temp1 = info->gAcc * exp(eLev) * NNorm / info->nv0;
temp2 = 1.0 / (1.0 + pConc * temp1);
*naFac = temp2;
*dNaFac = -temp2 * temp2 * temp1;
}
}