numdtemp.c
来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 134 行
C
134 行
/**********Copyright 1992 Regents of the University of California. All rights reserved.Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD GroupAuthor: 1992 David A. Gates, U. C. Berkeley CAD Group**********/#include "ngspice.h"#include "cktdefs.h"#include "numddefs.h"#include "numenum.h"#include "carddefs.h"#include "sperror.h"#include "../../../ciderlib/oned/onedext.h"#include "cidersupt.h"#include "suffix.h"#define NIL(type) ((type *)0)int NUMDtemp(inModel, ckt) GENmodel *inModel; register CKTcircuit *ckt;/* * perform the temperature update to the diode */{ register NUMDmodel *model = (NUMDmodel *) inModel; register NUMDinstance *inst; METHcard *methods; MODLcard *models; OPTNcard *options; OUTPcard *outputs; ONEmaterial *pM, *pMaterial, *pNextMaterial; double startTime; /* loop through all the diode models */ for (; model != NULL; model = model->NUMDnextModel) { methods = model->NUMDmethods; models = model->NUMDmodels; options = model->NUMDoptions; outputs = model->NUMDoutputs; if (!options->OPTNtnomGiven) { options->OPTNtnom = ckt->CKTnomTemp; } for (pM = model->NUMDmatlInfo; pM != NIL(ONEmaterial); pM = pM->next) { pM->tnom = options->OPTNtnom; } BandGapNarrowing = models->MODLbandGapNarrowing; ConcDepLifetime = models->MODLconcDepLifetime; TempDepMobility = models->MODLtempDepMobility; ConcDepMobility = models->MODLconcDepMobility; for (inst = model->NUMDinstances; inst != NULL; inst = inst->NUMDnextInstance) { if (inst->NUMDowner != ARCHme) continue; startTime = SPfrontEnd->IFseconds(); if (!inst->NUMDtempGiven) { inst->NUMDtemp = ckt->CKTtemp; } if (!inst->NUMDareaGiven || inst->NUMDarea <= 0.0) { inst->NUMDarea = 1.0; } inst->NUMDpDevice->area = inst->NUMDarea * options->OPTNdefa; /* Compute and save globals for this instance. */ GLOBcomputeGlobals(&(inst->NUMDglobals), inst->NUMDtemp); if (outputs->OUTPglobals) { GLOBprnGlobals(stdout, &(inst->NUMDglobals)); } /* Calculate new sets of material parameters. */ pM = model->NUMDmatlInfo; pMaterial = inst->NUMDpDevice->pMaterials; for (; pM != NULL; pM = pM->next, pMaterial = pMaterial->next) { /* Copy the original values, then fix the incorrect pointer. */ pNextMaterial = pMaterial->next; bcopy((char *) pM, (char *) pMaterial, sizeof(ONEmaterial)); pMaterial->next = pNextMaterial; /* Now do the temperature dependence. */ MATLtempDep(pMaterial, pMaterial->tnom); if (outputs->OUTPmaterial) { printMaterialInfo(pMaterial); } } /* Assign doping to the mesh. */ ONEsetDoping(inst->NUMDpDevice, model->NUMDprofiles, model->NUMDdopTables); /* Assign other physical parameters to the mesh. */ ONEsetup(inst->NUMDpDevice); /* Assign boundary condition parameters. */ ONEsetBCparams(inst->NUMDpDevice, model->NUMDboundaries, model->NUMDcontacts); /* Normalize everything. */ ONEnormalize(inst->NUMDpDevice); /* Find the device's polarity type. */ switch (options->OPTNdeviceType) { case OPTN_DIODE: if (inst->NUMDpDevice->elemArray[1] ->pNodes[0]->netConc < 0.0) { inst->NUMDtype = PN; } else { inst->NUMDtype = NP; } break; case OPTN_MOSCAP: if (inst->NUMDpDevice->elemArray[inst->NUMDpDevice->numNodes - 1] ->pNodes[1]->netConc < 0.0) { inst->NUMDtype = PN; } else { inst->NUMDtype = NP; } break; default: inst->NUMDtype = PN; break; } inst->NUMDpDevice->pStats->totalTime[STAT_SETUP] += SPfrontEnd->IFseconds() - startTime; } } return (OK);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?