Jspice3
dcoan.c File Reference
#include "spice.h"
#include <stdio.h>
#include "devdefs.h"
#include "tskdefs.h"
#include "dcodefs.h"
#include "sperror.h"
#include "outdata.h"
#include "util.h"
#include "cktext.h"
Include dependency graph for dcoan.c:

Go to the source code of this file.

Functions

int DCOan (GENERIC *cktp, int restart)
 
int CKTop (CKTcircuit *ckt, long firstmode, long continuemode, int iterlim)
 
int CKTconvTest (CKTcircuit *ckt)
 

Function Documentation

int CKTconvTest ( CKTcircuit ckt)

Definition at line 177 of file dcoan.c.

180 {
181  extern SPICEdev *DEVices[];
182  int error;
183  struct sCKTmodHead *mh;
184  int (*func)();
185 
186  for (mh = ckt->CKTheadList; mh != NULL; mh = mh->next) {
187  if ((func = DEVices[mh->type]->DEVconvTest) != NULL) {
188  error = (*func)(mh->head,ckt);
189  if (error) return (error);
190  }
191  if (ckt->CKTnoncon) {
192  /*
193  printf("convTest: device %s failed\n",
194  (*DEVices[mh->type]).DEVpublic.name);
195  */
196  return (OK);
197  }
198  }
199  return (OK);
200 }
struct sCKTmodHead * next
Definition: cktdefs.h:58
SPICEdev * DEVices[]
Definition: sconfig.c:109
int(* DEVconvTest)()
Definition: devdefs.h:107
#define OK
Definition: iferrmsg.h:17
struct sCKTmodHead * CKTheadList
Definition: cktdefs.h:63
#define NULL
Definition: spdefs.h:121
Definition: fteparse.h:37
int type
Definition: cktdefs.h:56
GENmodel * head
Definition: cktdefs.h:57
int CKTnoncon
Definition: cktdefs.h:203
int CKTop ( CKTcircuit ckt,
long  firstmode,
long  continuemode,
int  iterlim 
)

Definition at line 76 of file dcoan.c.

82 {
83  int converged;
84  int i;
85 
86  ckt->CKTmode = firstmode;
87  if (!ckt->CKTnoOpIter) {
88  converged = NIiter(ckt,iterlim);
89  }
90  else {
91  converged = 1; /* the 'go directly to gmin stepping' option */
92  }
93  if (converged != 0) {
94  /* no convergence on the first try, so we do something else */
95  /* first, check if we should try gmin stepping */
96  /* note that no path out of this code allows ckt->CKTdiagGmin to be
97  * anything but 0.000000000
98  */
99  if (ckt->CKTnumGminSteps >1) {
100  ckt->CKTmode = firstmode;
101  (*(SPfrontEnd->IFerror))(ERR_INFO,
102  "starting Gmin stepping",(IFuid *)NULL);
103  ckt->CKTdiagGmin = ckt->CKTgmin;
104  for (i = 0; i < ckt->CKTnumGminSteps; i++) {
105  ckt->CKTdiagGmin *= 10;
106  }
107  for (i = 0; i <= ckt->CKTnumGminSteps; i++) {
108  ckt->CKTnoncon = 1;
109  converged = NIiter(ckt,iterlim);
110  if (converged != 0) {
111  ckt->CKTdiagGmin = 0;
112  (*(SPfrontEnd->IFerror))(ERR_WARNING,
113  "Gmin step failed",(IFuid *)NULL);
114  break;
115  }
116  ckt->CKTdiagGmin /= 10;
117  ckt->CKTmode=continuemode;
118  (*(SPfrontEnd->IFerror))(ERR_INFO,
119  "One sucessful Gmin step",(IFuid *)NULL);
120  }
121  ckt->CKTdiagGmin = 0;
122  converged = NIiter(ckt,iterlim);
123  if (converged == 0) {
124  (*(SPfrontEnd->IFerror))(ERR_INFO,
125  "Gmin stepping completed",(IFuid *)NULL);
126  return (0);
127  }
128  (*(SPfrontEnd->IFerror))(ERR_WARNING,
129  "Gmin stepping failed",(IFuid *)NULL);
130 
131  }
132  /* now, we'll try source stepping - we scale the sources
133  * to 0, converge, then start stepping them up until they
134  * are at their normal values
135  *
136  * note that no path out of this code allows ckt->CKTsrcFact to be
137  * anything but 1.000000000
138  */
139  if (ckt->CKTnumSrcSteps > 1) {
140  ckt->CKTmode = firstmode;
141  (*(SPfrontEnd->IFerror))(ERR_INFO,
142  "starting source stepping",(IFuid *)NULL);
143  for (i = 0; i <= ckt->CKTnumSrcSteps; i++) {
144  ckt->CKTsrcFact = ((double)i)/((double)ckt->CKTnumSrcSteps);
145  converged = NIiter(ckt,iterlim);
146  ckt->CKTmode = continuemode;
147  if (converged != 0) {
148  ckt->CKTsrcFact = 1;
150  (*(SPfrontEnd->IFerror))(ERR_WARNING,
151  "source stepping failed",(IFuid *)NULL);
152  return (converged);
153  }
154  (*(SPfrontEnd->IFerror))(ERR_INFO,
155  "One successful source step",(IFuid *)NULL);
156  }
157  (*(SPfrontEnd->IFerror))(ERR_INFO,
158  "Source stepping completed",(IFuid *)NULL);
159  ckt->CKTsrcFact = 1;
160  return (0);
161  }
162  else {
163  return (converged);
164  }
165  }
166  return (0);
167 }
int CKTnumSrcSteps
Definition: cktdefs.h:201
int NIiter()
double CKTdiagGmin
Definition: cktdefs.h:200
int CKTnumGminSteps
Definition: cktdefs.h:202
IFfrontEnd * SPfrontEnd
Definition: main.c:917
double CKTsrcFact
Definition: cktdefs.h:199
#define ERR_INFO
Definition: ifsim.h:520
GENERIC * IFuid
Definition: ifsim.h:72
#define NULL
Definition: spdefs.h:121
#define ERR_WARNING
Definition: ifsim.h:517
#define DOING_TRAN
Definition: tskdefs.h:25
unsigned int CKTnoOpIter
Definition: cktdefs.h:211
double CKTgmin
Definition: cktdefs.h:190
int CKTcurrentAnalysis
Definition: cktdefs.h:130
int CKTnoncon
Definition: cktdefs.h:203
long CKTmode
Definition: cktdefs.h:139
int DCOan ( GENERIC cktp,
int  restart 
)

Definition at line 21 of file dcoan.c.

25 {
26  CKTcircuit *ckt = (CKTcircuit *)cktp;
27  struct sOUTdata outd;
28  int converged;
29  int error;
30  GENERIC *plot;
31 
32  if (ckt->CKTjjPresent) {
33  (*(SPfrontEnd->IFerror))(ERR_FATAL,
34  "DC analysis not possible with Josephson junctions", NULL);
35  return (OK);
36  }
37  error = CKTnames(ckt,&outd.numNames,&outd.dataNames);
38  if (error)
39  return (error);
40 
41  outd.circuitPtr = (GENERIC *)ckt;
42  outd.analysisPtr = (GENERIC*)ckt->CKTcurJob;
43  outd.analName = ckt->CKTcurJob->JOBname;
44  outd.refName = (IFuid)NULL;
45  outd.refType = IF_REAL;
46  outd.dataType = IF_REAL;
47  outd.plotPtr = &plot;
48  outd.numPts = 1;
49  outd.initValue = 0;
50  outd.finalValue = 0;
51  outd.step = 0;
52  (*(SPfrontEnd->OUTbeginPlot))((GENERIC*)&outd);
53 
54  error = CKTic(ckt);
55  if (error)
56  return (error);
57 
58  converged = CKTop(ckt,
61  ckt->CKTdcMaxIter);
62 
63  if (converged != 0)
64  return (converged);
65 
67  converged = CKTload(ckt);
68  CKTdump(ckt,(double)0,plot);
69  (*(SPfrontEnd->OUTendPlot))(plot);
70 
71  return (converged);
72 }
IFuid JOBname
Definition: cktdefs.h:26
int CKTnames()
#define MODEINITFLOAT
Definition: cktdefs.h:156
#define ERR_FATAL
Definition: ifsim.h:518
IFfrontEnd * SPfrontEnd
Definition: main.c:917
Definition: ftedata.h:61
#define OK
Definition: iferrmsg.h:17
GENERIC * IFuid
Definition: ifsim.h:72
int CKTop(CKTcircuit *ckt, long firstmode, long continuemode, int iterlim)
Definition: dcoan.c:76
#define NULL
Definition: spdefs.h:121
#define MODEINITSMSIG
Definition: cktdefs.h:159
int CKTjjPresent
Definition: cktdefs.h:168
int CKTload()
int CKTic()
#define IF_REAL
Definition: ifsim.h:108
void CKTdump()
#define MODEDCOP
Definition: cktdefs.h:150
JOB * CKTcurJob
Definition: cktdefs.h:216
long CKTmode
Definition: cktdefs.h:139
#define MODEINITJCT
Definition: cktdefs.h:157
int CKTdcMaxIter
Definition: cktdefs.h:171
char GENERIC
Definition: ifsim.h:27