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

📄 twomobdv.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
  /* Add mobility derivatives due to Top Edge */  /* First compute derivatives of cont. eqn's */   dFnxDMun = coeffHx * (pTEdge->wdfn * rDx);  dFnyDMun = coeffHy * (pTEdge->wdfn * rDx);    /* Do Top-Left (TL) Node of Element */  pNode = pElem->pTLNode;  /* n continuity wrto potential derivatives */  *(pNode->fNPsi) +=    dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  *(pNode->fNPsiiP1) +=    - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsiiP1jP1) +=    - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsijP1) +=    dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  /* n continuity wrto n derivatives */  *(pNode->fNN) +=    dFnxDMun * ( dMnDWx * pTEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDn );  *(pNode->fNNiP1) +=    dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDn );  *(pNode->fNNiP1jP1) +=    dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 );  *(pNode->fNNjP1) +=    dFnxDMun * ( dMnDWx * pBEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 );    /* both continuity wrto surface potential derivatives */  if ( channel ) {    dFnDEs   = coeffHs * (pTEdge->wdfn * rDx) * dMnDEs;    *(pNode->fNPsiIn)   -= dFnDEs;    *(pNode->fNPsiInP1) -= dFnDEs;    *(pNode->fNPsiOx)   += dFnDEs;    *(pNode->fNPsiOxP1) += dFnDEs;  }    /* Do Top-Right (TR) Node of Element */  pNode = pElem->pTRNode;  /* n continuity wrto potential derivatives */  *(pNode->fNPsiiM1) -=    dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  *(pNode->fNPsi) -=    - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsijP1) -=    - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsiiM1jP1) -=    dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  /* n continuity wrto n derivatives */  *(pNode->fNNiM1) -=    dFnxDMun * ( dMnDWx * pTEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDn );  *(pNode->fNN) -=    dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDn );  *(pNode->fNNjP1) -=    dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 );  *(pNode->fNNiM1jP1) -=    dFnxDMun * ( dMnDWx * pBEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 );    /* both continuity wrto surface potential derivatives */  if ( channel ) {    *(pNode->fNPsiInM1) += dFnDEs;    *(pNode->fNPsiIn)   += dFnDEs;    *(pNode->fNPsiOxM1) -= dFnDEs;    *(pNode->fNPsiOx)   -= dFnDEs;  }      /* Add mobility derivatives due to Bottom Edge */  /* First compute derivatives of cont. eqn's */   dFnxDMun = coeffHx * (pBEdge->wdfn * rDx);  dFnyDMun = coeffHy * (pBEdge->wdfn * rDx);    /* Do Bottom-Left (BL) Node of Element */  pNode = pElem->pBLNode;  /* n continuity wrto potential derivatives */  *(pNode->fNPsijM1) +=    dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  *(pNode->fNPsiiP1jM1) +=    - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsiiP1) +=    - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsi) +=    dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  /* n continuity wrto n derivatives */  *(pNode->fNNjM1) +=    dFnxDMun * ( dMnDWx * pTEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDn );  *(pNode->fNNiP1jM1) +=    dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDn );  *(pNode->fNNiP1) +=    dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 );  *(pNode->fNN) +=    dFnxDMun * ( dMnDWx * pBEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 );    /* both continuity wrto surface potential derivatives */  if (channel ) {    dFnDEs   = coeffHs * (pBEdge->wdfn * rDx) * dMnDEs;    *(pNode->fNPsiIn)   -= dFnDEs;    *(pNode->fNPsiInP1) -= dFnDEs;    *(pNode->fNPsiOx)   += dFnDEs;    *(pNode->fNPsiOxP1) += dFnDEs;  }    /* Do Bottom-Right (BR) Node of Element */  pNode = pElem->pBRNode;  /* n continuity wrto potential derivatives */  *(pNode->fNPsiiM1jM1) -=    dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  *(pNode->fNPsijM1) -=    - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsi) -=    - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsiiM1) -=    dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  /* n continuity wrto n derivatives */  *(pNode->fNNiM1jM1) -=    dFnxDMun * ( dMnDWx * pTEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDn );  *(pNode->fNNjM1) -=    dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDn );  *(pNode->fNN) -=    dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 );  *(pNode->fNNiM1) -=    dFnxDMun * ( dMnDWx * pBEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 );    /* both continuity wrto surface potential derivatives */  if ( channel ) {    *(pNode->fNPsiInM1) += dFnDEs;    *(pNode->fNPsiIn)   += dFnDEs;    *(pNode->fNPsiOxM1) -= dFnDEs;    *(pNode->fNPsiOx)   -= dFnDEs;  }    /* Add mobility derivatives due to Left Edge */  /* First compute derivatives of cont. eqn's */   dFnxDMun = coeffVx * (pLEdge->wdfn * rDy);  dFnyDMun = coeffVy * (pLEdge->wdfn * rDy);    /* Do Top-Left (TL) Node of Element */  pNode = pElem->pTLNode;  /* n continuity wrto potential derivatives */  *(pNode->fNPsi) +=    dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  *(pNode->fNPsiiP1) +=    - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsiiP1jP1) +=    - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsijP1) +=    dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  /* n continuity wrto n derivatives */  *(pNode->fNN) +=    dFnxDMun * ( dMnDWx * pTEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDn );  *(pNode->fNNiP1) +=    dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDn );  *(pNode->fNNiP1jP1) +=    dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 );  *(pNode->fNNjP1) +=    dFnxDMun * ( dMnDWx * pBEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 );  /* both continuity wrto surface potential derivatives */  if ( channel ) {    dFnDEs   = coeffVs * (pLEdge->wdfn * rDy) * dMnDEs;    *(pNode->fNPsiIn)   -= dFnDEs;    *(pNode->fNPsiInP1) -= dFnDEs;    *(pNode->fNPsiOx)   += dFnDEs;    *(pNode->fNPsiOxP1) += dFnDEs;  }    /* Do Bottom-Left (BL) Node of Element */  pNode = pElem->pBLNode;  /* n continuity wrto potential derivatives */  *(pNode->fNPsijM1) -=    dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  *(pNode->fNPsiiP1jM1) -=    - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsiiP1) -=    - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsi) -=    dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  /* n continuity wrto n derivatives */  *(pNode->fNNjM1) -=    dFnxDMun * ( dMnDWx * pTEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDn );  *(pNode->fNNiP1jM1) -=    dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDn );  *(pNode->fNNiP1) -=    dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 );  *(pNode->fNN) -=    dFnxDMun * ( dMnDWx * pBEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 );  /* both continuity wrto surface potential derivatives */  if ( channel ) {    *(pNode->fNPsiIn)   += dFnDEs;    *(pNode->fNPsiInP1) += dFnDEs;    *(pNode->fNPsiOx)   -= dFnDEs;    *(pNode->fNPsiOxP1) -= dFnDEs;  }    /* Add mobility derivatives due to Right Edge */  /* First compute derivatives of cont. eqn's */   dFnxDMun = coeffVx * (pREdge->wdfn * rDy);  dFnyDMun = coeffVy * (pREdge->wdfn * rDy);    /* Do Top-Right (TR) Node of Element */  pNode = pElem->pTRNode;  /* n continuity wrto potential derivatives */  *(pNode->fNPsiiM1) +=    dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  *(pNode->fNPsi) +=    - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsijP1) +=    - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsiiM1jP1) +=    dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  /* n continuity wrto n derivatives */  *(pNode->fNNiM1) +=    dFnxDMun * ( dMnDWx * pTEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDn );  *(pNode->fNN) +=    dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDn );  *(pNode->fNNjP1) +=    dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 );  *(pNode->fNNiM1jP1) +=    dFnxDMun * ( dMnDWx * pBEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 );  /* both continuity wrto surface potential derivatives */  if ( channel ) {    dFnDEs   = coeffVs * (pREdge->wdfn * rDy) * dMnDEs;    *(pNode->fNPsiInM1) -= dFnDEs;    *(pNode->fNPsiIn)   -= dFnDEs;    *(pNode->fNPsiOxM1) += dFnDEs;    *(pNode->fNPsiOx)   += dFnDEs;  }    /* Do Bottom-Right (BR) Node of Element */  pNode = pElem->pBRNode;  /* n continuity wrto potential derivatives */  *(pNode->fNPsiiM1jM1) -=    dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  *(pNode->fNPsijM1) -=    - dFnxDMun * ( dMnDEx - dMnDWx * pTEdge->dWnDpsiP1 )      + dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsi) -=    - dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pREdge->dWnDpsiP1 );  *(pNode->fNPsiiM1) -=    dFnxDMun * ( dMnDEx - dMnDWx * pBEdge->dWnDpsiP1 )      - dFnyDMun * ( dMnDEy - dMnDWy * pLEdge->dWnDpsiP1 );  /* n continuity wrto n derivatives */  *(pNode->fNNiM1jM1) -=    dFnxDMun * ( dMnDWx * pTEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDn );  *(pNode->fNNjM1) -=    dFnxDMun * ( dMnDWx * pTEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDn );  *(pNode->fNN) -=    dFnxDMun * ( dMnDWx * pBEdge->dWnDnP1 )      + dFnyDMun * ( dMnDWy * pREdge->dWnDnP1 );  *(pNode->fNNiM1) -=    dFnxDMun * ( dMnDWx * pBEdge->dWnDn )      + dFnyDMun * ( dMnDWy * pLEdge->dWnDnP1 );  /* both continuity wrto surface potential derivatives */  if ( channel ) {    *(pNode->fNPsiInM1) += dFnDEs;    *(pNode->fNPsiIn)   += dFnDEs;    *(pNode->fNPsiOxM1) -= dFnDEs;    *(pNode->fNPsiOx)   -= dFnDEs;  }    return;}void  TWOPmobDeriv( pElem, chanType, ds )TWOelem *pElem;			/* channel or bulk element */int chanType;			/* flag for direction of channel */double ds;			/* normalized hgt (len) of interface element */{  TWOnode *pNode;  TWOedge *pTEdge, *pBEdge, *pLEdge, *pREdge;  BOOLEAN channel = pElem->channel;  double dx, dy, rDx, rDy;  double coeffHx, coeffHy, coeffHs;  double coeffVx, coeffVy, coeffVs;  double dFpxDMup, dFpyDMup, dFpDEs;  double dMpDEs, dMpDEx, dMpDEy, dMpDWx, dMpDWy;    /* Initialize various quantities */  dx = pElem->dx;  dy = pElem->dy;  rDx = 1.0 / dx;  rDy = 1.0 / dy;    /* compute length-dependent parameters */  coeffHx = 0.25 * dy * rDx;	/* For horizontal edges */  coeffHy = 0.25;  coeffVx = 0.25;		/* For vertical edges */

⌨️ 快捷键说明

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