From fb306e5385cf389d8306f7ec7a5394a8cd64f9e2 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 14 Jan 2013 11:37:41 +0100 Subject: [PATCH] Reviewed IND, ISRC, RES and VSRC to work with the "new_kirchhoff" KCL verification --- src/include/ngspice/cktdefs.h | 4 --- src/maths/ni/niconv.c | 61 +++++++++++++---------------------- src/maths/ni/niiter.c | 13 -------- 3 files changed, 22 insertions(+), 56 deletions(-) diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 1e63aa708..c0a32582d 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -430,10 +430,6 @@ extern void NInzIter(CKTcircuit *, int, int); extern int NIpred(CKTcircuit *ckt); #endif -/* KCL Verification */ -extern int NIkclVerification (CKTcircuit *) ; -/********************/ - extern IFfrontEnd *SPfrontEnd; #endif diff --git a/src/maths/ni/niconv.c b/src/maths/ni/niconv.c index deb9c9016..a51b89fce 100644 --- a/src/maths/ni/niconv.c +++ b/src/maths/ni/niconv.c @@ -25,8 +25,22 @@ NIconvTest(CKTcircuit *ckt) double new; double tol; + /* KCL_verification */ + double maximum = 0 ; + node = ckt->CKTnodes; size = SMPmatSize(ckt->CKTmatrix); + + for (i = 1 ; i <= size ; i++) + { + if (node->type == SP_CURRENT) + { + if (maximum < fabs (ckt->CKTrhsOld [i])) + maximum = fabs (ckt->CKTrhsOld [i]) ; + } + node = node->next ; + } + #ifdef STEPDEBUG for (i=1;i<=size;i++) { new = ckt->CKTrhs [i] ; @@ -34,6 +48,8 @@ NIconvTest(CKTcircuit *ckt) printf("chk for convergence: %s new: %g old: %g\n",CKTnodName(ckt,i),new,old); } #endif /* STEPDEBUG */ + + node = ckt->CKTnodes ; for (i=1;i<=size;i++) { node = node->next; new = ckt->CKTrhs [i] ; @@ -50,6 +66,12 @@ NIconvTest(CKTcircuit *ckt) ckt->CKTtroubleElt = NULL; return(1); } + + /* KCL Verification */ +// printf ("Valore: %-.9g\tSoglia: %-.9g\n", fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]), (ckt->CKTreltol * maximum + ckt->CKTabstol)) ; +// if (fabs (ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + if (fabs (ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) + return 1 ; } } @@ -62,42 +84,3 @@ NIconvTest(CKTcircuit *ckt) return(0); #endif /* NEWCONV */ } - - -/** - * Routine to Verify the KCL - */ - -int NIkclVerification (CKTcircuit *ckt) -{ - int i, size ; - double maximum = 0 ; - CKTnode *node ; - - size = SMPmatSize (ckt->CKTmatrix) ; - - node = ckt->CKTnodes ; - for (i = 1 ; i <= size ; i++) - { - if (node->type == SP_CURRENT) - { - if (maximum < fabs (ckt->CKTrhsOld [i])) - maximum = fabs (ckt->CKTrhsOld [i]) ; - } - node = node->next ; - } - - node = ckt->CKTnodes ; - for (i = 1 ; i <= size ; i++) - { - if (node->type == SP_VOLTAGE) - { - if ((ckt->CKTfvk [i] + ckt->CKTdiagGmin * ckt->CKTrhsOld [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) -// if ((ckt->CKTfvk [i]) > (ckt->CKTreltol * maximum + ckt->CKTabstol)) - return 1 ; - } - node = node->next ; - } - - return 0 ; -} diff --git a/src/maths/ni/niiter.c b/src/maths/ni/niiter.c index d540cae43..4d6c83e08 100644 --- a/src/maths/ni/niiter.c +++ b/src/maths/ni/niiter.c @@ -37,9 +37,6 @@ NIiter(CKTcircuit *ckt, int maxIter) CKTnode *node; /* current matrix entry */ double diff, maxdiff, damp_factor, *OldCKTstate0=NULL; - /* KCL_verified */ - int KCL_verified ; - if ( maxIter < 100 ) maxIter = 100; /* some convergence issues that get resolved by increasing max iter */ iterno=0; @@ -113,16 +110,6 @@ NIiter(CKTcircuit *ckt, int maxIter) ckt->CKTniState |= NISHOULDREORDER; } - /* KCL Verification */ - if ((ckt->CKTnoncon == 0) && (iterno != 1)) - { - KCL_verified = NIkclVerification (ckt) ; - if (KCL_verified) /* NOT VERIFIED */ - ckt->CKTnoncon = 1 ; - else - ckt->CKTnoncon = 0 ; - } - if(ckt->CKTniState & NISHOULDREORDER) { startTime = SPfrontEnd->IFseconds(); error = SMPreorder(ckt->CKTmatrix,ckt->CKTpivotAbsTol,