ngspice/src/include/twomesh.h

213 lines
7.8 KiB
C

/**********
Copyright 1991 Regents of the University of California. All rights reserved.
Authors: 1987 Karti Mayaram, 1991 David Gates
**********/
/* Member of CIDER device simulator
* Version: 1b1
*/
/*
* Two-Dimensional Element-based Simulation-Mesh Data Structures
*/
#ifndef TWOMESH_H
#define TWOMESH_H
#include "material.h"
typedef struct sTWOelem
{
struct sTWOelem *pElems[4]; /* array to store the element neighbors */
struct sTWOnode *pNodes[4]; /* array to store the element nodes */
struct sTWOedge *pEdges[4]; /* array to store the edges */
double dx; /* the x length */
double dy; /* the y length */
double dxOverDy; /* dX / dY */
double dyOverDx; /* dY / dX */
int domain; /* device domain owning element */
int elemType; /* material type of element */
TWOmaterial *matlInfo; /* material information */
double epsRel; /* relative epsilon */
/* Values needed to calc. mobility and its derivatives at element center */
double mun0, mup0; /* temp. and doping-dep. mobilities */
double mun, mup; /* field and carrier-dep. mobilities */
double dMunDEs, dMupDEs; /* Mob Deriv surf EFIELD Comp */
double dMunDEx, dMupDEx; /* Mob Deriv x EFIELD Comp */
double dMunDEy, dMupDEy; /* Mob Deriv y EFIELD Comp */
double dMunDWx, dMupDWx; /* Mob Deriv x WDF Comp */
double dMunDWy, dMupDWy; /* Mob Deriv y WDF Comp */
double dMunDN, dMupDN; /* Mob Deriv nConc Comp */
double dMunDP, dMupDP; /* Mob Deriv pConc Comp */
unsigned surface : 1; /* flag to indicate surface elem */
int channel; /* id of channel elem is in, 0 is none */
int direction; /* direction of flow for channels */
int evalNodes[4]; /* nodes to be evaluated in elem */
int evalEdges[4]; /* edges to be evaluated in elem */
} TWOelem;
#define pTopElem pElems[0]
#define pRightElem pElems[1]
#define pBotElem pElems[2]
#define pLeftElem pElems[3]
#define pTLNode pNodes[0]
#define pTRNode pNodes[1]
#define pBRNode pNodes[2]
#define pBLNode pNodes[3]
#define pTopEdge pEdges[0]
#define pRightEdge pEdges[1]
#define pBotEdge pEdges[2]
#define pLeftEdge pEdges[3]
typedef struct sTWOedge
{
int edgeType; /* boundary type of edge */
double dPsi; /* deltaPsi */
double jn; /* electron current */
double jp; /* hole current */
double jd; /* displacement current */
double dJnDpsiP1; /* dJn/dPsi(+1) */
double dJnDn; /* dJnx/dN */
double dJnDnP1; /* dJn/dN(+1) */
double dJpDpsiP1; /* dJpx/dPsi(+1) */
double dJpDp; /* dJpx/dP */
double dJpDpP1; /* dJpxDp(+1) */
double dCBand; /* effective delta conduction band */
double dVBand; /* effective delta valence band */
double qf; /* fixed charge density */
/* Terms to find weighted carrier driving force and its derivatives */
double wdfn; /* N weighted driving force */
double wdfp; /* P weighted driving force */
double dWnDpsiP1; /* dWn/dPsi(+1) */
double dWnDn; /* dWn/dN */
double dWnDnP1; /* dWn/dN(+1) */
double dWpDpsiP1; /* dWp/dPsi(+1) */
double dWpDp; /* dWp/dP */
double dWpDpP1; /* dWp/dP(+1) */
/* Coefficients for weighting mobility on sides of edges */
double kNeg; /* Spline for negative side of edge */
double kPos; /* Spline for positive side of edge */
int edgeState; /* pointer to state vector */
unsigned evaluated : 1; /* flag to indicated evaluated */
} TWOedge;
typedef struct sTWOnode {
int nodeType; /* type of node */
int nodeI; /* node x-index */
int nodeJ; /* node y-index */
int poiEqn; /* equation number for equilib poisson */
int psiEqn; /* equation number for bias poisson */
int nEqn; /* equation number for n continuity */
int pEqn; /* equation number for p continuity */
struct sTWOelem *pElems[4]; /* array of elements */
double psi0; /* equilibrium potential */
double psi; /* electrostatic potential */
double nConc; /* electron conc. */
double pConc; /* hole conc. */
double nie; /* effective intrinsic carrier conc. */
double eg; /* energy gap */
double eaff; /* electron affinity; work phi for metal*/
double tn; /* electron lifetime */
double tp; /* hole lifetime */
double netConc; /* net doping conc. */
double totalConc; /* total doping conc. */
double na; /* acceptor conc. */
double nd; /* donor conc. */
double nPred; /* predicted electron conc. */
double pPred; /* predicted hole conc. */
double uNet; /* net recombination rate */
double dUdN; /* dU / dN */
double dUdP; /* dU / dP */
double dNdT; /* dN / dT */
double dPdT; /* dP / dT */
int nodeState; /* pointer to the state vector */
unsigned evaluated : 1; /* flag to indicated evaluated */
/* sparse matrix pointers. pointers to doubles */
/* DAG: diagonal pointers fXXiX1jX1 */
double *fPsiPsiiM1;
double *fPsiPsi;
double *fPsiPsiiP1;
double *fPsiPsijM1;
double *fPsiPsijP1;
double *fPsiN;
double *fPsiP;
double *fNPsiiM1;
double *fNPsi;
double *fNPsiiP1;
double *fNPsijM1;
double *fNPsijP1;
double *fNPsiiM1jM1;
double *fNPsiiM1jP1;
double *fNPsiiP1jM1;
double *fNPsiiP1jP1;
double *fNNiM1;
double *fNN;
double *fNNiP1;
double *fNNjM1;
double *fNNjP1;
double *fNNiM1jM1;
double *fNNiM1jP1;
double *fNNiP1jM1;
double *fNNiP1jP1;
double *fNP;
double *fPPsiiM1;
double *fPPsi;
double *fPPsiiP1;
double *fPPsijM1;
double *fPPsijP1;
double *fPPsiiM1jM1;
double *fPPsiiM1jP1;
double *fPPsiiP1jM1;
double *fPPsiiP1jP1;
double *fPPiM1;
double *fPP;
double *fPPiP1;
double *fPPjM1;
double *fPPjP1;
double *fPPiM1jM1;
double *fPPiM1jP1;
double *fPPiP1jM1;
double *fPPiP1jP1;
double *fPN;
/* DAG: Pointers for Surface-Field-Dependent Terms */
/* For Oxide/Insulator on Silicon/Semiconductor:
Ox
OxM1 + ----- + ----- + OxP1 OXIDE
| | |
| | |
- InM1 + ----- + ----- + InP1 --- INTERFACE
In
*/
double *fNPsiInM1;
double *fNPsiIn;
double *fNPsiInP1;
double *fNPsiOxM1;
double *fNPsiOx;
double *fNPsiOxP1;
double *fPPsiInM1;
double *fPPsiIn;
double *fPPsiInP1;
double *fPPsiOxM1;
double *fPPsiOx;
double *fPPsiOxP1;
} TWOnode;
#define pTLElem pElems[0]
#define pTRElem pElems[1]
#define pBRElem pElems[2]
#define pBLElem pElems[3]
#define nodePsi nodeState
#define nodeN nodeState+1
#define nodeP nodeState+3
#define edgeDpsi edgeState
#define TWOnumNodeStates 5
#define TWOnumEdgeStates 2
#endif /* TWOMESH_H */