📄 dctran.sav07nov91
字号:
* and previous timestep */ ckt->CKTorder = 1;#ifdef STEPDEBUG if( (ckt->CKTdelta >.1* ckt->CKTsaveDelta) || (ckt->CKTdelta > .1*(*(ckt->CKTbreaks+1)-*(ckt->CKTbreaks))) ) { if(ckt->CKTsaveDelta < (*(ckt->CKTbreaks+1)-*(ckt->CKTbreaks))) { (void)printf("limited by pre-breakpoint delta\n"); } else { (void)printf("limited by next breakpoint\n"); } }#endif#ifdef SHORTMACRO mt= MIN(ckt->CKTsaveDelta, *(ckt->CKTbreaks+1)-*(ckt->CKTbreaks)); ckt->CKTdelta = MIN(ckt->CKTdelta, .1 * mt);#else ckt->CKTdelta = MIN(ckt->CKTdelta, .1 * MIN(ckt->CKTsaveDelta, *(ckt->CKTbreaks+1)-*(ckt->CKTbreaks)));#endif if(firsttime) { ckt->CKTdelta /= 10;#ifdef STEPDEBUG (void)printf("delta cut for initial timepoint\n");#endif } }/* gtri - begin - wbk - Add Breakpoint stuff */ if(ckt->CKTtime + ckt->CKTdelta >= g_mif_info.breakpoint.current) { /* If next time > temporary breakpoint, force it to the breakpoint */ /* And mark that timestep was set by temporary breakpoint */ ckt->CKTsaveDelta = ckt->CKTdelta; ckt->CKTdelta = g_mif_info.breakpoint.current - ckt->CKTtime; g_mif_info.breakpoint.last = ckt->CKTtime + ckt->CKTdelta; } else { /* Else, mark that timestep was not set by temporary breakpoint */ g_mif_info.breakpoint.last = 1.0e30; }/* gtri - end - wbk - Add Breakpoint stuff *//* gtri - begin - wbk - Modify Breakpoint stuff *//* Old Code: if(ckt->CKTtime + ckt->CKTdelta >= *(ckt->CKTbreaks+1)) { ckt->CKTsaveDelta = ckt->CKTdelta; ckt->CKTdelta = *(ckt->CKTbreaks+1) - ckt->CKTtime;#ifdef STEPDEBUG (void)printf("delta cut to hit breakpoint\n");#endif ckt->CKTbreak = 1; error = CKTclrBreak(ckt); if(error) { ckt->CKTcurrentAnalysis = DOING_TRAN; ckt->CKTstat->STATtranTime += (*(SPfrontEnd->IFseconds))()-startTime; ckt->CKTstat->STATtranIter += ckt->CKTstat->STATnumIter - startIters; ckt->CKTstat->STATtranDecompTime += ckt->CKTstat->STATdecompTime - startdTime; ckt->CKTstat->STATtranSolveTime += ckt->CKTstat->STATsolveTime - startsTime; return(error); } } else if((ckt->CKTtime + ckt->CKTdelta > *(ckt->CKTbreaks)) && (ckt->CKTtime < *(ckt->CKTbreaks))) { ckt->CKTbreak = 1; ckt->CKTsaveDelta = ckt->CKTdelta;#ifdef STEPDEBUG (void)printf("delta cut to hit breakpoint again\n");#endif ckt->CKTdelta = *(ckt->CKTbreaks) - ckt->CKTtime; } New Code:*/ /* Throw out any permanent breakpoint times <= current time */ while(1) { if(*(ckt->CKTbreaks) <= (ckt->CKTtime + ckt->CKTminBreak)) CKTclrBreak(ckt); else break; } /* Force the breakpoint if appropriate */ if((ckt->CKTtime + ckt->CKTdelta) > *(ckt->CKTbreaks)) { ckt->CKTbreak = 1; ckt->CKTsaveDelta = ckt->CKTdelta; ckt->CKTdelta = *(ckt->CKTbreaks) - ckt->CKTtime; }/* gtri - end - wbk - Modify Breakpoint stuff *//* gtri - begin - wbk - Do event solution */ if(ckt->evt->counts.num_insts > 0) { /* if time = 0 and op_alternate was specified as false during */ /* dcop analysis, call any changed instances to let them */ /* post their outputs with their associated delays */ if((ckt->CKTtime == 0.0) && (! ckt->evt->options.op_alternate)) EVTiter(ckt); /* while there are events on the queue with event time <= next */ /* projected analog time, process them */ while((g_mif_info.circuit.evt_step = EVTnext_time(ckt)) <= (ckt->CKTtime + ckt->CKTdelta)) { /* Initialize temp analog bkpt to infinity */ g_mif_info.breakpoint.current = 1e30; /* Pull items off queue and process them */ EVTdequeue(ckt, g_mif_info.circuit.evt_step); EVTiter(ckt); /* If any instances have forced an earlier */ /* next analog time, cut the delta */ if(*(ckt->CKTbreaks) < g_mif_info.breakpoint.current) if(*(ckt->CKTbreaks) > (ckt->CKTtime + ckt->CKTminBreak)) g_mif_info.breakpoint.current = *(ckt->CKTbreaks); if(g_mif_info.breakpoint.current < (ckt->CKTtime + ckt->CKTdelta)) { /* Breakpoint must be > last accepted timepoint */ /* and >= current event time */ if(g_mif_info.breakpoint.current > (ckt->CKTtime + ckt->CKTminBreak) && (g_mif_info.breakpoint.current >= g_mif_info.circuit.evt_step)) { ckt->CKTsaveDelta = ckt->CKTdelta; ckt->CKTdelta = g_mif_info.breakpoint.current - ckt->CKTtime; g_mif_info.breakpoint.last = ckt->CKTtime + ckt->CKTdelta; } } } /* end while next event time <= next analog time */ } /* end if there are event instances *//* gtri - end - wbk - Do event solution */ for(i=5;i>=0;i--) { ckt->CKTdeltaOld[i+1]=ckt->CKTdeltaOld[i]; } ckt->CKTdeltaOld[0]=ckt->CKTdelta; temp = ckt->CKTstates[ckt->CKTmaxOrder+1]; for(i=ckt->CKTmaxOrder;i>=0;i--) { ckt->CKTstates[i+1] = ckt->CKTstates[i]; } ckt->CKTstates[0] = temp;/* 600 */ while (1) {/* gtri - add - wbk - 4/17/91 - Fix Berkeley bug *//* This is needed here to allow CAPask to output currents *//* during Transient analysis. A grep for CKTcurrentAnalysis *//* indicates that it should not hurt anything else ... */ ckt->CKTcurrentAnalysis = DOING_TRAN;/* gtri - end - wbk - 4/17/91 - Fix Berkeley bug */ olddelta=ckt->CKTdelta; /* time abort? */ ckt->CKTtime += ckt->CKTdelta; ckt->CKTdeltaOld[0]=ckt->CKTdelta; NIcomCof(ckt);#ifdef PREDICTOR error = NIpred(ckt);#endif /* PREDICTOR */ save_mode = ckt->CKTmode; save_order = ckt->CKTorder;/* gtri - begin - wbk - Add Breakpoint stuff */ /* Initialize temporary breakpoint to infinity */ g_mif_info.breakpoint.current = 1.0e30;/* gtri - end - wbk - Add Breakpoint stuff *//* gtri - begin - wbk - add convergence problem reporting flags */ /* delta is forced to equal delmin on last attempt near line 650 */ if(ckt->CKTdelta <= ckt->CKTdelmin) ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; else ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE;/* gtri - begin - wbk - add convergence problem reporting flags *//* gtri - begin - wbk - Call all hybrids *//* gtri - begin - wbk - Set evt_step */ if(ckt->evt->counts.num_insts > 0) { g_mif_info.circuit.evt_step = ckt->CKTtime; }/* gtri - end - wbk - Set evt_step */ converged = NIiter(ckt,ckt->CKTtranMaxIter); if(ckt->evt->counts.num_insts > 0) { g_mif_info.circuit.evt_step = ckt->CKTtime; EVTcall_hybrids(ckt); }/* gtri - end - wbk - Call all hybrids */ ckt->CKTstat->STATtimePts ++; ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITPRED; if(firsttime) { for(i=0;i<ckt->CKTnumStates;i++) { *(ckt->CKTstate2+i) = *(ckt->CKTstate1+i); *(ckt->CKTstate3+i) = *(ckt->CKTstate1+i); } } if(converged != 0) { ckt->CKTtime = ckt->CKTtime -ckt->CKTdelta; ckt->CKTstat->STATrejected ++; ckt->CKTdelta = ckt->CKTdelta/8;#ifdef STEPDEBUG (void)printf("delta cut for non-convergence\n");#endif if(firsttime) { ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITTRAN; } ckt->CKTorder = 1;/* gtri - begin - wbk - Add Breakpoint stuff */ /* Force backup if temporary breakpoint is < current time */ } else if(g_mif_info.breakpoint.current < ckt->CKTtime) { ckt->CKTsaveDelta = ckt->CKTdelta; ckt->CKTtime -= ckt->CKTdelta; ckt->CKTdelta = g_mif_info.breakpoint.current - ckt->CKTtime; g_mif_info.breakpoint.last = ckt->CKTtime + ckt->CKTdelta; if(firsttime) { ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITTRAN; } ckt->CKTorder = 1;/* gtri - end - wbk - Add Breakpoint stuff */ } else { if (firsttime) { if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN)){ save1 = ckt->CKTmode; save2 = ckt->CKTorder; ckt->CKTmode = save_mode; ckt->CKTorder = save_order; if(error = CKTsenDCtran(ckt)) return(error); ckt->CKTmode = save1; ckt->CKTorder = save2; } firsttime =0; goto nextTime; /* no check on * first time point */ } new = ckt->CKTdelta; error = CKTtrunc(ckt,&new); if(error) { ckt->CKTcurrentAnalysis = DOING_TRAN; ckt->CKTstat->STATtranTime += (*(SPfrontEnd->IFseconds))()-startTime; ckt->CKTstat->STATtranIter += ckt->CKTstat->STATnumIter - startIters; ckt->CKTstat->STATtranDecompTime += ckt->CKTstat->STATdecompTime - startdTime; ckt->CKTstat->STATtranSolveTime += ckt->CKTstat->STATsolveTime - startsTime; return(error); } if(new>.9 * ckt->CKTdelta) { if(ckt->CKTorder == 1) { new = ckt->CKTdelta; ckt->CKTorder = 2; error = CKTtrunc(ckt,&new); if(error) { ckt->CKTcurrentAnalysis = DOING_TRAN; ckt->CKTstat->STATtranTime += (*(SPfrontEnd->IFseconds))()-startTime; ckt->CKTstat->STATtranIter += ckt->CKTstat->STATnumIter - startIters; ckt->CKTstat->STATtranDecompTime += ckt->CKTstat->STATdecompTime - startdTime; ckt->CKTstat->STATtranSolveTime += ckt->CKTstat->STATsolveTime - startsTime; return(error); } if(new <= 1.05 * ckt->CKTdelta) { ckt->CKTorder = 1; } } /* time point OK - 630*/ ckt->CKTdelta = new;#ifdef STEPDEBUG (void)printf( "delta set to truncation error result:point accepted\n");#endif if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN)){ save1 = ckt->CKTmode; save2 = ckt->CKTorder; ckt->CKTmode = save_mode; ckt->CKTorder = save_order; if(error = CKTsenDCtran(ckt)) return(error); ckt->CKTmode = save1; ckt->CKTorder = save2; } /* go to 650 - trapezoidal */ goto nextTime; } else { ckt->CKTtime = ckt->CKTtime -ckt->CKTdelta; ckt->CKTstat->STATrejected ++; ckt->CKTdelta = new;#ifdef STEPDEBUG (void)printf( "delta set to truncation error result:point rejected\n");#endif } } if (ckt->CKTdelta <= ckt->CKTdelmin) { if (olddelta > ckt->CKTdelmin) { ckt->CKTdelta = ckt->CKTdelmin;#ifdef STEPDEBUG (void)printf("delta at delmin\n");#endif } else { ckt->CKTcurrentAnalysis = DOING_TRAN; ckt->CKTstat->STATtranTime += (*(SPfrontEnd->IFseconds))()-startTime; ckt->CKTstat->STATtranIter += ckt->CKTstat->STATnumIter - startIters; ckt->CKTstat->STATtranDecompTime += ckt->CKTstat->STATdecompTime - startdTime; ckt->CKTstat->STATtranSolveTime += ckt->CKTstat->STATsolveTime - startsTime; errMsg = MALLOC(strlen(msg)+1); strcpy(errMsg,msg); return(E_TIMESTEP); } }/* gtri - begin - wbk - Do event backup */ if(ckt->evt->counts.num_insts > 0) EVTbackup(ckt, ckt->CKTtime + ckt->CKTdelta);/* gtri - end - wbk - Do event backup */ } /* NOTREACHED */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -