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.
131 lines
4.4 KiB
131 lines
4.4 KiB
/**********
|
|
Copyright 1991 Regents of the University of California. All rights reserved.
|
|
Author: 1990 David A. Gates, U. C. Berkeley CAD Group
|
|
**********/
|
|
|
|
#include "ngspice.h"
|
|
#include "numglobs.h"
|
|
#include "twomesh.h"
|
|
#include "twoddefs.h"
|
|
#include "twodext.h"
|
|
|
|
/*
|
|
* Compute the 2-D field-dependent mobility at the center of an element.
|
|
* It is known a priori that the element belongs to a semiconductor domain.
|
|
*/
|
|
|
|
void
|
|
TWO_mobility(TWOelem *pElem, double eSurf)
|
|
{
|
|
|
|
TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge;
|
|
double dx, dy, rDx, rDy;
|
|
double enx, eny, wnx, wny, concav;
|
|
double epx, epy, wpx, wpy;
|
|
|
|
/* Initialize various quantities */
|
|
dx = pElem->dx;
|
|
dy = pElem->dy;
|
|
rDx = 0.5 / dx; /* Includes averaging factor of 0.5 */
|
|
rDy = 0.5 / dy; /* Includes averaging factor of 0.5 */
|
|
|
|
/* Get pointers to element's edges */
|
|
pTEdge = pElem->pTopEdge;
|
|
pBEdge = pElem->pBotEdge;
|
|
pLEdge = pElem->pLeftEdge;
|
|
pREdge = pElem->pRightEdge;
|
|
|
|
/* Calculate electric field at element center */
|
|
enx = -rDx *(pTEdge->dPsi + pTEdge->dCBand + pBEdge->dPsi + pBEdge->dCBand);
|
|
epx = -rDx *(pTEdge->dPsi - pTEdge->dVBand + pBEdge->dPsi - pBEdge->dVBand);
|
|
eny = -rDy *(pLEdge->dPsi + pLEdge->dCBand + pREdge->dPsi + pREdge->dCBand);
|
|
epy = -rDy *(pLEdge->dPsi - pLEdge->dVBand + pREdge->dPsi - pREdge->dVBand);
|
|
|
|
/* Calculate weighted carrier driving force at element center */
|
|
wnx = rDx * (pTEdge->wdfn + pBEdge->wdfn);
|
|
wpx = rDx * (pTEdge->wdfp + pBEdge->wdfp);
|
|
wny = rDy * (pLEdge->wdfn + pREdge->wdfn);
|
|
wpy = rDy * (pLEdge->wdfp + pREdge->wdfp);
|
|
|
|
/* compute the mobility for the element */
|
|
/* Average concentrations at the four corners */
|
|
concav = 0.25 * ( pElem->pTLNode->totalConc + pElem->pTRNode->totalConc +
|
|
pElem->pBLNode->totalConc + pElem->pBRNode->totalConc );
|
|
MOBsurfElec(pElem->matlInfo, pElem, enx, eny, eSurf, wnx, wny, concav);
|
|
MOBsurfHole(pElem->matlInfo, pElem, epx, epy, eSurf, wpx, wpy, concav);
|
|
return;
|
|
}
|
|
|
|
void
|
|
TWONmobility(TWOelem *pElem, double eSurf)
|
|
{
|
|
|
|
TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge;
|
|
double dx, dy, rDx, rDy;
|
|
double enx, eny, wnx, wny, concav;
|
|
|
|
/* Initialize various quantities */
|
|
dx = pElem->dx;
|
|
dy = pElem->dy;
|
|
rDx = 0.5 / dx; /* Includes averaging factor of 0.5 */
|
|
rDy = 0.5 / dy; /* Includes averaging factor of 0.5 */
|
|
|
|
/* Get pointers to element's edges */
|
|
pTEdge = pElem->pTopEdge;
|
|
pBEdge = pElem->pBotEdge;
|
|
pLEdge = pElem->pLeftEdge;
|
|
pREdge = pElem->pRightEdge;
|
|
|
|
/* Calculate electric field at element center */
|
|
enx = -rDx *(pTEdge->dPsi + pTEdge->dCBand + pBEdge->dPsi + pBEdge->dCBand);
|
|
eny = -rDy *(pLEdge->dPsi + pLEdge->dCBand + pREdge->dPsi + pREdge->dCBand);
|
|
|
|
/* Calculate weighted carrier driving force at element center */
|
|
wnx = rDx * (pTEdge->wdfn + pBEdge->wdfn);
|
|
wny = rDy * (pLEdge->wdfn + pREdge->wdfn);
|
|
|
|
/* compute the mobility for the element */
|
|
/* Average concentrations at the four corners */
|
|
concav = 0.25 * ( pElem->pTLNode->totalConc + pElem->pTRNode->totalConc +
|
|
pElem->pBLNode->totalConc + pElem->pBRNode->totalConc );
|
|
MOBsurfElec(pElem->matlInfo, pElem, enx, eny, eSurf, wnx, wny, concav);
|
|
|
|
return;
|
|
}
|
|
|
|
void
|
|
TWOPmobility(TWOelem *pElem, double eSurf)
|
|
{
|
|
|
|
TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge;
|
|
double dx, dy, rDx, rDy;
|
|
double epx, epy, wpx, wpy, concav;
|
|
|
|
/* Initialize various quantities */
|
|
dx = pElem->dx;
|
|
dy = pElem->dy;
|
|
rDx = 0.5 / dx; /* Includes averaging factor of 0.5 */
|
|
rDy = 0.5 / dy; /* Includes averaging factor of 0.5 */
|
|
|
|
/* Get pointers to element's edges */
|
|
pTEdge = pElem->pTopEdge;
|
|
pBEdge = pElem->pBotEdge;
|
|
pLEdge = pElem->pLeftEdge;
|
|
pREdge = pElem->pRightEdge;
|
|
|
|
/* Calculate electric field at element center */
|
|
epx = -rDx *(pTEdge->dPsi - pTEdge->dVBand + pBEdge->dPsi - pBEdge->dVBand);
|
|
epy = -rDy *(pLEdge->dPsi - pLEdge->dVBand + pREdge->dPsi - pREdge->dVBand);
|
|
|
|
/* Calculate weighted carrier driving force at element center */
|
|
wpx = rDx * (pTEdge->wdfp + pBEdge->wdfp);
|
|
wpy = rDy * (pLEdge->wdfp + pREdge->wdfp);
|
|
|
|
/* compute the mobility for the element */
|
|
/* Average concentrations at the four corners */
|
|
concav = 0.25 * ( pElem->pTLNode->totalConc + pElem->pTRNode->totalConc +
|
|
pElem->pBLNode->totalConc + pElem->pBRNode->totalConc );
|
|
MOBsurfHole(pElem->matlInfo, pElem, epx, epy, eSurf, wpx, wpy, concav);
|
|
|
|
return;
|
|
}
|