ngspice/src/include/twodev.h

107 lines
4.4 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 Numerical Device Data Structures
*/
#ifndef TWODEV_H
#define TWODEV_H
#include "gendev.h"
typedef struct sTWOdevice
{
double *dcSolution; /* solution vector for device */
double *dcDeltaSolution; /* delta solution vector */
double *copiedSolution; /* copy of the solution vector */
double *rhs; /* rhs vector */
double *rhsImag; /* imaginary part of rhs vector */
char *matrix; /* matrix for device equations */
int solverType; /* what is matrix set up to do */
int dimEquil; /* dimension in equilibrium */
int numOrigEquil; /* orig number of nz's in equilibrium */
int numFillEquil; /* fill number of nz's in equilibrium */
int dimBias; /* dimension under bias */
int numOrigBias; /* orig number of nz's under bias */
int numFillBias; /* fill number of nz's under bias */
int numEqns; /* number of equations */
int poissonOnly; /* flag for Poisson eqn solution */
struct sTWOelem **elements; /* 1D list of elements */
struct sTWOelem ***elemArray; /* 2D list of elements for printing */
double **devStates; /* device states */
double *xScale; /* array of X node locations */
double *yScale; /* array of Y node locations */
int numXNodes; /* number of X nodes */
int numYNodes; /* number of Y nodes */
int numNodes; /* total number of nodes */
int numEdges; /* total number of edges */
int numElems; /* total number of elements */
struct sTWOcontact *pFirstContact; /* first contact */
struct sTWOcontact *pLastContact; /* last contact */
struct sTWOchannel *pChannel; /* surface mobility channel */
struct sMaterialInfo *pMaterials; /* temp-dep material information */
struct sStatInfo *pStats; /* run-time statistics */
int converged; /* flag for device convergence */
int iterationNumber; /* device iteration counter */
double width; /* device width in CM */
double rhsNorm; /* norm of rhs vector */
double abstol; /* absolute tolerance for device */
double reltol; /* relative tolerance for device */
char *name; /* name of device */
} TWOdevice;
#define devState0 devStates[0]
#define devState1 devStates[1]
#define devState2 devStates[2]
#define devState3 devStates[3]
#define devState4 devStates[4]
#define devState5 devStates[5]
#define devState6 devStates[6]
#define devState7 devStates[7]
typedef struct sTWOcontact
{
struct sTWOcontact *next; /* pointer to next contact */
struct sTWOnode **pNodes; /* pointer to the contact nodes */
int numNodes; /* number of nodes in contact */
int id; /* unique contact identifier */
double workf; /* metal work function */
} TWOcontact;
/* Structure for channels.
* A channel is divided into 'columns' that are perpendicular to the
* channel's insulator/semiconductor interface. Each column begins
* at its 'seed', the closest semiconductor element to the interface.
* It is assumed that the current flows parallel to the interface.
*/
typedef struct sTWOchannel
{
struct sTWOchannel *next; /* pointer to next channel */
struct sTWOelem *pSeed; /* pointer to the seed element */
struct sTWOelem *pNElem; /* pointer to the insulator element */
int id; /* unique channel identifier */
int type; /* ID of direction to interface */
} TWOchannel;
struct mosConductances
{
double dIdDVdb;
double dIdDVsb;
double dIdDVgb;
double dIsDVdb;
double dIsDVsb;
double dIsDVgb;
double dIgDVdb;
double dIgDVsb;
double dIgDVgb;
};
#endif /* TWODEV_H */