Fixed the case when DiagGmin has to not be loaded again and the case when refactoring returns 1

This commit is contained in:
Francesco Lannutti 2020-10-21 00:50:30 +02:00 committed by Holger Vogt
parent 1ee798ec9d
commit 3c15993fe5
3 changed files with 31 additions and 2 deletions

View File

@ -982,6 +982,7 @@ typedef struct sKLUmatrix {
unsigned int KLUmatrixLinkedListNZ ; /* KLU nz for the Initial Parsing */
double *KLUmatrixTrashCOO ; /* KLU COO Trash Pointer for Ground Node not Stored in the Matrix */
double **KLUmatrixDiag ; /* KLU pointer to diagonal element to perform Gmin */
unsigned int KLUloadDiagGmin:1 ; /* KLU flag to load Diag Gmin */
#ifdef CIDER
int *KLUmatrixColCOOforCIDER ; /* KLU Col Index for COO storage (for CIDER) */

View File

@ -477,7 +477,9 @@ SMPluFac (SMPmatrix *Matrix, double PivTol, double Gmin)
if (Matrix->CKTkluMODE)
{
LoadGmin_CSC (Matrix->SMPkluMatrix->KLUmatrixDiag, Matrix->SMPkluMatrix->KLUmatrixN, Gmin) ;
if (Matrix->SMPkluMatrix->KLUloadDiagGmin) {
LoadGmin_CSC (Matrix->SMPkluMatrix->KLUmatrixDiag, Matrix->SMPkluMatrix->KLUmatrixN, Gmin) ;
}
ret = klu_refactor (Matrix->SMPkluMatrix->KLUmatrixAp, Matrix->SMPkluMatrix->KLUmatrixAi, Matrix->SMPkluMatrix->KLUmatrixAx,
Matrix->SMPkluMatrix->KLUmatrixSymbolic, Matrix->SMPkluMatrix->KLUmatrixNumeric, Matrix->SMPkluMatrix->KLUmatrixCommon) ;
@ -619,7 +621,9 @@ SMPreorder (SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin)
{
if (Matrix->CKTkluMODE)
{
LoadGmin_CSC (Matrix->SMPkluMatrix->KLUmatrixDiag, Matrix->SMPkluMatrix->KLUmatrixN, Gmin) ;
if (Matrix->SMPkluMatrix->KLUloadDiagGmin) {
LoadGmin_CSC (Matrix->SMPkluMatrix->KLUmatrixDiag, Matrix->SMPkluMatrix->KLUmatrixN, Gmin) ;
}
Matrix->SMPkluMatrix->KLUmatrixCommon->tol = PivRel ;
if (Matrix->SMPkluMatrix->KLUmatrixNumeric != NULL) {

View File

@ -112,6 +112,11 @@ NIiter(CKTcircuit *ckt, int maxIter)
if (ckt->CKTniState & NISHOULDREORDER) {
startTime = SPfrontEnd->IFseconds();
#ifdef KLU
ckt->CKTmatrix->SMPkluMatrix->KLUloadDiagGmin = 1 ;
#endif
error = SMPreorder(ckt->CKTmatrix, ckt->CKTpivotAbsTol,
ckt->CKTpivotRelTol, ckt->CKTdiagGmin);
ckt->CKTstat->STATreorderTime +=
@ -139,6 +144,11 @@ NIiter(CKTcircuit *ckt, int maxIter)
ckt->CKTniState &= ~NISHOULDREORDER;
} else {
startTime = SPfrontEnd->IFseconds();
#ifdef KLU
ckt->CKTmatrix->SMPkluMatrix->KLUloadDiagGmin = 1 ;
#endif
error = SMPluFac(ckt->CKTmatrix, ckt->CKTpivotAbsTol,
ckt->CKTdiagGmin);
ckt->CKTstat->STATdecompTime +=
@ -155,6 +165,7 @@ NIiter(CKTcircuit *ckt, int maxIter)
fprintf (stderr, "Warning: KLU ReFactor failed. Factoring again...\n") ;
ckt->CKTniState |= NISHOULDREORDER;
ckt->CKTmatrix->SMPkluMatrix->KLUloadDiagGmin = 0 ;
error = SMPreorder(ckt->CKTmatrix, ckt->CKTpivotAbsTol, ckt->CKTpivotRelTol, ckt->CKTdiagGmin);
ckt->CKTstat->STATreorderTime += SPfrontEnd->IFseconds() - startTime;
if (error) {
@ -171,6 +182,19 @@ NIiter(CKTcircuit *ckt, int maxIter)
FREE(OldCKTstate0);
return(error);
}
} else 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) {