From 8fdb1320bfbd7a5ab4d7d4bf82d6e46e13c7366a Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Wed, 18 Sep 2013 22:22:38 +0200 Subject: [PATCH] Fixed a bug in Dynamic GMIN Stepping --- src/maths/ni/niconv.c | 5 +++++ src/maths/sparse/spsmp.c | 4 ++-- src/spicelib/analysis/cktop.c | 20 ++++++++++---------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index 8c4c8c6a9..f11ee2e5b 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -83,7 +83,12 @@ NIconvTest (CKTcircuit *ckt) /* Check Convergence */ if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + { + ckt->CKTtroubleNode = i ; + ckt->CKTtroubleElt = NULL ; + return 1 ; + } } #else new = ckt->CKTrhs [i] ; diff --git a/src/maths/sparse/spsmp.c b/src/maths/sparse/spsmp.c index daa736d9c..d5845f960 100644 --- a/src/maths/sparse/spsmp.c +++ b/src/maths/sparse/spsmp.c @@ -170,7 +170,7 @@ SMPluFac(SMPmatrix *Matrix, double PivTol, double Gmin) { NG_IGNORE(PivTol); spSetReal( Matrix ); - LoadGmin( Matrix, Gmin ); +// LoadGmin( Matrix, Gmin ); return spFactor( Matrix ); } @@ -194,7 +194,7 @@ int SMPreorder(SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin) { spSetReal( Matrix ); - LoadGmin( Matrix, Gmin ); +// LoadGmin( Matrix, Gmin ); return spOrderAndFactor( Matrix, NULL, PivRel, PivTol, YES ); } diff --git a/src/spicelib/analysis/cktop.c b/src/spicelib/analysis/cktop.c index 35d2bc33b..cfd07a422 100644 --- a/src/spicelib/analysis/cktop.c +++ b/src/spicelib/analysis/cktop.c @@ -154,12 +154,12 @@ dynamic_gmin (CKTcircuit * ckt, long int firstmode, factor = ckt->CKTgminFactor; OldGmin = 1e-2; - ckt->CKTdiagGmin = OldGmin / factor; gtarget = MAX (ckt->CKTgmin, ckt->CKTgshunt); + ckt->CKTgmin = OldGmin / factor; success = failed = 0; while ((!success) && (!failed)) { - fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTdiagGmin); + fprintf (stderr, "Trying gmin = %12.4E ", ckt->CKTgmin); ckt->CKTnoncon = 1; iters = ckt->CKTstat->STATnumIter; @@ -171,7 +171,7 @@ dynamic_gmin (CKTcircuit * ckt, long int firstmode, SPfrontEnd->IFerror (ERR_INFO, "One successful gmin step", NULL); - if (ckt->CKTdiagGmin <= gtarget) { + if (ckt->CKTgmin <= gtarget) { success = 1; } else { i = 0; @@ -193,13 +193,13 @@ dynamic_gmin (CKTcircuit * ckt, long int firstmode, if (iters > (3 * ckt->CKTdcTrcvMaxIter / 4)) factor = sqrt (factor); - OldGmin = ckt->CKTdiagGmin; + OldGmin = ckt->CKTgmin; - if ((ckt->CKTdiagGmin) < (factor * gtarget)) { - factor = ckt->CKTdiagGmin / gtarget; - ckt->CKTdiagGmin = gtarget; + if ((ckt->CKTgmin) < (factor * gtarget)) { + factor = ckt->CKTgmin / gtarget; + ckt->CKTgmin = gtarget; } else { - ckt->CKTdiagGmin /= factor; + ckt->CKTgmin /= factor; } } } else { @@ -213,7 +213,7 @@ dynamic_gmin (CKTcircuit * ckt, long int firstmode, "Further gmin increment", NULL); factor = sqrt (sqrt (factor)); - ckt->CKTdiagGmin = OldGmin / factor; + ckt->CKTgmin = OldGmin / factor; i = 0; 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 (OldCKTstate0);