Fixed a bug in Dynamic GMIN Stepping

This commit is contained in:
Francesco Lannutti 2013-09-18 22:22:38 +02:00
parent 8ec23a720b
commit 8fdb1320bf
3 changed files with 17 additions and 12 deletions

View File

@ -83,7 +83,12 @@ NIconvTest (CKTcircuit *ckt)
/* Check Convergence */ /* Check Convergence */
if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol))
{
ckt->CKTtroubleNode = i ;
ckt->CKTtroubleElt = NULL ;
return 1 ; return 1 ;
}
} }
#else #else
new = ckt->CKTrhs [i] ; new = ckt->CKTrhs [i] ;

View File

@ -170,7 +170,7 @@ SMPluFac(SMPmatrix *Matrix, double PivTol, double Gmin)
{ {
NG_IGNORE(PivTol); NG_IGNORE(PivTol);
spSetReal( Matrix ); spSetReal( Matrix );
LoadGmin( Matrix, Gmin ); // LoadGmin( Matrix, Gmin );
return spFactor( Matrix ); return spFactor( Matrix );
} }
@ -194,7 +194,7 @@ int
SMPreorder(SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin) SMPreorder(SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin)
{ {
spSetReal( Matrix ); spSetReal( Matrix );
LoadGmin( Matrix, Gmin ); // LoadGmin( Matrix, Gmin );
return spOrderAndFactor( Matrix, NULL, return spOrderAndFactor( Matrix, NULL,
PivRel, PivTol, YES ); PivRel, PivTol, YES );
} }

View File

@ -154,12 +154,12 @@ dynamic_gmin (CKTcircuit * ckt, long int firstmode,
factor = ckt->CKTgminFactor; factor = ckt->CKTgminFactor;
OldGmin = 1e-2; OldGmin = 1e-2;
ckt->CKTdiagGmin = OldGmin / factor;
gtarget = MAX (ckt->CKTgmin, ckt->CKTgshunt); gtarget = MAX (ckt->CKTgmin, ckt->CKTgshunt);
ckt->CKTgmin = OldGmin / factor;
success = failed = 0; success = failed = 0;
while ((!success) && (!failed)) { while ((!success) && (!failed)) {
fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTdiagGmin); fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTgmin);
ckt->CKTnoncon = 1; ckt->CKTnoncon = 1;
iters = ckt->CKTstat->STATnumIter; iters = ckt->CKTstat->STATnumIter;
@ -171,7 +171,7 @@ dynamic_gmin (CKTcircuit * ckt, long int firstmode,
SPfrontEnd->IFerror (ERR_INFO, SPfrontEnd->IFerror (ERR_INFO,
"One successful gmin step", NULL); "One successful gmin step", NULL);
if (ckt->CKTdiagGmin <= gtarget) { if (ckt->CKTgmin <= gtarget) {
success = 1; success = 1;
} else { } else {
i = 0; i = 0;
@ -193,13 +193,13 @@ dynamic_gmin (CKTcircuit * ckt, long int firstmode,
if (iters > (3 * ckt->CKTdcTrcvMaxIter / 4)) if (iters > (3 * ckt->CKTdcTrcvMaxIter / 4))
factor = sqrt (factor); factor = sqrt (factor);
OldGmin = ckt->CKTdiagGmin; OldGmin = ckt->CKTgmin;
if ((ckt->CKTdiagGmin) < (factor * gtarget)) { if ((ckt->CKTgmin) < (factor * gtarget)) {
factor = ckt->CKTdiagGmin / gtarget; factor = ckt->CKTgmin / gtarget;
ckt->CKTdiagGmin = gtarget; ckt->CKTgmin = gtarget;
} else { } else {
ckt->CKTdiagGmin /= factor; ckt->CKTgmin /= factor;
} }
} }
} else { } else {
@ -213,7 +213,7 @@ dynamic_gmin (CKTcircuit * ckt, long int firstmode,
"Further gmin increment", "Further gmin increment",
NULL); NULL);
factor = sqrt (sqrt (factor)); factor = sqrt (sqrt (factor));
ckt->CKTdiagGmin = OldGmin / factor; ckt->CKTgmin = OldGmin / factor;
i = 0; i = 0;
for (n = ckt->CKTnodes; n; n = n->next) { for (n = ckt->CKTnodes; n; n = n->next) {
@ -228,7 +228,7 @@ dynamic_gmin (CKTcircuit * ckt, long int firstmode,
} }
} }
ckt->CKTdiagGmin = ckt->CKTgshunt; // ckt->CKTdiagGmin = ckt->CKTgshunt;
FREE (OldRhsOld); FREE (OldRhsOld);
FREE (OldCKTstate0); FREE (OldCKTstate0);