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

📄 dctrcurv.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. QuarlesModified: 1999 Paolo Nenzi**********/#include "ngspice.h"#include "vsrc/vsrcdefs.h"#include "isrc/isrcdefs.h"#include "res/resdefs.h"#include "cktdefs.h"#include "const.h"#include "sperror.h"#ifdef XSPICE/* gtri - add - wbk - 12/19/90 - Add headers */#include "mif.h"#include "evtproto.h"#include "ipctiein.h"/* gtri - end - wbk */#endif#include <devdefs.h>extern SPICEdev **DEVices;intDCtrCurv(CKTcircuit *ckt, int restart)                                 /* forced restart flag */{    TRCV* cv = (TRCV*)ckt->CKTcurJob; /* Where we get the job to do */     int i;    double *temp;    int converged;    int rcode;         int vcode;    int icode;    int j;    int error;    IFuid varUid;    IFuid *nameList;    int numNames;    int firstTime=1;    static void *plot=NULL;#ifdef WANT_SENSE2#ifdef SENSDEBUG    if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode&DCSEN) ){        printf("\nDC Sensitivity Results\n\n");        CKTsenPrint(ckt);    }#endif /* SENSDEBUG */#endif    rcode = CKTtypelook("Resistor");    vcode = CKTtypelook("Vsource");    icode = CKTtypelook("Isource");    if(!restart && cv->TRCVnestState >= 0) {        /* continuing */        i = cv->TRCVnestState;	/* resume to work? saj*/	error = (*(SPfrontEnd->OUTpBeginPlot))((void *)ckt,		      (void*)ckt->CKTcurJob, ckt->CKTcurJob->JOBname,	              varUid,IF_REAL,666,nameList, 666,&plot);	        goto resume;    }    ckt->CKTtime = 0;    ckt->CKTdelta = cv->TRCVvStep[0];    ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT ;    ckt->CKTorder=1;        /* Save the state of the circuit */    for(i=0;i<7;i++) {        ckt->CKTdeltaOld[i]=ckt->CKTdelta;    }        for(i=0;i<=cv->TRCVnestLevel;i++) {        if(rcode >= 0) {            /* resistances are in this version, so use them */            RESinstance *here;            RESmodel *model;            for(model = (RESmodel *)ckt->CKThead[rcode];model != NULL;                    model=model->RESnextModel){                for(here=model->RESinstances;here!=NULL;                        here=here->RESnextInstance) {                    if(here->RESname == cv->TRCVvName[i]) {                        cv->TRCVvElt[i]   = (GENinstance *)here;                        cv->TRCVvSave[i]  = here->RESresist;			cv->TRCVgSave[i]  = here->RESresGiven;                        cv->TRCVvType[i]  = rcode;                        here->RESresist   = cv->TRCVvStart[i];                        here->RESresGiven = 1;			CKTtemp(ckt);                        goto found;                    }                }            }        }        if(vcode >= 0) {            /* voltage sources are in this version, so use them */            VSRCinstance *here;            VSRCmodel *model;            for(model = (VSRCmodel *)ckt->CKThead[vcode];model != NULL;                    model=model->VSRCnextModel){                for(here=model->VSRCinstances;here!=NULL;                        here=here->VSRCnextInstance) {                    if(here->VSRCname == cv->TRCVvName[i]) {                        cv->TRCVvElt[i]   = (GENinstance *)here;                        cv->TRCVvSave[i]  = here->VSRCdcValue;			cv->TRCVgSave[i]  = here->VSRCdcGiven;                        cv->TRCVvType[i]  = vcode;                        here->VSRCdcValue = cv->TRCVvStart[i];                        here->VSRCdcGiven = 1;                        goto found;                    }                }            }        }        if(icode >= 0 ) {            /* current sources are in this version, so use them */            ISRCinstance *here;            ISRCmodel *model;            for(model= (ISRCmodel *)ckt->CKThead[icode];model != NULL;                    model=model->ISRCnextModel){                for(here=model->ISRCinstances;here!=NULL;                        here=here->ISRCnextInstance) {                    if(here->ISRCname == cv->TRCVvName[i]) {                        cv->TRCVvElt[i]   = (GENinstance *)here;                        cv->TRCVvSave[i]  = here->ISRCdcValue;			cv->TRCVgSave[i]  = here->ISRCdcGiven;                        cv->TRCVvType[i]  = icode;                        here->ISRCdcValue = cv->TRCVvStart[i];                        here->ISRCdcGiven = 1;                        goto found;                    }                }            }        }	        if(!strcmp(cv->TRCVvName[i], "temp"))        {            cv->TRCVvSave[i]=ckt->CKTtemp; /* Saves the old circuit temperature */            cv->TRCVvType[i]=TEMP_CODE;    /* Set the sweep type code */            ckt->CKTtemp = cv->TRCVvStart[i] + CONSTCtoK; /* Set the new circuit temp */	    CKTtemp(ckt);            goto found;        }	        (*(SPfrontEnd->IFerror))(ERR_FATAL,                 "DCtrCurv: source / resistor %s not in circuit", &(cv->TRCVvName[i]));        return(E_NODEV);found:;    }#ifdef XSPICE/* gtri - add - wbk - 12/19/90 - Add IPC stuff and anal_init and anal_type */        /* Tell the beginPlot routine what mode we're in */        g_ipc.anal_type = IPC_ANAL_DCTRCURVE;        /* Tell the code models what mode we're in */        g_mif_info.circuit.anal_type = MIF_DC;        g_mif_info.circuit.anal_init = MIF_TRUE;/* gtri - end - wbk */#endif    i--; /* PN: This seems to do nothing ??? */         error = CKTnames(ckt,&numNames,&nameList);    if(error) return(error);                if (cv->TRCVvType[i]==vcode)    	   (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL,            "v-sweep", UID_OTHER, (void **)NULL);        	else {	      if (cv->TRCVvType[i]==icode)    	         (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL,                 "i-sweep", UID_OTHER, (void **)NULL);                                      else {		       if (cv->TRCVvType[i]==TEMP_CODE)    	                  (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL,                          "temp-sweep", UID_OTHER, (void **)NULL);	                               else {			         if (cv->TRCVvType[i]==rcode)    	                            (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL,                                    "res-sweep", UID_OTHER, (void **)NULL);                                				    else    	                                  (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL,                                          "?-sweep", UID_OTHER, (void **)NULL);	                               } /* icode */                 } /* TEMP_CODE */        } /* rcode*/        error = (*(SPfrontEnd->OUTpBeginPlot))((void *)ckt,	(void*)ckt->CKTcurJob, ckt->CKTcurJob->JOBname,	varUid,IF_REAL,numNames,nameList, IF_REAL,&plot);        if(error) return(error);    /* now have finished the initialization - can start doing hard part */        i = 0;resume:        for(;;) {        if(cv->TRCVvType[i]==vcode) { /* voltage source */            if((((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcValue)*                    SIGN(1.,cv->TRCVvStep[i]) -                     SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] >		    DBL_EPSILON*1e+03)                {                     i++ ;                     firstTime=1;                    ckt->CKTmode = (ckt->CKTmode & MODEUIC) |                             MODEDCTRANCURVE | MODEINITJCT ;                    if (i > cv->TRCVnestLevel ) break ;                     goto nextstep;                }        } else if(cv->TRCVvType[i]==icode) { /* current source */            if((((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue)*                    SIGN(1.,cv->TRCVvStep[i]) -                    SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] >		    DBL_EPSILON*1e+03)                {                     i++ ;                     firstTime=1;                    ckt->CKTmode = (ckt->CKTmode & MODEUIC) |                             MODEDCTRANCURVE | MODEINITJCT ;                    if (i > cv->TRCVnestLevel ) break ;                     goto nextstep;                } 			} else if(cv->TRCVvType[i]==rcode) { /* resistance */            if((((RESinstance*)(cv->TRCVvElt[i]))->RESresist)*                    SIGN(1.,cv->TRCVvStep[i]) -                    SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] 		    > DBL_EPSILON*1e+03)                {                     i++ ;                     firstTime=1;                    ckt->CKTmode = (ckt->CKTmode & MODEUIC) |                             MODEDCTRANCURVE | MODEINITJCT ;                    if (i > cv->TRCVnestLevel ) break ;                     goto nextstep;                }         } else if(cv->TRCVvType[i]==TEMP_CODE) { /* temp sweep */            if(((ckt->CKTtemp) - CONSTCtoK) * SIGN(1.,cv->TRCVvStep[i]) -	            SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] >		    DBL_EPSILON*1e+03)		  {		     i++ ;		     firstTime=1;		     ckt->CKTmode = (ckt->CKTmode & MODEUIC) |		            MODEDCTRANCURVE | MODEINITJCT ;		     if (i > cv->TRCVnestLevel ) break ;

⌨️ 快捷键说明

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