Browse Source

Fixed again the NIiter loop for KLU

pre-master-46
Francesco Lannutti 6 years ago
committed by Holger Vogt
parent
commit
fbd8d94cdf
  1. 70
      src/maths/KLU/klusmp.c
  2. 33
      src/maths/ni/niiter.c

70
src/maths/KLU/klusmp.c

@ -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") ;
return E_SINGULAR ;
fprintf (stderr, "Warning (Factor): KLU Matrix is SINGULAR\n") ;
} }
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") ;
return E_SINGULAR ;
fprintf (stderr, "Warning (Factor): KLU Matrix is SINGULAR\n") ;
} }
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") ;
return E_SINGULAR ;
fprintf (stderr, "Warning (Factor) (CIDER): KLU Matrix is SINGULAR\n") ;
} }
return 0 ; return 0 ;
} }

33
src/maths/ni/niiter.c

@ -143,22 +143,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);
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 #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); */
@ -170,6 +181,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…
Cancel
Save