Jspice3
cktterr.c File Reference
#include "spice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "util.h"
#include "cktext.h"
Include dependency graph for cktterr.c:

Go to the source code of this file.

Macros

#define ccap   (qcap+1)
 

Functions

void CKTterr (int qcap, CKTcircuit *ckt, double *timeStep)
 

Macro Definition Documentation

#define ccap   (qcap+1)

Definition at line 14 of file cktterr.c.

Function Documentation

void CKTterr ( int  qcap,
CKTcircuit ckt,
double *  timeStep 
)

Definition at line 18 of file cktterr.c.

23 {
24  double volttol;
25  double chargetol;
26  double tol;
27  double del;
28  double y0,y1,y2,y3;
29  double *dd = ckt->CKTsols[0];
30  int i;
31  int j;
32  static double gearCoeff[] = {
33  .5,
34  .2222222222,
35  .1363636364,
36  .096,
37  .07299270073,
38  .05830903790
39  };
40 
41  y0 = *(ckt->CKTstate0 + ccap);
42  y1 = *(ckt->CKTstate1 + ccap);
43  if (y0 < 0) y0 = -y0;
44  if (y1 < 0) y1 = -y1;
45  volttol = ckt->CKTabstol + ckt->CKTreltol*MAX(y0,y1);
46 
47  y0 = *(ckt->CKTstate0 + qcap);
48  y1 = *(ckt->CKTstate1 + qcap);
49  if (y0 < 0) y0 = -y0;
50  if (y1 < 0) y1 = -y1;
51  chargetol = MAX(y0,y1);
52  if (chargetol < ckt->CKTchgtol)
53  chargetol = ckt->CKTchgtol;
54  chargetol *= dd[5]; /* reltol/delta */
55 
56  tol = MAX(volttol,chargetol);
57 
58  if (ckt->CKTintegrateMethod == TRAPEZOIDAL) {
59 
60  if (ckt->CKTorder == 1) {
61  y0 = *(ckt->CKTstate0 + qcap);
62  y1 = *(ckt->CKTstate1 + qcap);
63  y2 = *(ckt->CKTstate2 + qcap);
64  del = (y0-y1)*dd[0] - (y1-y2)*dd[1];
65  }
66  else {
67  y0 = *(ckt->CKTstate0 + qcap);
68  y1 = *(ckt->CKTstate1 + qcap);
69  y2 = *(ckt->CKTstate2 + qcap);
70  y3 = *(ckt->CKTstate3 + qcap);
71  del = (y0-y1)*dd[0] - (y1-y2)*dd[1] + (y2-y3)*dd[2];
72  }
73  }
74  else {
75  double diff[8];
76  double deltmp[8];
77 
78  /* now divided differences */
79  for (i = ckt->CKTorder + 1; i >= 0; i--) {
80  diff[i] = *(ckt->CKTstates[i] + qcap);
81  }
82  for (i = 0; i <= ckt->CKTorder; i++) {
83  deltmp[i] = ckt->CKTdeltaOld[i];
84  }
85  j = ckt->CKTorder;
86  for (;;) {
87  for (i = 0; i <= j; i++) {
88  diff[i] = (diff[i] - diff[i+1])/deltmp[i];
89  }
90  if (--j < 0) break;
91  for (i = 0; i <= j; i++) {
92  deltmp[i] = deltmp[i+1] + ckt->CKTdeltaOld[i];
93  }
94  }
95  del = diff[0]*gearCoeff[ckt->CKTorder-1];
96  }
97  if (del < 0) del = -del;
98  del = ckt->CKTtrtol*tol/MAX(ckt->CKTabstol,del);
99 
100  /* normalization now done in CKTtrunc() */
101  /*
102  if (ckt->CKTorder == 2) {
103  del = sqrt(del);
104  }
105  else if (ckt->CKTorder > 2) {
106  del = exp(log(del)/ckt->CKTorder);
107  }
108  */
109 
110  if (del < *timeStep)
111  *timeStep = del;
112  return;
113 }
#define MAX(a, b)
Definition: spdefs.h:135
#define ccap
Definition: cktterr.c:14
#define TRAPEZOIDAL
Definition: cktdefs.h:92
double CKTreltol
Definition: cktdefs.h:183
int CKTorder
Definition: cktdefs.h:87
double CKTabstol
Definition: cktdefs.h:180
double * CKTstates[8]
Definition: cktdefs.h:68
double CKTchgtol
Definition: cktdefs.h:184
double CKTtrtol
Definition: cktdefs.h:192
double CKTdeltaOld[7]
Definition: cktdefs.h:79
double * CKTsols[8]
Definition: cktdefs.h:106
int CKTintegrateMethod
Definition: cktdefs.h:89