diff --git a/src/maths/KLU/klusmp.c b/src/maths/KLU/klusmp.c index 3df9bd13f..3bf97e21c 100644 --- a/src/maths/KLU/klusmp.c +++ b/src/maths/KLU/klusmp.c @@ -410,19 +410,20 @@ SMPcLUfac (SMPmatrix *Matrix, double PivTol) if (ret == 0) { if (Matrix->CKTkluCommon == NULL) { - fprintf (stderr, "Error: KLUcommon object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (ReFactor): KLUcommon object is NULL. A problem occurred\n") ; } if (Matrix->CKTkluCommon->status == KLU_EMPTY_MATRIX) { - fprintf (stderr, "Error: KLU Matrix is empty\n") ; + fprintf (stderr, "Error (ReFactor): KLU Matrix is empty\n") ; } if (Matrix->CKTkluNumeric == NULL) { - fprintf (stderr, "Error: KLUnumeric object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (ReFactor): KLUnumeric object is NULL. A problem occurred\n") ; } return 1 ; } else { if (Matrix->CKTkluCommon->status == KLU_SINGULAR) { - fprintf (stderr, "Warning: KLU Matrix is SINGULAR\n") ; + fprintf (stderr, "Warning (ReFactor): KLU Matrix is SINGULAR\n") ; + return E_SINGULAR ; } return 0 ; } @@ -454,19 +455,20 @@ SMPluFac (SMPmatrix *Matrix, double PivTol, double Gmin) if (ret == 0) { if (Matrix->CKTkluCommon == NULL) { - fprintf (stderr, "Error: KLUcommon object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (ReFactor): KLUcommon object is NULL. A problem occurred\n") ; } if (Matrix->CKTkluCommon->status == KLU_EMPTY_MATRIX) { - fprintf (stderr, "Error: KLU Matrix is empty\n") ; + fprintf (stderr, "Error (ReFactor): KLU Matrix is empty\n") ; } if (Matrix->CKTkluNumeric == NULL) { - fprintf (stderr, "Error: KLUnumeric object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (ReFactor): KLUnumeric object is NULL. A problem occurred\n") ; } return 1 ; } else { if (Matrix->CKTkluCommon->status == KLU_SINGULAR) { - fprintf (stderr, "Warning: KLU Matrix is SINGULAR\n") ; + fprintf (stderr, "Warning (ReFactor): KLU Matrix is SINGULAR\n") ; + return E_SINGULAR ; } return 0 ; } @@ -510,19 +512,20 @@ SMPluFacKLUforCIDER (SMPmatrix *Matrix) if (ret == 0) { if (Matrix->CKTkluCommon == NULL) { - fprintf (stderr, "Error (CIDER): KLUcommon object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (ReFactor) (CIDER): KLUcommon object is NULL. A problem occurred\n") ; } if (Matrix->CKTkluCommon->status == KLU_EMPTY_MATRIX) { - fprintf (stderr, "Error (CIDER): KLU Matrix is empty\n") ; + fprintf (stderr, "Error (ReFactor) (CIDER): KLU Matrix is empty\n") ; } if (Matrix->CKTkluNumeric == NULL) { - fprintf (stderr, "Error (CIDER): KLUnumeric object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (ReFactor) (CIDER): KLUnumeric object is NULL. A problem occurred\n") ; } return 1 ; } else { if (Matrix->CKTkluCommon->status == KLU_SINGULAR) { - fprintf (stderr, "Warning (CIDER): KLU Matrix is SINGULAR\n") ; + fprintf (stderr, "Warning (ReFactor) (CIDER): KLU Matrix is SINGULAR\n") ; + return E_SINGULAR ; } return 0 ; } @@ -548,27 +551,25 @@ SMPcReorder (SMPmatrix *Matrix, double PivTol, double PivRel, int *NumSwaps) if (Matrix->CKTkluNumeric != NULL) { klu_z_free_numeric (&(Matrix->CKTkluNumeric), Matrix->CKTkluCommon) ; - Matrix->CKTkluNumeric = klu_z_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx_Complex, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; - } else - Matrix->CKTkluNumeric = klu_z_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx_Complex, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; + } + Matrix->CKTkluNumeric = klu_z_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx_Complex, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; if (Matrix->CKTkluNumeric == NULL) { - fprintf (stderr, "Error: KLUnumeric object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (Factor): KLUnumeric object is NULL. A problem occurred\n") ; if (Matrix->CKTkluCommon == NULL) { - fprintf (stderr, "Error: KLUcommon object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (Factor): KLUcommon object is NULL. A problem occurred\n") ; } if (Matrix->CKTkluCommon->status == KLU_EMPTY_MATRIX) { - fprintf (stderr, "Error: KLU Matrix is empty\n") ; + fprintf (stderr, "Error (Factor): KLU Matrix is empty\n") ; } if (Matrix->CKTkluSymbolic == NULL) { - fprintf (stderr, "Error: KLUsymbolic object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (Factor): KLUsymbolic object is NULL. A problem occurred\n") ; } return 1 ; } else { if (Matrix->CKTkluCommon->status == KLU_SINGULAR) { - fprintf (stderr, "Warning: KLU Matrix is SINGULAR\n") ; - return E_SINGULAR ; + fprintf (stderr, "Warning (Factor): KLU Matrix is SINGULAR\n") ; } return 0 ; } @@ -595,27 +596,25 @@ SMPreorder (SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin) if (Matrix->CKTkluNumeric != NULL) { klu_free_numeric (&(Matrix->CKTkluNumeric), Matrix->CKTkluCommon) ; - Matrix->CKTkluNumeric = klu_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; - } else - Matrix->CKTkluNumeric = klu_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; + } + Matrix->CKTkluNumeric = klu_factor (Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx, Matrix->CKTkluSymbolic, Matrix->CKTkluCommon) ; if (Matrix->CKTkluNumeric == NULL) { - fprintf (stderr, "Error: KLUnumeric object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (Factor): KLUnumeric object is NULL. A problem occurred\n") ; if (Matrix->CKTkluCommon == NULL) { - fprintf (stderr, "Error: KLUcommon object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (Factor): KLUcommon object is NULL. A problem occurred\n") ; } if (Matrix->CKTkluCommon->status == KLU_EMPTY_MATRIX) { - fprintf (stderr, "Error: KLU Matrix is empty\n") ; + fprintf (stderr, "Error (Factor): KLU Matrix is empty\n") ; } if (Matrix->CKTkluSymbolic == NULL) { - fprintf (stderr, "Error: KLUsymbolic object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (Factor): KLUsymbolic object is NULL. A problem occurred\n") ; } return 1 ; } else { if (Matrix->CKTkluCommon->status == KLU_SINGULAR) { - fprintf (stderr, "Warning: KLU Matrix is SINGULAR\n") ; - return E_SINGULAR ; + fprintf (stderr, "Warning (Factor): KLU Matrix is SINGULAR\n") ; } return 0 ; } @@ -661,21 +660,20 @@ SMPreorderKLUforCIDER (SMPmatrix *Matrix) } if (Matrix->SMPkluMatrix->KLUmatrixNumeric == NULL) { - fprintf (stderr, "Error (CIDER): KLUnumeric object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (Factor) (CIDER): KLUnumeric object is NULL. A problem occurred\n") ; if (Matrix->CKTkluCommon == NULL) { - fprintf (stderr, "Error (CIDER): KLUcommon object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (Factor) (CIDER): KLUcommon object is NULL. A problem occurred\n") ; } if (Matrix->CKTkluCommon->status == KLU_EMPTY_MATRIX) { - fprintf (stderr, "Error (CIDER): KLU Matrix is empty\n") ; + fprintf (stderr, "Error (Factor) (CIDER): KLU Matrix is empty\n") ; } if (Matrix->CKTkluSymbolic == NULL) { - fprintf (stderr, "Error (CIDER): KLUsymbolic object is NULL. A problem occurred\n") ; + fprintf (stderr, "Error (Factor) (CIDER): KLUsymbolic object is NULL. A problem occurred\n") ; } return 1 ; } else { if (Matrix->CKTkluCommon->status == KLU_SINGULAR) { - fprintf (stderr, "Warning (CIDER): KLU Matrix is SINGULAR\n") ; - return E_SINGULAR ; + fprintf (stderr, "Warning (Factor) (CIDER): KLU Matrix is SINGULAR\n") ; } return 0 ; } diff --git a/src/maths/ni/niiter.c b/src/maths/ni/niiter.c index 54181bb00..575497674 100644 --- a/src/maths/ni/niiter.c +++ b/src/maths/ni/niiter.c @@ -143,22 +143,33 @@ NIiter(CKTcircuit *ckt, int maxIter) ckt->CKTdiagGmin); ckt->CKTstat->STATdecompTime += SPfrontEnd->IFseconds() - startTime; - if (error) { - if (error == E_SINGULAR) { #ifdef KLU - error = SMPreorder(ckt->CKTmatrix, ckt->CKTpivotAbsTol, ckt->CKTpivotRelTol, ckt->CKTdiagGmin); - ckt->CKTstat->STATreorderTime += SPfrontEnd->IFseconds() - startTime; - if (error) { - SMPgetError(ckt->CKTmatrix, &i, &j); - SPfrontEnd->IFerrorf (ERR_WARNING, "singular matrix: check nodes %s and %s\n", NODENAME(ckt, i), NODENAME(ckt, j)); - } + if (error == E_SINGULAR) { + ckt->CKTniState |= NISHOULDREORDER; + error = SMPreorder(ckt->CKTmatrix, ckt->CKTpivotAbsTol, ckt->CKTpivotRelTol, ckt->CKTdiagGmin); + ckt->CKTstat->STATreorderTime += SPfrontEnd->IFseconds() - startTime; + if (error) { + SMPgetError(ckt->CKTmatrix, &i, &j); + SPfrontEnd->IFerrorf (ERR_WARNING, "singular matrix: check nodes %s and %s\n", NODENAME(ckt, i), NODENAME(ckt, j)); + + /* CKTload(ckt); */ + /* SMPprint(ckt->CKTmatrix, stdout); */ + /* seems to be singular - pass the bad news up */ + ckt->CKTstat->STATnumIter += iterno; +#ifdef STEPDEBUG + printf("lufac returned error \n"); +#endif + FREE(OldCKTstate0); + return(error); + } + } #else + if (error) { + if (error == E_SINGULAR) { ckt->CKTniState |= NISHOULDREORDER; DEBUGMSG(" forced reordering....\n"); continue; -#endif - } /* CKTload(ckt); */ /* SMPprint(ckt->CKTmatrix, stdout); */ @@ -170,6 +181,8 @@ NIiter(CKTcircuit *ckt, int maxIter) FREE(OldCKTstate0); return(error); } +#endif + } /* moved it to here as if xspice is included then CKTload changes