⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oneaval.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1991 Regents of the University of California.  All rights reserved.Author:	1987 Kartikeya Mayaram, U. C. Berkeley CAD Group**********/#include <math.h>#include "numglobs.h"#include "nummacs.h"#include "onemesh.h"#include "onedev.h"double ONEavalanche(rhsOnly, pDevice, pNode)  BOOLEAN rhsOnly;  ONEdevice *pDevice;  ONEnode *pNode;{  ONEelem *pLElem, *pRElem;  ONEedge *pLEdge, *pREdge;  int numNodes = pDevice->numNodes;  double dJnDpsiPrev, dJpDpsiPrev;  double eField, temp, jn, jp;  double signE, signN, signP, coeffR, coeffL, alphaN, alphaP;  double generation = 0.0;  double dAlphaNDpsiM1, dAlphaNDpsi, dAlphaNDpsiP1;  double dAlphaPDpsiM1, dAlphaPDpsi, dAlphaPDpsiP1;  ONEmaterial *info;  pRElem = pNode->pRightElem;  pLElem = pNode->pLeftElem;  if (pRElem->evalNodes[0]) {    info = pRElem->matlInfo;  } else {    info = pLElem->matlInfo;  }  pREdge = pRElem->pEdge;  pLEdge = pLElem->pEdge;  dJnDpsiPrev = pLEdge->dJnDpsiP1;  dJpDpsiPrev = pLEdge->dJpDpsiP1;  temp = pRElem->dx + pLElem->dx;  coeffR = pLElem->dx / temp;  coeffL = pRElem->dx / temp;  eField = -(coeffR * pREdge->dPsi * pRElem->rDx +      coeffL * pLEdge->dPsi * pLElem->rDx);  jn = coeffR * pREdge->jn + coeffL * pLEdge->jn;  jp = coeffR * pREdge->jp + coeffL * pLEdge->jp;  signE = SGN(eField);  eField = ABS(eField);  if (eField IS 0.0) {    return (0.0);  }  signN = SGN(jn);  if (signN * signE > 0.0) {    /* field accelerates the carriers, hence avalanche */    if (info->bii[ELEC] / eField > 80.0) {      alphaN = 0.0;    } else {      alphaN = info->aii[ELEC] * exp(-info->bii[ELEC] / eField);    }  } else {    alphaN = 0.0;  }  signP = SGN(jp);  if (signP * signE > 0.0) {    /* field accelerates the carriers, hence avalanche */    if (info->bii[HOLE] / eField > 80.0) {      alphaP = 0.0;    } else {      alphaP = info->aii[HOLE] * exp(-info->bii[HOLE] / eField);    }  } else {    alphaP = 0.0;  }  if (alphaN IS 0.0 AND alphaP IS 0.0) {    return (generation);  }  generation = (alphaN * ABS(jn) + alphaP * ABS(jp)) *      0.5 * (pRElem->dx + pLElem->dx);  if (rhsOnly) {    return (generation);  }  if (alphaN IS 0.0) {    dAlphaNDpsiM1 = 0.0;    dAlphaNDpsiP1 = 0.0;    dAlphaNDpsi = 0.0;  } else {    temp = alphaN * info->bii[ELEC] / (eField * eField);    dAlphaNDpsiM1 = signE * temp * (coeffL * pLElem->rDx);    dAlphaNDpsiP1 = -signE * temp * (coeffR * pRElem->rDx);    dAlphaNDpsi = -(dAlphaNDpsiM1 + dAlphaNDpsiP1);  }  if (alphaP IS 0.0) {    dAlphaPDpsiM1 = 0.0;    dAlphaPDpsiP1 = 0.0;    dAlphaPDpsi = 0.0;  } else {    temp = alphaP * info->bii[HOLE] / (eField * eField);    dAlphaPDpsiM1 = signE * temp * (coeffL * pLElem->rDx);    dAlphaPDpsiP1 = -signE * temp * (coeffR * pRElem->rDx);    dAlphaPDpsi = -(dAlphaPDpsiM1 + dAlphaPDpsiP1);  }  coeffR = 0.5 * pLElem->dx;  coeffL = 0.5 * pRElem->dx;  if (pNode->nodeI ISNOT 2) {    *(pNode->fNPsiiM1) +=	signN * (-alphaN * coeffL * dJnDpsiPrev +	coeffL * pLEdge->jn * dAlphaNDpsiM1) +	signP * (-alphaP * coeffL * dJpDpsiPrev +	coeffL * pLEdge->jp * dAlphaPDpsiM1);    *(pNode->fNNiM1) += signN * alphaN * coeffL * pLEdge->dJnDn;    *(pNode->fNPiM1) += signP * alphaP * coeffL * pLEdge->dJpDp;    *(pNode->fPPsiiM1) -=	signN * (-alphaN * coeffL * dJnDpsiPrev +	coeffL * pLEdge->jn * dAlphaNDpsiM1) +	signP * (-alphaP * coeffL * dJpDpsiPrev +	coeffL * pLEdge->jp * dAlphaPDpsiM1);    *(pNode->fPPiM1) -= signP * alphaP * coeffL * pLEdge->dJpDp;    *(pNode->fPNiM1) -= signN * alphaN * coeffL * pLEdge->dJnDn;  }  if (pNode->nodeI ISNOT numNodes - 1) {    *(pNode->fNPsiiP1) +=	signN * (alphaN * coeffR * pREdge->dJnDpsiP1 +	coeffR * pREdge->jn * dAlphaNDpsiP1) +	signP * (alphaP * coeffR * pREdge->dJpDpsiP1 +	coeffR * pREdge->jp * dAlphaPDpsiP1);    *(pNode->fNNiP1) += signN * alphaN * coeffR * pREdge->dJnDnP1;    *(pNode->fNPiP1) += signP * alphaP * coeffR * pREdge->dJpDpP1;    *(pNode->fPPsiiP1) -=	signN * (alphaN * coeffR * pREdge->dJnDpsiP1 +	coeffR * pREdge->jn * dAlphaNDpsiP1) +	signP * (alphaP * coeffR * pREdge->dJpDpsiP1 +	coeffR * pREdge->jp * dAlphaPDpsiP1);    *(pNode->fPPiP1) -= signP * alphaP * coeffR * pREdge->dJpDpP1;    *(pNode->fPNiP1) -= signN * alphaN * coeffR * pREdge->dJnDnP1;  }  *(pNode->fNPsi) +=      signN * (alphaN * (-coeffR * pREdge->dJnDpsiP1 +	  coeffL * dJnDpsiPrev) + (coeffR * pREdge->jn +	  coeffL * pLEdge->jn) * dAlphaNDpsi) +      signP * (alphaP * (-coeffR * pREdge->dJpDpsiP1 +	  coeffL * dJpDpsiPrev) + (coeffR * pREdge->jp +	  coeffL * pLEdge->jp) * dAlphaPDpsi);  *(pNode->fNN) += signN * alphaN * (coeffR * pREdge->dJnDn +      coeffL * pLEdge->dJnDnP1);  *(pNode->fNP) += signP * alphaP * (coeffR * pREdge->dJpDp +      coeffL * pLEdge->dJpDpP1);  *(pNode->fPPsi) -=      signN * (alphaN * (-coeffR * pREdge->dJnDpsiP1 +	  coeffL * dJnDpsiPrev) + (coeffR * pREdge->jn +	  coeffL * pLEdge->jn) * dAlphaNDpsi) +      signP * (alphaP * (-coeffR * pREdge->dJpDpsiP1 +	  coeffL * dJpDpsiPrev) + (coeffR * pREdge->jp +	  coeffL * pLEdge->jp) * dAlphaPDpsi);  *(pNode->fPN) -= signN * alphaN * (coeffR * pREdge->dJnDn +      coeffL * pLEdge->dJnDnP1);  *(pNode->fPP) -= signP * alphaP * (coeffR * pREdge->dJpDp +      coeffL * pLEdge->dJpDpP1);  return (generation);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -