57 tran->startTime = (*(
SPfrontEnd->IFseconds))();
63 WARNmsg(
"Using initial conditions");
91 tran->nointerp =
false;
92 tran->hitusertp =
false;
97 if (job->
DC.
eltName[0] && tran->nointerp) {
99 "Note: DCsource given, \"set nousertp\" ignored.");
100 tran->nointerp =
false;
102 if (tran->nointerp && tran->hitusertp) {
104 "Note: nousertp set, \"set hitusertp\" ignored.");
105 tran->hitusertp =
false;
109 tran->nojjtp =
false;
128 "DCtrCurv: source %s not in circuit",
136 error =
CKTnames(ckt,&outd.numNames,&outd.dataNames);
149 outd.circuitPtr = (
GENERIC *)ckt;
161 FREE(outd.dataNames);
163 tran->startIters = stat->STATnumIter;
164 tran->startdTime = stat->STATdecompTime;
165 tran->startsTime = stat->STATsolveTime;
177 tran->startTime += (*(
SPfrontEnd->IFseconds))() - tt0;
196 bool afterpause =
false;
197 int i, error = 0,
type;
199 afterpause = !restart;
208 FREE(ckt->CKTbreaks);
209 ckt->CKTbreaks = (
double *)
MALLOC(2*
sizeof(
double));
212 *(ckt->CKTbreaks) = 0;
213 *(ckt->CKTbreaks + 1) = ckt->CKTfinalTime;
214 ckt->CKTbreakSize = 2;
224 (here->
SRCtree,ckt->CKTstep,ckt->CKTfinalTime);
229 tran->dumpit =
false;
231 tran->tcheck = (ckt->CKTinitTime || !tran->nointerp) ?
232 ckt->CKTinitTime : ckt->CKTfinalTime;
234 tran->firsttime =
true;
241 if (!(ckt->CKTmode &
MODEUIC)) {
253 ckt->CKTrhs = ckt->CKTrhsOld;
254 ckt->CKTrhsOld = temp;
264 if (ckt->CKTinitDelta > 0)
265 ckt->CKTdelta = ckt->CKTinitDelta;
267 ckt->CKTdelta = .1 *
MIN(tran->delmax,ckt->CKTstep);
269 for (i = 0; i < 7; i++) {
270 ckt->CKTdeltaOld[i] = tran->delmax;
272 ckt->CKTdeltaOld[0] = ckt->CKTdelta;
273 ckt->CKTsaveDelta = ckt->CKTdelta;
277 ckt->CKTag[0] = ckt->CKTag[1] = 0;
278 bcopy((
char *)ckt->CKTstate0,(
char *)ckt->CKTstate1,
279 ckt->CKTnumStates*
sizeof(
double));
281 if (ckt->CKTtime >= ckt->CKTinitTime)
284 tran->tend = ckt->CKTfinalTime - ckt->CKTminBreak;
288 error =
tran_accept(ckt,tran,stat,outd,&done,&afterpause);
289 if (error || done)
break;
292 if (ckt->CKTdelta > tran->delmax) ckt->CKTdelta = tran->delmax;
296 for (i = 5; i >= 0; i--) {
297 ckt->CKTdeltaOld[i+1] = ckt->CKTdeltaOld[i];
299 ckt->CKTdeltaOld[0] = ckt->CKTdelta;
302 temp = ckt->CKTstates[ckt->CKTmaxOrder+1];
303 for (i = ckt->CKTmaxOrder; i >= 0; i--) {
304 ckt->CKTstates[i+1] = ckt->CKTstates[i];
306 ckt->CKTstates[0] = temp;
344 if ((ckt->CKTtime == *(ckt->CKTbreaks)) || (*(ckt->CKTbreaks) -
345 (ckt->CKTtime) <= ckt->CKTdelmin)) {
352 ttmp = *(ckt->CKTbreaks+1) - *(ckt->CKTbreaks);
353 if (ckt->CKTsaveDelta < ttmp)
354 ttmp = ckt->CKTsaveDelta;
356 if (ttmp < ckt->CKTdelta)
357 ckt->CKTdelta = ttmp;
360 ckt->CKTdelta *= 0.1;
364 ttmp = 2.0*ckt->CKTdelmin;
365 if (ckt->CKTdelta < ttmp)
366 ckt->CKTdelta = ttmp;
368 else if (ckt->CKTtime + ckt->CKTdelta >= *(ckt->CKTbreaks)) {
369 ckt->CKTsaveDelta = ckt->CKTdelta;
370 ckt->CKTdelta = *(ckt->CKTbreaks) - ckt->CKTtime;
376 if (ckt->CKTtime + ckt->CKTdelta >= tran->
tcheck) {
377 if (ckt->CKTtime < tran->
tcheck) {
378 ckt->CKTsaveDelta = ckt->CKTdelta;
379 ckt->CKTdelta = tran->
tcheck - ckt->CKTtime;
382 tran->
tcheck += ckt->CKTstep;
384 tran->
tcheck = ckt->CKTfinalTime;
397 bool *done, *afterpause;
415 if (ckt->CKTtime > *(ckt->CKTbreaks))
CKTclrBreak(ckt);
434 if (ckt->CKTtime >= tran->
tend)
451 ckt->CKTcurrentAnalysis = 0;
472 double olddelta,
new;
473 int i, error, converged;
477 olddelta = ckt->CKTdelta;
478 ckt->CKTtime += ckt->CKTdelta;
479 ckt->CKTdeltaOld[0] = ckt->CKTdelta;
484 converged =
NIiter(ckt,ckt->CKTtranMaxIter);
490 for (i = 0; i < ckt->CKTnumStates; i++) {
491 *(ckt->CKTstate2+i) = *(ckt->CKTstate1+i);
492 *(ckt->CKTstate3+i) = *(ckt->CKTstate1+i);
495 if (converged != 0) {
496 ckt->CKTtime -= ckt->CKTdelta;
498 ckt->CKTdelta *= 0.125;
515 if (ckt->CKTorder > ckt->CKTmaxOrder)
516 ckt->CKTorder = ckt->CKTmaxOrder;
529 if (
new > .5*ckt->CKTdelta) {
530 if (ckt->CKTorder == 1) {
538 if (new <= 1.05*ckt->CKTdelta) {
550 ckt->CKTtime -= ckt->CKTdelta;
555 if (ckt->CKTdelta <= ckt->CKTdelmin) {
556 if (olddelta > ckt->CKTdelmin) {
557 ckt->CKTdelta = ckt->CKTdelmin;
585 double d1,d2,d3,d4,diff[4];
587 double finalmax,finalmin;
600 delta = .5*ckt->CKTdelmin;
601 finalmax = ckt->CKTfinalTime + delta;
602 finalmin = ckt->CKTfinalTime - delta;
603 time = ckt->CKTtime + delta;
607 c2 = ckt->CKTdeltaOld[0];
609 for (; tran->
tcheck <= time; tran->
tcheck += ckt->CKTstep) {
613 d1 = ckt->CKTtime - tran->
tcheck;
620 for (i = 1; i <= size; i++) {
622 diff[0]*ckt->CKTsols[0][i] +
623 diff[1]*ckt->CKTsols[1][i];
625 if (tran->
tcheck < finalmax) {
626 temp = ckt->CKTrhsOld;
627 ckt->CKTrhsOld = ckt->CKTrhs;
629 ckt->CKTrhsOld = temp;
631 if (finalmin < tran->tcheck)
640 c2 = ckt->CKTdeltaOld[0];
641 c3 = c2 + ckt->CKTdeltaOld[1];
643 for (; tran->
tcheck <= time; tran->
tcheck += ckt->CKTstep) {
647 d1 = ckt->CKTtime - tran->
tcheck;
652 diff[0] = d2*d3/((c2)*(c3));
653 diff[1] = d1*d3/((c2)*(c2-c3));
654 diff[2] = d1*d2/((c3)*(c3-c2));
656 for (i = 1; i <= size; i++) {
658 diff[0]*ckt->CKTsols[0][i] +
659 diff[1]*ckt->CKTsols[1][i] +
660 diff[2]*ckt->CKTsols[2][i];
662 if (tran->
tcheck < finalmax) {
663 temp = ckt->CKTrhsOld;
664 ckt->CKTrhsOld = ckt->CKTrhs;
666 ckt->CKTrhsOld = temp;
668 if (finalmin < tran->tcheck)
677 c2 = ckt->CKTdeltaOld[0];
678 c3 = c2 + ckt->CKTdeltaOld[1];
679 c4 = c3 + ckt->CKTdeltaOld[2];
681 for (; tran->
tcheck <= time; tran->
tcheck += ckt->CKTstep) {
685 d1 = ckt->CKTtime - tran->
tcheck;
691 diff[0] = d2*d3*d4/((-c2)*(c3)*(c4));
692 diff[1] = d1*d3*d4/((c2)*(c2-c3)*(c2-c4));
693 diff[2] = d1*d2*d4/((c3)*(c3-c2)*(c3-c4));
694 diff[3] = d1*d2*d3/((c4)*(c4-c2)*(c4-c3));
696 for (i = 1; i <= size; i++) {
698 diff[0]*ckt->CKTsols[0][i] +
699 diff[1]*ckt->CKTsols[1][i] +
700 diff[2]*ckt->CKTsols[2][i] +
701 diff[3]*ckt->CKTsols[3][i];
703 if (tran->
tcheck < finalmax) {
704 temp = ckt->CKTrhsOld;
705 ckt->CKTrhsOld = ckt->CKTrhs;
707 ckt->CKTrhsOld = temp;
709 if (finalmin < tran->tcheck)
716 if (tran->
tcheck > finalmin)
728 for (mh = ckt->CKTheadList; mh !=
NULL; mh = mh->
next) {
struct sSRCinstance * SRCnextInstance
int TRANan(GENERIC *cktp, int restart)
bool cp_getvar(char *n, int t, char *r)
struct sCKTmodHead * next
int DCTloop(int(*func)(), CKTcircuit *ckt, int restart, struct sDCTprms *dc, struct sOUTdata *outd)
IFuid eltName[DCTNESTLEVEL]
double STATtranDecompTime
SRCinstance * SRCinstances
double vsave[DCTNESTLEVEL]
static int is_trunc_dev()
static int tran_dcoperation()
void bcopy(char *from, char *to, int num)
struct sSRCmodel * SRCnextModel
GENinstance * elt[DCTNESTLEVEL]