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

📄 dctrcurv.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
		     goto nextstep;		  		  }	           } /* else  not possible */        while (i > 0) {             /* init(i); */            i--;             if(cv->TRCVvType[i]==vcode) { /* voltage source */                ((VSRCinstance *)(cv->TRCVvElt[i]))->VSRCdcValue =                        cv->TRCVvStart[i];			            } else if(cv->TRCVvType[i]==icode) { /* current source */                ((ISRCinstance *)(cv->TRCVvElt[i]))->ISRCdcValue =                        cv->TRCVvStart[i];			            } else if(cv->TRCVvType[i]==TEMP_CODE) {                 ckt->CKTtemp = cv->TRCVvStart[i] + CONSTCtoK;                CKTtemp(ckt); 	    	    } else if(cv->TRCVvType[i]==rcode) {                 ((RESinstance *)(cv->TRCVvElt[i]))->RESresist =                        cv->TRCVvStart[i];		((RESinstance *)(cv->TRCVvElt[i]))->RESconduct =			  1/(((RESinstance *)(cv->TRCVvElt[i]))->RESresist);                                                      /* Note: changing the resistance does nothing */		                                     /* changing the conductance 1/r instead */		DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); 						/*		 * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); 		 */	     	     	     } /* else not possible */        }        /* Rotate state vectors. */        temp = ckt->CKTstates[ckt->CKTmaxOrder+1];        for(j=ckt->CKTmaxOrder;j>=0;j--) {            ckt->CKTstates[j+1] = ckt->CKTstates[j];        }        ckt->CKTstate0 = temp;        /* do operation */#ifdef XSPICE/* gtri - begin - wbk - Do EVTop if event instances exist */    if(ckt->evt->counts.num_insts == 0) {        /* If no event-driven instances, do what SPICE normally does */#endif        converged = NIiter(ckt,ckt->CKTdcTrcvMaxIter);        if(converged != 0) {            converged = CKTop(ckt,                (ckt->CKTmode&MODEUIC)|MODEDCTRANCURVE | MODEINITJCT,                (ckt->CKTmode&MODEUIC)|MODEDCTRANCURVE | MODEINITFLOAT,                ckt->CKTdcMaxIter);            if(converged != 0) {                return(converged);            }        }#ifdef XSPICE    }    else {        /* else do new algorithm */        /* first get the current step in the analysis */        if(cv->TRCVvType[0] == vcode) {            g_mif_info.circuit.evt_step = ((VSRCinstance *)(cv->TRCVvElt[i]))                    ->VSRCdcValue ;        } else if(cv->TRCVvType[0] == icode) {            g_mif_info.circuit.evt_step = ((ISRCinstance *)(cv->TRCVvElt[i]))                    ->ISRCdcValue ;        } else if(cv->TRCVvType[0] == rcode) {            g_mif_info.circuit.evt_step =  ((RESinstance*)(cv->TRCVvElt[i]->GENmodPtr))                    ->RESresist;        } else if(cv->TRCVvType[0] == TEMP_CODE) {            g_mif_info.circuit.evt_step =  ckt->CKTtemp - CONSTCtoK;        }        /* if first time through, call EVTop immediately and save event results */        if(firstTime) {            converged = EVTop(ckt,                        (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT,                        (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT,                        ckt->CKTdcMaxIter,                        MIF_TRUE);            EVTdump(ckt, IPC_ANAL_DCOP, g_mif_info.circuit.evt_step);            EVTop_save(ckt, MIF_FALSE, g_mif_info.circuit.evt_step);            if(converged != 0)                return(converged);        }        /* else, call NIiter first with mode = MODEINITPRED */        /* to attempt quick analog solution.  Then call all hybrids and call */        /* EVTop only if event outputs have changed, or if non-converged */        else {            converged = NIiter(ckt,ckt->CKTdcTrcvMaxIter);            EVTcall_hybrids(ckt);            if((converged != 0) || (ckt->evt->queue.output.num_changed != 0)) {                converged = EVTop(ckt,                            (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT,                            (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT,                            ckt->CKTdcMaxIter,                            MIF_FALSE);                EVTdump(ckt, IPC_ANAL_DCTRCURVE, g_mif_info.circuit.evt_step);                EVTop_save(ckt, MIF_FALSE, g_mif_info.circuit.evt_step);                if(converged != 0)                    return(converged);            }        }    }/* gtri - end - wbk - Do EVTop if event instances exist */#endif        ckt->CKTmode = (ckt->CKTmode&MODEUIC) | MODEDCTRANCURVE | MODEINITPRED ;        if(cv->TRCVvType[0] == vcode) {            ckt->CKTtime = ((VSRCinstance *)(cv->TRCVvElt[i]))                    ->VSRCdcValue ;        } else if(cv->TRCVvType[0] == icode) {            ckt->CKTtime = ((ISRCinstance *)(cv->TRCVvElt[i]))                    ->ISRCdcValue ;        } else if(cv->TRCVvType[0] == rcode) {            ckt->CKTtime = ((RESinstance *)(cv->TRCVvElt[i]))                    ->RESresist;        }         /* PN Temp sweep */	else         {	ckt->CKTtime = ckt->CKTtemp - CONSTCtoK ;         }#ifdef XSPICE/* gtri - add - wbk - 12/19/90 - Add IPC stuff */        /* If first time through, call CKTdump to output Operating Point info */        /* for Mspice compatibility */        if(g_ipc.enabled && firstTime) {            ipc_send_dcop_prefix();            CKTdump(ckt,(double) 0,plot);            ipc_send_dcop_suffix();        }/* gtri - end - wbk */#endif#ifdef WANT_SENSE2/*        if(!ckt->CKTsenInfo) printf("sensitivity structure does not exist\n");    */        if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode&DCSEN) ){	    int senmode;#ifdef SENSDEBUG            if(cv->TRCVvType[i]==vcode) { /* voltage source */                printf("Voltage Source Value : %.5e V\n",                        ((VSRCinstance*) (cv->TRCVvElt[i]))->VSRCdcValue);            }            if(cv->TRCVvType[i]==icode) { /* current source */                printf("Current Source Value : %.5e A\n",                        ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue);            }	    if(cv->TRCVvType[i]==rcode) { /* resistance */                printf("Current Resistance Value : %.5e Ohm\n",                        ((RESinstance*)(cv->TRCVvElt[i]->GENmodPtr))->RESresist);            }	    if(cv->TRCVvType[i]==TEMP_CODE) { /* Temperature */                printf("Current Circuit Temperature : %.5e C\n",                        ckt-CKTtemp - CONSTCtoK);            }	    #endif /* SENSDEBUG */            senmode = ckt->CKTsenInfo->SENmode;            save = ckt->CKTmode;            ckt->CKTsenInfo->SENmode = DCSEN;            if(error = CKTsenDCtran(ckt)) return (error);            ckt->CKTmode = save;            ckt->CKTsenInfo->SENmode = senmode;        }#endif#ifdef XSPICE/* gtri - modify - wbk - 12/19/90 - Send IPC delimiters */        if(g_ipc.enabled)            ipc_send_data_prefix(ckt->CKTtime);#endif        CKTdump(ckt,ckt->CKTtime,plot);#ifdef XSPICE        if(g_ipc.enabled)            ipc_send_data_suffix();/* gtri - end - wbk */#endif        if(firstTime) {            firstTime=0;            bcopy((char *)ckt->CKTstate0,(char *)ckt->CKTstate1,                    ckt->CKTnumStates*sizeof(double));        }nextstep:;        if(cv->TRCVvType[i]==vcode) { /* voltage source */            ((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcValue +=                    cv->TRCVvStep[i];        } else if(cv->TRCVvType[i]==icode) { /* current source */            ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue +=                    cv->TRCVvStep[i];	} else if(cv->TRCVvType[i]==rcode) { /* resistance */            ((RESinstance*)(cv->TRCVvElt[i]))->RESresist +=                    cv->TRCVvStep[i];	    /* This code should update resistance and conductance */    	    ((RESinstance*)(cv->TRCVvElt[i]))->RESconduct =	    1/(((RESinstance*)(cv->TRCVvElt[i]))->RESresist);            DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); 	                /*	     * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt);	     */ 	}	/* PN Temp Sweep - serban */        else if (cv->TRCVvType[i]==TEMP_CODE)        {    	    ckt->CKTtemp += cv->TRCVvStep[i];            CKTtemp(ckt);	            } /* else not possible */        	if( (*(SPfrontEnd->IFpauseTest))() ) {            /* user asked us to pause, so save state */            cv->TRCVnestState = i;            return(E_PAUSE);        }    }    /* all done, lets put everything back */    for(i=0;i<=cv->TRCVnestLevel;i++) {        if(cv->TRCVvType[i] == vcode) {   /* voltage source */            ((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcValue =                     cv->TRCVvSave[i];            ((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcGiven = cv->TRCVgSave[i];        } else  if(cv->TRCVvType[i] == icode) /*current source */ {            ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue =                     cv->TRCVvSave[i];            ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcGiven = cv->TRCVgSave[i];        } else  if(cv->TRCVvType[i] == rcode) /* Resistance */ {            ((RESinstance*)(cv->TRCVvElt[i]))->RESresist =                     cv->TRCVvSave[i];	    /* We restore both resistance and conductance */	    ((RESinstance*)(cv->TRCVvElt[i]))->RESconduct =	    1/(((RESinstance*)(cv->TRCVvElt[i]))->RESresist);	                ((RESinstance*)(cv->TRCVvElt[i]))->RESresGiven = cv->TRCVgSave[i];	    DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); 	    	    /*	     * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt);	     */         }	 else if(cv->TRCVvType[i] == TEMP_CODE) {            ckt->CKTtemp = cv->TRCVvSave[i];	    CKTtemp(ckt);	} /* else not possible */    }    (*(SPfrontEnd->OUTendPlot))(plot);    return(OK);}

⌨️ 快捷键说明

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