mirror of
https://git.code.sf.net/p/ngspice/ngspice
synced 2026-08-22 13:57:32 +02:00
ni/niiter.c, #5/5, whitespace
This commit is contained in:
+78
-70
@@ -27,6 +27,7 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
|||||||
{
|
{
|
||||||
double startTime, *OldCKTstate0 = NULL;
|
double startTime, *OldCKTstate0 = NULL;
|
||||||
int error, i, j;
|
int error, i, j;
|
||||||
|
|
||||||
int iterno = 0;
|
int iterno = 0;
|
||||||
int ipass = 0;
|
int ipass = 0;
|
||||||
|
|
||||||
@@ -34,25 +35,25 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
|||||||
if (maxIter < 100)
|
if (maxIter < 100)
|
||||||
maxIter = 100;
|
maxIter = 100;
|
||||||
|
|
||||||
|
if ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) {
|
||||||
|
|
||||||
if( (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) {
|
|
||||||
SWAP(double *, ckt->CKTrhs, ckt->CKTrhsOld);
|
SWAP(double *, ckt->CKTrhs, ckt->CKTrhsOld);
|
||||||
error = CKTload(ckt);
|
error = CKTload(ckt);
|
||||||
if(error)
|
if (error)
|
||||||
return(error);
|
return(error);
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WANT_SENSE2
|
#ifdef WANT_SENSE2
|
||||||
if(ckt->CKTsenInfo) {
|
if (ckt->CKTsenInfo) {
|
||||||
error = NIsenReinit(ckt);
|
error = NIsenReinit(ckt);
|
||||||
if(error)
|
if (error)
|
||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(ckt->CKTniState & NIUNINITIALIZED) {
|
|
||||||
|
if (ckt->CKTniState & NIUNINITIALIZED) {
|
||||||
error = NIreinit(ckt);
|
error = NIreinit(ckt);
|
||||||
if(error) {
|
if (error) {
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("re-init returned error \n");
|
printf("re-init returned error \n");
|
||||||
#endif
|
#endif
|
||||||
@@ -60,32 +61,36 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OldCKTstate0=TMALLOC(double, ckt->CKTnumStates + 1); */
|
/* OldCKTstate0 = TMALLOC(double, ckt->CKTnumStates + 1); */
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
ckt->CKTnoncon = 0;
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
ckt->CKTnoncon=0;
|
|
||||||
#ifdef NEWPRED
|
#ifdef NEWPRED
|
||||||
if(!(ckt->CKTmode & MODEINITPRED))
|
if (!(ckt->CKTmode & MODEINITPRED))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
|
||||||
error = CKTload(ckt);
|
error = CKTload(ckt);
|
||||||
/*printf("loaded, noncon is %d\n",ckt->CKTnoncon);*/
|
/* printf("loaded, noncon is %d\n", ckt->CKTnoncon); */
|
||||||
/*fflush(stdout);*/
|
/* fflush(stdout); */
|
||||||
iterno++;
|
iterno++;
|
||||||
if(error) {
|
if (error) {
|
||||||
ckt->CKTstat->STATnumIter += iterno;
|
ckt->CKTstat->STATnumIter += iterno;
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("load returned error \n");
|
printf("load returned error \n");
|
||||||
#endif
|
#endif
|
||||||
FREE(OldCKTstate0);
|
FREE(OldCKTstate0);
|
||||||
return(error);
|
return (error);
|
||||||
}
|
}
|
||||||
/*printf("after loading, before solving\n");*/
|
|
||||||
/*CKTdump(ckt);*/
|
|
||||||
|
|
||||||
if(!(ckt->CKTniState & NIDIDPREORDER)) {
|
/* printf("after loading, before solving\n"); */
|
||||||
|
/* CKTdump(ckt); */
|
||||||
|
|
||||||
|
if (!(ckt->CKTniState & NIDIDPREORDER)) {
|
||||||
error = SMPpreOrder(ckt->CKTmatrix);
|
error = SMPpreOrder(ckt->CKTmatrix);
|
||||||
if(error) {
|
if (error) {
|
||||||
ckt->CKTstat->STATnumIter += iterno;
|
ckt->CKTstat->STATnumIter += iterno;
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("pre-order returned error \n");
|
printf("pre-order returned error \n");
|
||||||
@@ -95,24 +100,25 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
|||||||
}
|
}
|
||||||
ckt->CKTniState |= NIDIDPREORDER;
|
ckt->CKTniState |= NIDIDPREORDER;
|
||||||
}
|
}
|
||||||
if( (ckt->CKTmode & MODEINITJCT) ||
|
|
||||||
( (ckt->CKTmode & MODEINITTRAN) && (iterno==1)))
|
if ((ckt->CKTmode & MODEINITJCT) ||
|
||||||
|
((ckt->CKTmode & MODEINITTRAN) && (iterno == 1)))
|
||||||
{
|
{
|
||||||
ckt->CKTniState |= NISHOULDREORDER;
|
ckt->CKTniState |= NISHOULDREORDER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ckt->CKTniState & NISHOULDREORDER) {
|
if (ckt->CKTniState & NISHOULDREORDER) {
|
||||||
startTime = SPfrontEnd->IFseconds();
|
startTime = SPfrontEnd->IFseconds();
|
||||||
error = SMPreorder(ckt->CKTmatrix,ckt->CKTpivotAbsTol,
|
error = SMPreorder(ckt->CKTmatrix, ckt->CKTpivotAbsTol,
|
||||||
ckt->CKTpivotRelTol,ckt->CKTdiagGmin);
|
ckt->CKTpivotRelTol, ckt->CKTdiagGmin);
|
||||||
ckt->CKTstat->STATreorderTime +=
|
ckt->CKTstat->STATreorderTime +=
|
||||||
SPfrontEnd->IFseconds() - startTime;
|
SPfrontEnd->IFseconds() - startTime;
|
||||||
if(error) {
|
if (error) {
|
||||||
/* new feature - we can now find out something about what is
|
/* new feature - we can now find out something about what is
|
||||||
* wrong - so we ask for the troublesome entry
|
* wrong - so we ask for the troublesome entry
|
||||||
*/
|
*/
|
||||||
SMPgetError(ckt->CKTmatrix,&i,&j);
|
SMPgetError(ckt->CKTmatrix, &i, &j);
|
||||||
SPfrontEnd->IFerrorf (ERR_WARNING, "singular matrix: check nodes %s and %s\n", NODENAME(ckt,i), NODENAME(ckt,j));
|
SPfrontEnd->IFerrorf (ERR_WARNING, "singular matrix: check nodes %s and %s\n", NODENAME(ckt, i), NODENAME(ckt, j));
|
||||||
ckt->CKTstat->STATnumIter += iterno;
|
ckt->CKTstat->STATnumIter += iterno;
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("reorder returned error \n");
|
printf("reorder returned error \n");
|
||||||
@@ -123,18 +129,18 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
|||||||
ckt->CKTniState &= ~NISHOULDREORDER;
|
ckt->CKTniState &= ~NISHOULDREORDER;
|
||||||
} else {
|
} else {
|
||||||
startTime = SPfrontEnd->IFseconds();
|
startTime = SPfrontEnd->IFseconds();
|
||||||
error=SMPluFac(ckt->CKTmatrix,ckt->CKTpivotAbsTol,
|
error = SMPluFac(ckt->CKTmatrix, ckt->CKTpivotAbsTol,
|
||||||
ckt->CKTdiagGmin);
|
ckt->CKTdiagGmin);
|
||||||
ckt->CKTstat->STATdecompTime +=
|
ckt->CKTstat->STATdecompTime +=
|
||||||
SPfrontEnd->IFseconds() - startTime;
|
SPfrontEnd->IFseconds() - startTime;
|
||||||
if(error) {
|
if (error) {
|
||||||
if( error == E_SINGULAR ) {
|
if (error == E_SINGULAR) {
|
||||||
ckt->CKTniState |= NISHOULDREORDER;
|
ckt->CKTniState |= NISHOULDREORDER;
|
||||||
DEBUGMSG(" forced reordering....\n");
|
DEBUGMSG(" forced reordering....\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/*CKTload(ckt);*/
|
/* CKTload(ckt); */
|
||||||
/*SMPprint(ckt->CKTmatrix,stdout);*/
|
/* SMPprint(ckt->CKTmatrix, stdout); */
|
||||||
/* seems to be singular - pass the bad news up */
|
/* seems to be singular - pass the bad news up */
|
||||||
ckt->CKTstat->STATnumIter += iterno;
|
ckt->CKTstat->STATnumIter += iterno;
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
@@ -144,15 +150,16 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
|||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*moved it to here as if xspice is included then CKTload changes
|
|
||||||
CKTnumStates the first time it is run */
|
/* moved it to here as if xspice is included then CKTload changes
|
||||||
if(!OldCKTstate0)
|
CKTnumStates the first time it is run */
|
||||||
OldCKTstate0=TMALLOC(double, ckt->CKTnumStates + 1);
|
if (!OldCKTstate0)
|
||||||
|
OldCKTstate0 = TMALLOC(double, ckt->CKTnumStates + 1);
|
||||||
memcpy(OldCKTstate0, ckt->CKTstate0,
|
memcpy(OldCKTstate0, ckt->CKTstate0,
|
||||||
(size_t) ckt->CKTnumStates * sizeof(double));
|
(size_t) ckt->CKTnumStates * sizeof(double));
|
||||||
|
|
||||||
startTime = SPfrontEnd->IFseconds();
|
startTime = SPfrontEnd->IFseconds();
|
||||||
SMPsolve(ckt->CKTmatrix,ckt->CKTrhs,ckt->CKTrhsSpare);
|
SMPsolve(ckt->CKTmatrix, ckt->CKTrhs, ckt->CKTrhsSpare);
|
||||||
ckt->CKTstat->STATsolveTime +=
|
ckt->CKTstat->STATsolveTime +=
|
||||||
SPfrontEnd->IFseconds() - startTime;
|
SPfrontEnd->IFseconds() - startTime;
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
@@ -169,9 +176,9 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
|||||||
*ckt->CKTrhsSpare = 0;
|
*ckt->CKTrhsSpare = 0;
|
||||||
*ckt->CKTrhsOld = 0;
|
*ckt->CKTrhsOld = 0;
|
||||||
|
|
||||||
if(iterno > maxIter) {
|
if (iterno > maxIter) {
|
||||||
/*fprintf(stderr,"too many iterations without convergence: %d iter's (max iter == %d)\n",
|
/* fprintf(stderr, "too many iterations without convergence: %d iter's (max iter == %d)\n",
|
||||||
iterno,maxIter);*/
|
iterno, maxIter); */
|
||||||
ckt->CKTstat->STATnumIter += iterno;
|
ckt->CKTstat->STATnumIter += iterno;
|
||||||
FREE(errMsg);
|
FREE(errMsg);
|
||||||
errMsg = copy("Too many iterations without convergence");
|
errMsg = copy("Too many iterations without convergence");
|
||||||
@@ -181,71 +188,72 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
|||||||
FREE(OldCKTstate0);
|
FREE(OldCKTstate0);
|
||||||
return(E_ITERLIM);
|
return(E_ITERLIM);
|
||||||
}
|
}
|
||||||
if((ckt->CKTnoncon==0) && (iterno!=1))
|
|
||||||
|
if ((ckt->CKTnoncon == 0) && (iterno != 1))
|
||||||
ckt->CKTnoncon = NIconvTest(ckt);
|
ckt->CKTnoncon = NIconvTest(ckt);
|
||||||
else
|
else
|
||||||
ckt->CKTnoncon = 1;
|
ckt->CKTnoncon = 1;
|
||||||
|
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
printf("noncon is %d\n",ckt->CKTnoncon);
|
printf("noncon is %d\n", ckt->CKTnoncon);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (ckt->CKTnodeDamping!=0) && (ckt->CKTnoncon!=0) &&
|
if ((ckt->CKTnodeDamping != 0) && (ckt->CKTnoncon != 0) &&
|
||||||
((ckt->CKTmode & MODETRANOP) || (ckt->CKTmode & MODEDCOP)) &&
|
((ckt->CKTmode & MODETRANOP) || (ckt->CKTmode & MODEDCOP)) &&
|
||||||
(iterno>1) )
|
(iterno > 1))
|
||||||
{
|
{
|
||||||
CKTnode *node;
|
CKTnode *node;
|
||||||
double diff, maxdiff = 0;
|
double diff, maxdiff = 0;
|
||||||
for (node = ckt->CKTnodes->next; node; node = node->next)
|
for (node = ckt->CKTnodes->next; node; node = node->next)
|
||||||
if(node->type == SP_VOLTAGE) {
|
if (node->type == SP_VOLTAGE) {
|
||||||
diff = ckt->CKTrhs[node->number] - ckt->CKTrhsOld[node->number];
|
diff = ckt->CKTrhs[node->number] - ckt->CKTrhsOld[node->number];
|
||||||
if (maxdiff < diff)
|
if (maxdiff < diff)
|
||||||
maxdiff = diff;
|
maxdiff = diff;
|
||||||
}
|
}
|
||||||
if (maxdiff>10) {
|
|
||||||
|
if (maxdiff > 10) {
|
||||||
double damp_factor = 10 / maxdiff;
|
double damp_factor = 10 / maxdiff;
|
||||||
if (damp_factor<0.1)
|
if (damp_factor < 0.1)
|
||||||
damp_factor=0.1;
|
damp_factor = 0.1;
|
||||||
for (node = ckt->CKTnodes->next; node; node = node->next) {
|
for (node = ckt->CKTnodes->next; node; node = node->next) {
|
||||||
diff = ckt->CKTrhs[node->number] - ckt->CKTrhsOld[node->number];
|
diff = ckt->CKTrhs[node->number] - ckt->CKTrhsOld[node->number];
|
||||||
ckt->CKTrhs[node->number] =
|
ckt->CKTrhs[node->number] =
|
||||||
ckt->CKTrhsOld[node->number] + (damp_factor * diff);
|
ckt->CKTrhsOld[node->number] + (damp_factor * diff);
|
||||||
}
|
}
|
||||||
for(i=0; i<ckt->CKTnumStates; i++) {
|
for (i = 0; i < ckt->CKTnumStates; i++) {
|
||||||
diff = ckt->CKTstate0[i] - OldCKTstate0[i];
|
diff = ckt->CKTstate0[i] - OldCKTstate0[i];
|
||||||
ckt->CKTstate0[i] = OldCKTstate0[i] + (damp_factor * diff);
|
ckt->CKTstate0[i] = OldCKTstate0[i] + (damp_factor * diff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ckt->CKTmode & MODEINITFLOAT) {
|
||||||
|
|
||||||
if(ckt->CKTmode & MODEINITFLOAT) {
|
|
||||||
if ((ckt->CKTmode & MODEDC) && ckt->CKThadNodeset) {
|
if ((ckt->CKTmode & MODEDC) && ckt->CKThadNodeset) {
|
||||||
if(ipass)
|
if (ipass)
|
||||||
ckt->CKTnoncon=ipass;
|
ckt->CKTnoncon = ipass;
|
||||||
ipass=0;
|
ipass = 0;
|
||||||
}
|
}
|
||||||
if(ckt->CKTnoncon == 0) {
|
if (ckt->CKTnoncon == 0) {
|
||||||
ckt->CKTstat->STATnumIter += iterno;
|
ckt->CKTstat->STATnumIter += iterno;
|
||||||
FREE(OldCKTstate0);
|
FREE(OldCKTstate0);
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
} else if(ckt->CKTmode & MODEINITJCT) {
|
} else if (ckt->CKTmode & MODEINITJCT) {
|
||||||
ckt->CKTmode = (ckt->CKTmode& ~INITF )|MODEINITFIX;
|
ckt->CKTmode = (ckt->CKTmode & ~INITF) | MODEINITFIX;
|
||||||
ckt->CKTniState |= NISHOULDREORDER;
|
ckt->CKTniState |= NISHOULDREORDER;
|
||||||
} else if (ckt->CKTmode & MODEINITFIX) {
|
} else if (ckt->CKTmode & MODEINITFIX) {
|
||||||
if(ckt->CKTnoncon==0)
|
if (ckt->CKTnoncon == 0)
|
||||||
ckt->CKTmode = (ckt->CKTmode& ~INITF )|MODEINITFLOAT;
|
ckt->CKTmode = (ckt->CKTmode & ~INITF) | MODEINITFLOAT;
|
||||||
ipass=1;
|
ipass = 1;
|
||||||
} else if (ckt->CKTmode & MODEINITSMSIG) {
|
} else if (ckt->CKTmode & MODEINITSMSIG) {
|
||||||
ckt->CKTmode = (ckt->CKTmode& ~INITF )|MODEINITFLOAT;
|
ckt->CKTmode = (ckt->CKTmode & ~INITF) | MODEINITFLOAT;
|
||||||
} else if (ckt->CKTmode & MODEINITTRAN) {
|
} else if (ckt->CKTmode & MODEINITTRAN) {
|
||||||
if(iterno<=1)
|
if (iterno <= 1)
|
||||||
ckt->CKTniState |= NISHOULDREORDER;
|
ckt->CKTniState |= NISHOULDREORDER;
|
||||||
ckt->CKTmode = (ckt->CKTmode& ~INITF )|MODEINITFLOAT;
|
ckt->CKTmode = (ckt->CKTmode & ~INITF) | MODEINITFLOAT;
|
||||||
} else if (ckt->CKTmode & MODEINITPRED) {
|
} else if (ckt->CKTmode & MODEINITPRED) {
|
||||||
ckt->CKTmode = (ckt->CKTmode& ~INITF )|MODEINITFLOAT;
|
ckt->CKTmode = (ckt->CKTmode & ~INITF) | MODEINITFLOAT;
|
||||||
} else {
|
} else {
|
||||||
ckt->CKTstat->STATnumIter += iterno;
|
ckt->CKTstat->STATnumIter += iterno;
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
@@ -258,8 +266,8 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
|||||||
|
|
||||||
/* build up the lvnim1 array from the lvn array */
|
/* build up the lvnim1 array from the lvn array */
|
||||||
SWAP(double *, ckt->CKTrhs, ckt->CKTrhsOld);
|
SWAP(double *, ckt->CKTrhs, ckt->CKTrhsOld);
|
||||||
/*printf("after loading, after solving\n");*/
|
/* printf("after loading, after solving\n"); */
|
||||||
/*CKTdump(ckt);*/
|
/* CKTdump(ckt); */
|
||||||
}
|
}
|
||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user