diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 2101d78f4..86f58fab2 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -121,6 +121,7 @@ struct CKTcircuit { double *CKTfvk ; /* KCL Verification array */ int *CKTnodeIsLinear ; /* Flag to indicate if a node is linear or non-linear */ CKTmkCurKCLnode **CKTmkCurKCLarray ; /* Array of KCL Currents */ + double **CKTdiag ; #endif double *CKTrhsSpare; /* spare rhs value for reordering */ diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index f11ee2e5b..ebedfb01a 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -76,13 +76,17 @@ NIconvTest (CKTcircuit *ckt) ptr = ptr->next ; } + if (maximum < fabs (ckt->CKTgmin * ckt->CKTrhsOld [i])) + maximum = fabs (ckt->CKTgmin * ckt->CKTrhsOld [i]) ; + + #ifdef STEPDEBUG fprintf (stderr, "Index: %d\tValue: %-.9g\tThreshold: %-.9g\tMaximum: %-.9g\n", i, fabs (ckt->CKTfvk [i]), ckt->CKTreltol * maximum + ckt->CKTabstol, maximum) ; #endif /* Check Convergence */ - if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + if (fabs (ckt->CKTfvk [i] + ckt->CKTgmin * ckt->CKTrhsOld [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) { ckt->CKTtroubleNode = i ; ckt->CKTtroubleElt = NULL ; diff --git a/src/maths/ni/nireinit.c b/src/maths/ni/nireinit.c index 17a114f90..0b2d73dae 100644 --- a/src/maths/ni/nireinit.c +++ b/src/maths/ni/nireinit.c @@ -43,6 +43,9 @@ NIreinit( CKTcircuit *ckt) CKALLOC(CKTmkCurKCLarray,size+1,CKTmkCurKCLnode*); for (i = 0 ; i <= size ; i++) ckt->CKTmkCurKCLarray [i] = NULL ; + CKALLOC(CKTdiag,size+1,double*); + for (i = 0 ; i <= size ; i++) + ckt->CKTdiag [i] = NULL ; #endif #ifdef PREDICTOR diff --git a/src/spicelib/analysis/cktload.c b/src/spicelib/analysis/cktload.c index c8ec1a666..964037af8 100644 --- a/src/spicelib/analysis/cktload.c +++ b/src/spicelib/analysis/cktload.c @@ -79,6 +79,16 @@ CKTload(CKTcircuit *ckt) } } +#ifdef KIRCHHOFF + /* GMIN Stepping */ + for (i = 1 ; i <= size ; i++) + { + if (ckt->CKTdiag [i] != NULL) + { + *(ckt->CKTdiag [i]) += ckt->CKTgmin ; + } + } +#endif #ifdef XSPICE /* gtri - add - wbk - 11/26/90 - reset the MIF init flags */ diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index 4c55ef678..36409186b 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -129,6 +129,19 @@ CKTsetup(CKTcircuit *ckt) #endif #ifdef KIRCHHOFF + CKTnode *node ; + + node = ckt->CKTnodes ; + for (i = 1 ; i <= SMPmatSize (ckt->CKTmatrix) ; i++) + { + node = node->next ; + + if (node->type == SP_VOLTAGE) + { + ckt->CKTdiag [i] = SMPmakeElt (ckt->CKTmatrix, i, i) ; + } + } + /** Marking node as Non-Linear when needed * By default every node is Linear */