matlset.c
来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 182 行
C
182 行
/**********Copyright 1992 Regents of the University of California. All rights reserved.Author: 1992 David A. Gates, U. C. Berkeley CAD GroupModified: 2001 Paolo Nenzi$Id: matlset.c,v 1.2 2005/05/21 12:37:23 sjborley Exp $**********/#include "ngspice.h"#include "cktdefs.h"#include "numconst.h"#include "numenum.h"#include "matldefs.h"#include "material.h"#include "sperror.h"#include "suffix.h"#include "cidersupt.h"extern int MATLcheck( MATLcard * );extern int MATLsetup( MATLcard *, MaterialInfo ** );/* * Name: MATLcheck * Purpose: checks a list of MATLcards for input errors * Formals: cardList: the list to check * Returns: OK/E_PRIVATE * Users: numerical device setup routines * Calls: error message handler */int MATLcheck(MATLcard *cardList){ MATLcard *card, *card2; int cardNum = 0, cardNum2; int error = OK; char ebuf[512]; /* error message buffer */ for ( card = cardList; card != NIL(MATLcard); card = card->MATLnextCard ) { cardNum++; if( !card->MATLmaterialGiven ) { card->MATLmaterial = SILICON; } if (!card->MATLnumberGiven) { sprintf( ebuf, "material card %d is missing an id number", cardNum ); SPfrontEnd->IFerror( ERR_WARNING, ebuf, NIL(IFuid) ); error = E_PRIVATE; } /* Return now if anything has failed */ if (error) return(error); /* Make sure this id is different from all previous ones. */ cardNum2 = 0; for ( card2 = cardList; card2 != card; card2 = card2->MATLnextCard ) { cardNum2++; if (card2->MATLnumber == card->MATLnumber) { sprintf( ebuf, "material cards %d and %d use same id %d", cardNum2, cardNum, card->MATLnumber ); SPfrontEnd->IFerror( ERR_WARNING, ebuf, NIL(IFuid) ); error = E_PRIVATE; } } /* Return now if anything has failed */ if (error) return(error); } return(OK);}/* * Name: MATLsetup * Purpose: setup the physical model parameters * Formals: cardList: list of cards to setup * Returns: OK/E_PRIVATE * Users: numerical devices * Calls: MATLcheck */int MATLsetup(MATLcard *cardList, MaterialInfo **materialList){ MATLcard *card; MATLmaterial *newMaterial = NULL; int error;/* Initialize list of electrodes */ *materialList = NIL(MATLmaterial); /* Check the card list */ if ((error = MATLcheck( cardList ))) return( error ); for ( card = cardList; card != NIL(MATLcard); card = card->MATLnextCard ) { if (*materialList == NIL(MATLmaterial)) { RALLOC( newMaterial, MATLmaterial, 1 ); *materialList = newMaterial; } else { RALLOC( newMaterial->next, MATLmaterial, 1 ); newMaterial = newMaterial->next; } newMaterial->next = NIL(MATLmaterial); newMaterial->id = card->MATLnumber; newMaterial->material = card->MATLmaterial; /* Fill in default values */ MATLdefaults( newMaterial ); /* Now override with parameters set on the card */ if ( card->MATLpermittivityGiven ) { newMaterial->eps = card->MATLpermittivity; /* Multiply by permittivity of free space if relative epsilon given. */ if (newMaterial->eps > 0.1) { newMaterial->eps *= EPS0; } } if ( card->MATLaffinityGiven ) { newMaterial->affin = card->MATLaffinity; } if ( card->MATLnc0Given ) { newMaterial->nc0 = card->MATLnc0; } if ( card->MATLnv0Given ) { newMaterial->nv0 = card->MATLnv0; } if ( card->MATLeg0Given ) { newMaterial->eg0 = card->MATLeg0; } if ( card->MATLdEgdTGiven ) { newMaterial->dEgDt = card->MATLdEgdT; } if ( card->MATLtrefEgGiven ) { newMaterial->trefBGN = card->MATLtrefEg; } if ( card->MATLdEgdNGiven ) { newMaterial->dEgDn[ELEC] = card->MATLdEgdN; } if ( card->MATLnrefEgGiven ) { newMaterial->nrefBGN[ELEC] = card->MATLnrefEg; } if ( card->MATLdEgdPGiven ) { newMaterial->dEgDn[HOLE] = card->MATLdEgdP; } if ( card->MATLprefEgGiven ) { newMaterial->nrefBGN[HOLE] = card->MATLprefEg; } if ( card->MATLtaup0Given ) { newMaterial->tau0[HOLE] = card->MATLtaup0; } if ( card->MATLtaun0Given ) { newMaterial->tau0[ELEC] = card->MATLtaun0; } if ( card->MATLtaup0Given ) { newMaterial->tau0[HOLE] = card->MATLtaup0; } if ( card->MATLnrefSRHnGiven ) { newMaterial->nrefSRH[ELEC] = card->MATLnrefSRHn; } if ( card->MATLnrefSRHpGiven ) { newMaterial->nrefSRH[HOLE] = card->MATLnrefSRHp; } if ( card->MATLcnAugGiven ) { newMaterial->cAug[ELEC] = card->MATLcnAug; } if ( card->MATLcpAugGiven ) { newMaterial->cAug[HOLE] = card->MATLcpAug; } if ( card->MATLaRichNGiven ) { newMaterial->aRich[ELEC] = card->MATLaRichN; } if ( card->MATLaRichPGiven ) { newMaterial->aRich[HOLE] = card->MATLaRichP; } } return( OK );}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?