📄 cktterr.c
字号:
/**********Copyright 1990 Regents of the University of California. All rights reserved.Author: 1985 Thomas L. Quarles**********/#include "ngspice.h"#include "cktdefs.h"#define ccap (qcap+1)voidCKTterr(int qcap, CKTcircuit *ckt, double *timeStep){ double volttol; double chargetol; double tol; double del; double diff[8]; double deltmp[8]; double factor=0; int i; int j; static double gearCoeff[] = { .5, .2222222222, .1363636364, .096, .07299270073, .05830903790 }; static double trapCoeff[] = { .5, .08333333333 }; volttol = ckt->CKTabstol + ckt->CKTreltol * MAX( fabs(*(ckt->CKTstate0+ccap)), fabs(*(ckt->CKTstate1+ccap))); chargetol = MAX(fabs(*(ckt->CKTstate0 +qcap)),fabs(*(ckt->CKTstate1+qcap))); chargetol = ckt->CKTreltol * MAX(chargetol,ckt->CKTchgtol)/ckt->CKTdelta; tol = MAX(volttol,chargetol); /* now divided differences */ for(i=ckt->CKTorder+1;i>=0;i--) { diff[i] = *(ckt->CKTstates[i] + qcap); } for(i=0 ; i <= ckt->CKTorder ; i++) { deltmp[i] = ckt->CKTdeltaOld[i]; } j = ckt->CKTorder; while(1) { for(i=0;i <= j;i++) { diff[i] = (diff[i] - diff[i+1])/deltmp[i]; } if (--j < 0) break; for(i=0;i <= j;i++) { deltmp[i] = deltmp[i+1] + ckt->CKTdeltaOld[i]; } } switch(ckt->CKTintegrateMethod) { case GEAR: factor = gearCoeff[ckt->CKTorder-1]; break; case TRAPEZOIDAL: factor = trapCoeff[ckt->CKTorder - 1] ; break; } del = ckt->CKTtrtol * tol/MAX(ckt->CKTabstol,factor * fabs(diff[0])); if(ckt->CKTorder == 2) { del = sqrt(del); } else if (ckt->CKTorder > 2) { del = exp(log(del)/ckt->CKTorder); } *timeStep = MIN(*timeStep,del); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -