Fixed again the NIiter loop for KLU
This commit is contained in:
parent
13bf83f8c1
commit
bde229b805
|
|
@ -410,19 +410,20 @@ SMPcLUfac (SMPmatrix *Matrix, double PivTol)
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
if (Matrix->CKTkluCommon == NULL) {
|
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)
|
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) {
|
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 ;
|
return 1 ;
|
||||||
} else {
|
} else {
|
||||||
if (Matrix->CKTkluCommon->status == KLU_SINGULAR) {
|
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 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
|
@ -454,19 +455,20 @@ SMPluFac (SMPmatrix *Matrix, double PivTol, double Gmin)
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
if (Matrix->CKTkluCommon == NULL) {
|
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)
|
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) {
|
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 ;
|
return 1 ;
|
||||||
} else {
|
} else {
|
||||||
if (Matrix->CKTkluCommon->status == KLU_SINGULAR) {
|
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 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
|
@ -510,19 +512,20 @@ SMPluFacKLUforCIDER (SMPmatrix *Matrix)
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
if (Matrix->CKTkluCommon == NULL) {
|
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)
|
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) {
|
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 ;
|
return 1 ;
|
||||||
} else {
|
} else {
|
||||||
if (Matrix->CKTkluCommon->status == KLU_SINGULAR) {
|
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 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
|
@ -548,27 +551,25 @@ SMPcReorder (SMPmatrix *Matrix, double PivTol, double PivRel, int *NumSwaps)
|
||||||
if (Matrix->CKTkluNumeric != NULL)
|
if (Matrix->CKTkluNumeric != NULL)
|
||||||
{
|
{
|
||||||
klu_z_free_numeric (&(Matrix->CKTkluNumeric), Matrix->CKTkluCommon) ;
|
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)
|
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) {
|
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) {
|
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) {
|
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 ;
|
return 1 ;
|
||||||
} else {
|
} else {
|
||||||
if (Matrix->CKTkluCommon->status == KLU_SINGULAR) {
|
if (Matrix->CKTkluCommon->status == KLU_SINGULAR) {
|
||||||
fprintf (stderr, "Warning: KLU Matrix is SINGULAR\n") ;
|
fprintf (stderr, "Warning (Factor): KLU Matrix is SINGULAR\n") ;
|
||||||
return E_SINGULAR ;
|
|
||||||
}
|
}
|
||||||
return 0 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
|
@ -595,27 +596,25 @@ SMPreorder (SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin)
|
||||||
if (Matrix->CKTkluNumeric != NULL)
|
if (Matrix->CKTkluNumeric != NULL)
|
||||||
{
|
{
|
||||||
klu_free_numeric (&(Matrix->CKTkluNumeric), Matrix->CKTkluCommon) ;
|
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)
|
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) {
|
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) {
|
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) {
|
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 ;
|
return 1 ;
|
||||||
} else {
|
} else {
|
||||||
if (Matrix->CKTkluCommon->status == KLU_SINGULAR) {
|
if (Matrix->CKTkluCommon->status == KLU_SINGULAR) {
|
||||||
fprintf (stderr, "Warning: KLU Matrix is SINGULAR\n") ;
|
fprintf (stderr, "Warning (Factor): KLU Matrix is SINGULAR\n") ;
|
||||||
return E_SINGULAR ;
|
|
||||||
}
|
}
|
||||||
return 0 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
|
@ -661,21 +660,20 @@ SMPreorderKLUforCIDER (SMPmatrix *Matrix)
|
||||||
}
|
}
|
||||||
if (Matrix->SMPkluMatrix->KLUmatrixNumeric == NULL)
|
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) {
|
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) {
|
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) {
|
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 ;
|
return 1 ;
|
||||||
} else {
|
} else {
|
||||||
if (Matrix->CKTkluCommon->status == KLU_SINGULAR) {
|
if (Matrix->CKTkluCommon->status == KLU_SINGULAR) {
|
||||||
fprintf (stderr, "Warning (CIDER): KLU Matrix is SINGULAR\n") ;
|
fprintf (stderr, "Warning (Factor) (CIDER): KLU Matrix is SINGULAR\n") ;
|
||||||
return E_SINGULAR ;
|
|
||||||
}
|
}
|
||||||
return 0 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -133,22 +133,33 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
||||||
ckt->CKTdiagGmin);
|
ckt->CKTdiagGmin);
|
||||||
ckt->CKTstat->STATdecompTime +=
|
ckt->CKTstat->STATdecompTime +=
|
||||||
SPfrontEnd->IFseconds() - startTime;
|
SPfrontEnd->IFseconds() - startTime;
|
||||||
if (error) {
|
|
||||||
if (error == E_SINGULAR) {
|
|
||||||
|
|
||||||
#ifdef KLU
|
#ifdef KLU
|
||||||
error = SMPreorder(ckt->CKTmatrix, ckt->CKTpivotAbsTol, ckt->CKTpivotRelTol, ckt->CKTdiagGmin);
|
if (error == E_SINGULAR) {
|
||||||
ckt->CKTstat->STATreorderTime += SPfrontEnd->IFseconds() - startTime;
|
ckt->CKTniState |= NISHOULDREORDER;
|
||||||
if (error) {
|
error = SMPreorder(ckt->CKTmatrix, ckt->CKTpivotAbsTol, ckt->CKTpivotRelTol, ckt->CKTdiagGmin);
|
||||||
SMPgetError(ckt->CKTmatrix, &i, &j);
|
ckt->CKTstat->STATreorderTime += SPfrontEnd->IFseconds() - startTime;
|
||||||
SPfrontEnd->IFerrorf (ERR_WARNING, "singular matrix: check nodes %s and %s\n", NODENAME(ckt, i), NODENAME(ckt, j));
|
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
|
#else
|
||||||
|
if (error) {
|
||||||
|
if (error == E_SINGULAR) {
|
||||||
ckt->CKTniState |= NISHOULDREORDER;
|
ckt->CKTniState |= NISHOULDREORDER;
|
||||||
DEBUGMSG(" forced reordering....\n");
|
DEBUGMSG(" forced reordering....\n");
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
/* CKTload(ckt); */
|
/* CKTload(ckt); */
|
||||||
/* SMPprint(ckt->CKTmatrix, stdout); */
|
/* SMPprint(ckt->CKTmatrix, stdout); */
|
||||||
|
|
@ -160,6 +171,8 @@ NIiter(CKTcircuit *ckt, int maxIter)
|
||||||
FREE(OldCKTstate0);
|
FREE(OldCKTstate0);
|
||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* moved it to here as if xspice is included then CKTload changes
|
/* moved it to here as if xspice is included then CKTload changes
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue