📄 dctrcurv.c
字号:
/**********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 + -