Fixed a bug in Dynamic GMIN Stepping
This commit is contained in:
parent
8ec23a720b
commit
8fdb1320bf
|
|
@ -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] ;
|
||||||
|
|
|
||||||
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue