Jspice3
niinteg.c
Go to the documentation of this file.
1 /***************************************************************************
2 JSPICE3 adaptation of Spice3e2 - Copyright (c) Stephen R. Whiteley 1992
3 Copyright 1990 Regents of the University of California. All rights reserved.
4 Authors: 1985 Thomas L. Quarles
5  1992 Stephen R. Whiteley
6 ****************************************************************************/
7 
8  /* NIintegrate(ckt,geq,ceq,cap,qcap)
9  * integrate the specified capacitor - method and order in the
10  * ckt structure, ccap follows qcap.
11  */
12 
13 #include "spice.h"
14 #include <stdio.h>
15 #include "cktdefs.h"
16 #include "sperror.h"
17 #include "util.h"
18 #include "niext.h"
19 
20 #define ccap qcap+1
21 
22 int
23 NIintegrate(ckt,geq,ceq,cap,qcap)
24 
25 CKTcircuit *ckt;
26 double *geq;
27 double *ceq;
28 double cap;
29 int qcap;
30 {
31  int error;
32 
33  error = NIsum(ckt,ceq,qcap);
34  if (error != OK)
35  return (error);
36 
37  *(ckt->CKTstate0 + ccap) =
38  ckt->CKTag[0] * *(ckt->CKTstate0 + qcap) + *ceq;
39 
40  *geq = ckt->CKTag[0] * cap;
41  return(OK);
42 }
43 
44 
45 int
46 NIsum(ckt,ceq,qcap)
47 
48 /* For linear inductors and capacitors, one can call this when
49  * mode is MODEINITTRAN or MODEINITPRED, and save ceq, avoiding
50  * the repeated and redundant calls to NIintegrate(). An accept
51  * function can then finish the integration - see INDaccept().
52  */
53 
54 CKTcircuit *ckt;
55 double *ceq;
56 int qcap;
57 {
58  static char *ordmsg = "Illegal integration order";
59  static char *methodmsg = "Unknown integration method";
60  double cq = 0;
61 
62  switch (ckt->CKTintegrateMethod) {
63 
64  case TRAPEZOIDAL:
65  switch (ckt->CKTorder) {
66  case 1:
67  cq = ckt->CKTag[1] * (*(ckt->CKTstate1+qcap));
68  break;
69  case 2:
70  cq = - *(ckt->CKTstate1+ccap) * ckt->CKTag[1] -
71  ckt->CKTag[0] * *(ckt->CKTstate1+qcap);
72  break;
73  default:
74  errMsg = MALLOC(strlen(ordmsg)+1);
75  strcpy(errMsg,ordmsg);
76  return (E_ORDER);
77  }
78  break;
79 
80  case GEAR:
81  switch (ckt->CKTorder) {
82 
83  case 6:
84  cq += ckt->CKTag[6]* *(ckt->CKTstate6+qcap);
85  /* fall through */
86  case 5:
87  cq += ckt->CKTag[5]* *(ckt->CKTstate5+qcap);
88  /* fall through */
89  case 4:
90  cq += ckt->CKTag[4]* *(ckt->CKTstate4+qcap);
91  /* fall through */
92  case 3:
93  cq += ckt->CKTag[3]* *(ckt->CKTstate3+qcap);
94  /* fall through */
95  case 2:
96  cq += ckt->CKTag[2]* *(ckt->CKTstate2+qcap);
97  /* fall through */
98  case 1:
99  cq += ckt->CKTag[1]* *(ckt->CKTstate1+qcap);
100  break;
101 
102  default:
103  errMsg = MALLOC(strlen(ordmsg)+1);
104  strcpy(errMsg,ordmsg);
105  return (E_ORDER);
106 
107  }
108  break;
109 
110  default:
111  errMsg = MALLOC(strlen(methodmsg)+1);
112  strcpy(errMsg,methodmsg);
113  return (E_METHOD);
114  }
115  *ceq = cq;
116 
117  return (OK);
118 }
#define E_ORDER
Definition: sperror.h:19
char * strcpy()
#define TRAPEZOIDAL
Definition: cktdefs.h:92
char * errMsg
Definition: main.c:42
#define OK
Definition: iferrmsg.h:17
#define GEAR
Definition: cktdefs.h:93
#define MALLOC(x)
Definition: util.h:9
int NIintegrate(CKTcircuit *ckt, double *geq, double *ceq, double cap, int qcap)
Definition: niinteg.c:23
int NIsum(CKTcircuit *ckt, double *ceq, int qcap)
Definition: niinteg.c:46
#define ccap
Definition: niinteg.c:20
#define E_METHOD
Definition: sperror.h:20