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

📄 twomobdv.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
  coeffVy = 0.25 * dx * rDy;  switch ( chanType ) {  case 0:  case 3:    coeffHs = 0.25 * dy / ds;    coeffVs = 0.25 * dx / ds;    break;  case 1:  case 2:    coeffHs = - 0.25 * dy / ds;    coeffVs = - 0.25 * dx / ds;    break;  }    /* Get pointers to element's edges */  pTEdge = pElem->pTopEdge;  pBEdge = pElem->pBotEdge;  pLEdge = pElem->pLeftEdge;  pREdge = pElem->pRightEdge;    /* Get element mobility derivatives for fast access later */  dMpDEs = pElem->dMupDEs;  dMpDEx = pElem->dMupDEx;  dMpDEy = pElem->dMupDEy;  dMpDWx = pElem->dMupDWx;  dMpDWy = pElem->dMupDWy;    /* Add mobility derivatives due to Top Edge */  /* First compute derivatives of cont. eqn's */   dFpxDMup = coeffHx * (pTEdge->wdfp * rDx);  dFpyDMup = coeffHy * (pTEdge->wdfp * rDx);    /* Do Top-Left (TL) Node of Element */  pNode = pElem->pTLNode;  /* p continuity wrto potential derivatives */  *(pNode->fPPsi) +=    dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  *(pNode->fPPsiiP1) +=    - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsiiP1jP1) +=    - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsijP1) +=    dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  /* p continuity wrto p derivatives */  *(pNode->fPP) +=    dFpxDMup * ( dMpDWx * pTEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDp );  *(pNode->fPPiP1) +=    dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDp );  *(pNode->fPPiP1jP1) +=    dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 );  *(pNode->fPPjP1) +=    dFpxDMup * ( dMpDWx * pBEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 );    /* both continuity wrto surface potential derivatives */  if ( channel ) {    dFpDEs   = coeffHs * (pTEdge->wdfp * rDx) * dMpDEs;    *(pNode->fPPsiIn)   -= dFpDEs;    *(pNode->fPPsiInP1) -= dFpDEs;    *(pNode->fPPsiOx)   += dFpDEs;    *(pNode->fPPsiOxP1) += dFpDEs;  }    /* Do Top-Right (TR) Node of Element */  pNode = pElem->pTRNode;  /* p continuity wrto potential derivatives */  *(pNode->fPPsiiM1) -=    dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  *(pNode->fPPsi) -=    - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsijP1) -=    - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsiiM1jP1) -=    dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  /* p continuity wrto p derivatives */  *(pNode->fPPiM1) -=    dFpxDMup * ( dMpDWx * pTEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDp );  *(pNode->fPP) -=    dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDp );  *(pNode->fPPjP1) -=    dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 );  *(pNode->fPPiM1jP1) -=    dFpxDMup * ( dMpDWx * pBEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 );    /* both continuity wrto surface potential derivatives */  if ( channel ) {    *(pNode->fPPsiInM1) += dFpDEs;    *(pNode->fPPsiIn)   += dFpDEs;    *(pNode->fPPsiOxM1) -= dFpDEs;    *(pNode->fPPsiOx)   -= dFpDEs;  }      /* Add mobility derivatives due to Bottom Edge */  /* First compute derivatives of cont. eqn's */   dFpxDMup = coeffHx * (pBEdge->wdfp * rDx);  dFpyDMup = coeffHy * (pBEdge->wdfp * rDx);    /* Do Bottom-Left (BL) Node of Element */  pNode = pElem->pBLNode;  /* p continuity wrto potential derivatives */  *(pNode->fPPsijM1) +=    dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  *(pNode->fPPsiiP1jM1) +=    - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsiiP1) +=    - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsi) +=    dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  /* p continuity wrto p derivatives */  *(pNode->fPPjM1) +=    dFpxDMup * ( dMpDWx * pTEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDp );  *(pNode->fPPiP1jM1) +=    dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDp );  *(pNode->fPPiP1) +=    dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 );  *(pNode->fPP) +=    dFpxDMup * ( dMpDWx * pBEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 );    /* both continuity wrto surface potential derivatives */  if (channel ) {    dFpDEs   = coeffHs * (pBEdge->wdfp * rDx) * dMpDEs;    *(pNode->fPPsiIn)   -= dFpDEs;    *(pNode->fPPsiInP1) -= dFpDEs;    *(pNode->fPPsiOx)   += dFpDEs;    *(pNode->fPPsiOxP1) += dFpDEs;  }    /* Do Bottom-Right (BR) Node of Element */  pNode = pElem->pBRNode;  /* p continuity wrto potential derivatives */  *(pNode->fPPsiiM1jM1) -=    dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  *(pNode->fPPsijM1) -=    - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsi) -=    - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsiiM1) -=    dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  /* p continuity wrto p derivatives */  *(pNode->fPPiM1jM1) -=    dFpxDMup * ( dMpDWx * pTEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDp );  *(pNode->fPPjM1) -=    dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDp );  *(pNode->fPP) -=    dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 );  *(pNode->fPPiM1) -=    dFpxDMup * ( dMpDWx * pBEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 );    /* both continuity wrto surface potential derivatives */  if ( channel ) {    *(pNode->fPPsiInM1) += dFpDEs;    *(pNode->fPPsiIn)   += dFpDEs;    *(pNode->fPPsiOxM1) -= dFpDEs;    *(pNode->fPPsiOx)   -= dFpDEs;  }    /* Add mobility derivatives due to Left Edge */  /* First compute derivatives of cont. eqn's */   dFpxDMup = coeffVx * (pLEdge->wdfp * rDy);  dFpyDMup = coeffVy * (pLEdge->wdfp * rDy);    /* Do Top-Left (TL) Node of Element */  pNode = pElem->pTLNode;  /* p continuity wrto potential derivatives */  *(pNode->fPPsi) +=    dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  *(pNode->fPPsiiP1) +=    - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsiiP1jP1) +=    - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsijP1) +=    dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  /* p continuity wrto p derivatives */  *(pNode->fPP) +=    dFpxDMup * ( dMpDWx * pTEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDp );  *(pNode->fPPiP1) +=    dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDp );  *(pNode->fPPiP1jP1) +=    dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 );  *(pNode->fPPjP1) +=    dFpxDMup * ( dMpDWx * pBEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 );  /* both continuity wrto surface potential derivatives */  if ( channel ) {    dFpDEs   = coeffVs * (pLEdge->wdfp * rDy) * dMpDEs;    *(pNode->fPPsiIn)   -= dFpDEs;    *(pNode->fPPsiInP1) -= dFpDEs;    *(pNode->fPPsiOx)   += dFpDEs;    *(pNode->fPPsiOxP1) += dFpDEs;  }    /* Do Bottom-Left (BL) Node of Element */  pNode = pElem->pBLNode;  /* p continuity wrto potential derivatives */  *(pNode->fPPsijM1) -=    dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  *(pNode->fPPsiiP1jM1) -=    - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsiiP1) -=    - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsi) -=    dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  /* p continuity wrto p derivatives */  *(pNode->fPPjM1) -=    dFpxDMup * ( dMpDWx * pTEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDp );  *(pNode->fPPiP1jM1) -=    dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDp );  *(pNode->fPPiP1) -=    dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 );  *(pNode->fPP) -=    dFpxDMup * ( dMpDWx * pBEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 );  /* both continuity wrto surface potential derivatives */  if ( channel ) {    *(pNode->fPPsiIn)   += dFpDEs;    *(pNode->fPPsiInP1) += dFpDEs;    *(pNode->fPPsiOx)   -= dFpDEs;    *(pNode->fPPsiOxP1) -= dFpDEs;  }    /* Add mobility derivatives due to Right Edge */  /* First compute derivatives of cont. eqn's */   dFpxDMup = coeffVx * (pREdge->wdfp * rDy);  dFpyDMup = coeffVy * (pREdge->wdfp * rDy);    /* Do Top-Right (TR) Node of Element */  pNode = pElem->pTRNode;  /* p continuity wrto potential derivatives */  *(pNode->fPPsiiM1) +=    dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  *(pNode->fPPsi) +=    - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsijP1) +=    - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsiiM1jP1) +=    dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  /* p continuity wrto p derivatives */  *(pNode->fPPiM1) +=    dFpxDMup * ( dMpDWx * pTEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDp );  *(pNode->fPP) +=    dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDp );  *(pNode->fPPjP1) +=    dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 );  *(pNode->fPPiM1jP1) +=    dFpxDMup * ( dMpDWx * pBEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 );  /* both continuity wrto surface potential derivatives */  if ( channel ) {    dFpDEs   = coeffVs * (pREdge->wdfp * rDy) * dMpDEs;    *(pNode->fPPsiInM1) -= dFpDEs;    *(pNode->fPPsiIn)   -= dFpDEs;    *(pNode->fPPsiOxM1) += dFpDEs;    *(pNode->fPPsiOx)   += dFpDEs;  }    /* Do Bottom-Right (BR) Node of Element */  pNode = pElem->pBRNode;  /* p continuity wrto potential derivatives */  *(pNode->fPPsiiM1jM1) -=    dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  *(pNode->fPPsijM1) -=    - dFpxDMup * ( dMpDEx - dMpDWx * pTEdge->dWpDpsiP1 )      + dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsi) -=    - dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pREdge->dWpDpsiP1 );  *(pNode->fPPsiiM1) -=    dFpxDMup * ( dMpDEx - dMpDWx * pBEdge->dWpDpsiP1 )      - dFpyDMup * ( dMpDEy - dMpDWy * pLEdge->dWpDpsiP1 );  /* p continuity wrto p derivatives */  *(pNode->fPPiM1jM1) -=    dFpxDMup * ( dMpDWx * pTEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDp );  *(pNode->fPPjM1) -=    dFpxDMup * ( dMpDWx * pTEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDp );  *(pNode->fPP) -=    dFpxDMup * ( dMpDWx * pBEdge->dWpDpP1 )      + dFpyDMup * ( dMpDWy * pREdge->dWpDpP1 );  *(pNode->fPPiM1) -=    dFpxDMup * ( dMpDWx * pBEdge->dWpDp )      + dFpyDMup * ( dMpDWy * pLEdge->dWpDpP1 );  /* both continuity wrto surface potential derivatives */  if ( channel ) {    *(pNode->fPPsiInM1) += dFpDEs;    *(pNode->fPPsiIn)   += dFpDEs;    *(pNode->fPPsiOxM1) -= dFpDEs;    *(pNode->fPPsiOx)   -= dFpDEs;  }    return;}

⌨️ 快捷键说明

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