Jspice3
tratrunc.c File Reference
#include "spice.h"
#include <stdio.h>
#include "tradefs.h"
#include "sperror.h"
#include "util.h"
Include dependency graph for tratrunc.c:

Go to the source code of this file.

Functions

int TRAtrunc (GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
 

Function Documentation

int TRAtrunc ( GENmodel inModel,
CKTcircuit ckt,
double *  timeStep 
)

Definition at line 14 of file tratrunc.c.

19 {
20  TRAmodel *model = (TRAmodel *)inModel;
21  TRAinstance *here;
22  double v1,v2,v3,v4;
23  double v5,v6,d1,d2,d3,d4;
24  double tmp, time_step;
25  int i;
26 
27  /* in jspice3, the timeStep passed to the trunc functions is
28  * not normalized to integration order, which saves having to
29  * call an expensive math operation at each CKTterr() call.
30  * We have to undo this here.
31  */
32  if (ckt->CKTorder == 1)
33  time_step = *timeStep;
34  else if (ckt->CKTorder == 2)
35  time_step = sqrt(*timeStep);
36  else
37  time_step = exp(log(*timeStep)/ckt->CKTorder);
38 
39  /* loop through all the transmission line models */
40  for( ; model != NULL; model = model->TRAnextModel ) {
41 
42  /* loop through all the instances of the model */
43  for (here = model->TRAinstances; here != NULL ;
44  here=here->TRAnextInstance) {
45  v1 = ( *(ckt->CKTrhsOld + here->TRAposNode2)
46  - *(ckt->CKTrhsOld + here->TRAnegNode2))
47  + *(ckt->CKTrhsOld + here->TRAbrEq2) *
48  here->TRAimped;
49  v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay));
50  v3 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1));
51  v4 = ( *(ckt->CKTrhsOld + here->TRAposNode1)
52  - *(ckt->CKTrhsOld + here->TRAnegNode1))
53  + *(ckt->CKTrhsOld + here->TRAbrEq1) *
54  here->TRAimped;
55  v5 = *(here->TRAdelays+2+3*(here->TRAsizeDelay));
56  v6 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1));
57  d1 = (v1-v2)/ckt->CKTdeltaOld[1];
58  d2 = (v2-v3)/ckt->CKTdeltaOld[2];
59  d3 = (v4-v5)/ckt->CKTdeltaOld[1];
60  d4 = (v5-v6)/ckt->CKTdeltaOld[2];
61  time_step = MIN(time_step, .9*here->TRAtd);
62  /*printf("%s: at %g derivs are %g, %g and %g, %g\n",
63  here->TRAname,ckt->CKTtime,d1,d2,d3,d4);*/
64  if( (FABS(d1-d2) >= here->TRAreltol*MAX(FABS(d1),FABS(d2))+
65  here->TRAabstol) ||
66  (FABS(d3-d4) >= here->TRAreltol*MAX(FABS(d3),FABS(d4))+
67  here->TRAabstol) ) {
68  /* derivitive changing - need to schedule after delay */
69  /*printf("%s: at %g set for %g\n",here->TRAname,
70  ckt->CKTtime,
71  *(here->TRAdelays+3*here->TRAsizeDelay-3)+here->TRAtd
72  );*/
73  /*printf("%g, %g, %g -> %g, %g \n",v1,v2,v3,d1,d2);*/
74  /*printf("%g, %g, %g -> %g, %g \n",v4,v5,v6,d3,d4);*/
75  /* also set for break after PREVIOUS point */
76  /*printf("setting break\n");*/
77  /* will need to set a breakpoint at
78  *(here->TRAdelays+3*(here->TRAsizeDelay)) + here->TRAtd
79  so we need to make sure we don't step past it
80  */
81  /* the previous timepoint plus the delay */
82  tmp = *(here->TRAdelays+3*here->TRAsizeDelay) + here->TRAtd;
83  /* minus current time */
84  tmp -= ckt->CKTtime;
85  time_step = MIN(time_step, tmp);
86  }
87  }
88  }
89  tmp = time_step;
90  for (i = ckt->CKTorder - 1; i > 0; i--)
91  tmp *= time_step;
92  *timeStep = tmp;
93  return(OK);
94 }
double CKTtime
Definition: cktdefs.h:77
struct sTRAinstance * TRAnextInstance
Definition: tradefs.h:20
TRAinstance * TRAinstances
Definition: tradefs.h:89
int TRAbrEq1
Definition: tradefs.h:46
struct sTRAmodel * TRAnextModel
Definition: tradefs.h:87
double TRAimped
Definition: tradefs.h:30
#define MAX(a, b)
Definition: spdefs.h:135
#define MIN(a, b)
Definition: spdefs.h:136
double TRAtd
Definition: tradefs.h:32
int TRAsizeDelay
Definition: tradefs.h:44
int TRAnegNode1
Definition: tradefs.h:25
int TRAposNode1
Definition: tradefs.h:24
double TRAreltol
Definition: tradefs.h:41
int CKTorder
Definition: cktdefs.h:87
#define OK
Definition: iferrmsg.h:17
double * CKTrhsOld
Definition: cktdefs.h:98
int TRAnegNode2
Definition: tradefs.h:27
#define NULL
Definition: spdefs.h:121
double TRAabstol
Definition: tradefs.h:42
static char model[32]
Definition: subckt.c:76
#define FABS(a)
Definition: util.h:41
double CKTdeltaOld[7]
Definition: cktdefs.h:79
double * TRAdelays
Definition: tradefs.h:43
int TRAbrEq2
Definition: tradefs.h:47
int TRAposNode2
Definition: tradefs.h:26