You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

79 lines
1.9 KiB

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#define ccap (qcap+1)
void
CKTterr(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;
}