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

Go to the source code of this file.

Functions

int TRAaccept (CKTcircuit *ckt, GENmodel *inModel)
 

Function Documentation

int TRAaccept ( CKTcircuit ckt,
GENmodel inModel 
)

Definition at line 15 of file traacct.c.

19 {
20  TRAmodel *model = (TRAmodel *)inModel;
21  TRAinstance *here;
22  int i=0,j;
23  double v1,v2,v3,v4;
24  double v5,v6,d1,d2,d3,d4;
25  double *from,*to;
26  int error;
27 
28 
29  /* loop through all the transmission line models */
30  for( ; model != NULL; model = model->TRAnextModel ) {
31 
32  /* loop through all the instances of the model */
33  for (here = model->TRAinstances; here != NULL ;
34  here=here->TRAnextInstance) {
35  if( (ckt->CKTtime - here->TRAtd) > *(here->TRAdelays+6)) {
36  /* shift! */
37  for(i=2;i<here->TRAsizeDelay &&
38  (ckt->CKTtime - here->TRAtd > *(here->TRAdelays+3*i));i++)
39  { /* loop does it all */ ; }
40  i -= 2;
41  for(j=i;j<=here->TRAsizeDelay;j++) {
42  from = here->TRAdelays + 3*j;
43  to = here->TRAdelays + 3*(j-i);
44  *(to) = *(from);
45  *(to+1) = *(from+1);
46  *(to+2) = *(from+2);
47  }
48  here->TRAsizeDelay -= i;
49  }
50  if(ckt->CKTtime - *(here->TRAdelays+3*here->TRAsizeDelay) >
51  ckt->CKTminBreak) {
52  if(here->TRAallocDelay <= here->TRAsizeDelay) {
53  /* need to grab some more space */
54  here->TRAallocDelay += 5;
55  here->TRAdelays = (double *)REALLOC((char *)here->TRAdelays,
56  (here->TRAallocDelay+1)*3*sizeof(double));
57  }
58  here->TRAsizeDelay ++;
59  to = (here->TRAdelays +3*here->TRAsizeDelay);
60  *to = ckt->CKTtime;
61  to = (here->TRAdelays+1+3*here->TRAsizeDelay);
62  *to = ( *(ckt->CKTrhsOld + here->TRAposNode2)
63  -*(ckt->CKTrhsOld + here->TRAnegNode2))
64  + *(ckt->CKTrhsOld + here->TRAbrEq2)*
65  here->TRAimped;
66  *(here->TRAdelays+2+3*here->TRAsizeDelay) =
67  ( *(ckt->CKTrhsOld + here->TRAposNode1)
68  -*(ckt->CKTrhsOld + here->TRAnegNode1))
69  + *(ckt->CKTrhsOld + here->TRAbrEq1)*
70  here->TRAimped;
71 #ifdef NOTDEF
72  v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay);
73  v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1));
74  v3 = *(here->TRAdelays+2+3*here->TRAsizeDelay);
75  v4 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1));
76  if( (FABS(v1-v2) >= 50*ckt->CKTreltol*
77  MAX(FABS(v1),FABS(v2))+50*ckt->CKTvoltTol) ||
78  (FABS(v3-v4) >= 50*ckt->CKTreltol*
79  MAX(FABS(v3),FABS(v4))+50*ckt->CKTvoltTol) ) {
80  /* changing - need to schedule after delay */
81  /*printf("%s: at %g set for %g and %g\n",here->TRAname,
82  ckt->CKTtime,
83  ckt->CKTtime+here->TRAtd,
84  *(here->TRAdelays+3*here->TRAsizeDelay-3)+
85  here->TRAtd);*/
86  error = CKTsetBreak(ckt,ckt->CKTtime+here->TRAtd);
87  if(error) return(error);
88  /* also set for break after PREVIOUS point */
89  error = CKTsetBreak(ckt,
90  *(here->TRAdelays+3*here->TRAsizeDelay -3) +
91  here->TRAtd);
92  CKTbreakDump(ckt);
93  if(error) return(error);
94  }
95 #else
96  v1 = *(here->TRAdelays+1+3*here->TRAsizeDelay);
97  v2 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-1));
98  v3 = *(here->TRAdelays+1+3*(here->TRAsizeDelay-2));
99  v4 = *(here->TRAdelays+2+3*here->TRAsizeDelay);
100  v5 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-1));
101  v6 = *(here->TRAdelays+2+3*(here->TRAsizeDelay-2));
102  d1 = (v1-v2)/ckt->CKTdeltaOld[0];
103  d2 = (v2-v3)/ckt->CKTdeltaOld[1];
104  d3 = (v4-v5)/ckt->CKTdeltaOld[0];
105  d4 = (v5-v6)/ckt->CKTdeltaOld[1];
106  /*printf("%s: at %g derivs are %g, %g and %g, %g\n",
107  here->TRAname,ckt->CKTtime,d1,d2,d3,d4);*/
108  if( (FABS(d1-d2) >= here->TRAreltol*MAX(FABS(d1),FABS(d2))+
109  here->TRAabstol) ||
110  (FABS(d3-d4) >= here->TRAreltol*MAX(FABS(d3),FABS(d4))+
111  here->TRAabstol) ) {
112  /* derivitive changing - need to schedule after delay */
113  /*printf("%s: at %g set for %g\n",here->TRAname,
114  ckt->CKTtime,
115  *(here->TRAdelays+3*here->TRAsizeDelay-3)+here->TRAtd
116  );*/
117  /*printf("%g, %g, %g -> %g, %g \n",v1,v2,v3,d1,d2);*/
118  /*printf("%g, %g, %g -> %g, %g \n",v4,v5,v6,d3,d4);*/
119  /* also set for break after PREVIOUS point */
120  /*printf("setting break\n");*/
121  error = CKTsetBreak(ckt,
122  *(here->TRAdelays+3*here->TRAsizeDelay -3) +
123  here->TRAtd);
124  if(error) return(error);
125  }
126 #endif /*NOTDEF*/
127  }
128  }
129  }
130  return(OK);
131 }
double CKTtime
Definition: cktdefs.h:77
struct sTRAinstance * TRAnextInstance
Definition: tradefs.h:20
TRAinstance * TRAinstances
Definition: tradefs.h:89
int TRAallocDelay
Definition: tradefs.h:45
int TRAbrEq1
Definition: tradefs.h:46
struct sTRAmodel * TRAnextModel
Definition: tradefs.h:87
double CKTminBreak
Definition: cktdefs.h:178
double TRAimped
Definition: tradefs.h:30
#define MAX(a, b)
Definition: spdefs.h:135
double TRAtd
Definition: tradefs.h:32
int TRAsizeDelay
Definition: tradefs.h:44
double CKTreltol
Definition: cktdefs.h:183
int TRAnegNode1
Definition: tradefs.h:25
int TRAposNode1
Definition: tradefs.h:24
double TRAreltol
Definition: tradefs.h:41
int CKTsetBreak()
#define OK
Definition: iferrmsg.h:17
double * CKTrhsOld
Definition: cktdefs.h:98
int TRAnegNode2
Definition: tradefs.h:27
#define NULL
Definition: spdefs.h:121
void CKTbreakDump()
double TRAabstol
Definition: tradefs.h:42
static char model[32]
Definition: subckt.c:76
#define FABS(a)
Definition: util.h:41
#define REALLOC(ptr, type, number)
Definition: spdefs.h:434
double CKTvoltTol
Definition: cktdefs.h:185
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