Fixed DiagGmin Stepping Algorithm

This commit is contained in:
Francesco Lannutti 2013-09-28 11:54:48 +02:00 committed by rlar
parent 962c73e14e
commit debb5b8ece
6 changed files with 50 additions and 2 deletions

View File

@ -107,6 +107,11 @@ struct CKTcircuit {
#define GEAR 2 #define GEAR 2
SMPmatrix *CKTmatrix; /* pointer to sparse matrix */ SMPmatrix *CKTmatrix; /* pointer to sparse matrix */
/*!!*/
/* GMIN Stepping */
double **CKTdiag ; /* Vector of pointers to the real diagonal elements */
int CKTniState; /* internal state */ int CKTniState; /* internal state */
double *CKTrhs; /* current rhs value - being loaded */ double *CKTrhs; /* current rhs value - being loaded */
double *CKTrhsOld; /* previous rhs value for convergence double *CKTrhsOld; /* previous rhs value for convergence

View File

@ -33,6 +33,14 @@ NIreinit( CKTcircuit *ckt)
CKALLOC(CKTirhs,size+1,double); CKALLOC(CKTirhs,size+1,double);
CKALLOC(CKTirhsOld,size+1,double); CKALLOC(CKTirhsOld,size+1,double);
CKALLOC(CKTirhsSpare,size+1,double); CKALLOC(CKTirhsSpare,size+1,double);
/*!!*/
/* GMIN Stepping */
int i ;
CKALLOC(CKTdiag,size+1,double*);
for (i = 0 ; i <= size ; i++)
ckt->CKTdiag [i] = NULL ;
#ifdef PREDICTOR #ifdef PREDICTOR
CKALLOC(CKTpred,size+1,double); CKALLOC(CKTpred,size+1,double);
for( i=0;i<8;i++) { for( i=0;i<8;i++) {

View File

@ -106,6 +106,7 @@ extern double scalbn(double, int);
extern double logb(double); extern double logb(double);
#endif #endif
/*!!*/
static void LoadGmin(SMPmatrix *Matrix, double Gmin); static void LoadGmin(SMPmatrix *Matrix, double Gmin);
@ -170,7 +171,10 @@ SMPluFac(SMPmatrix *Matrix, double PivTol, double Gmin)
{ {
NG_IGNORE(PivTol); NG_IGNORE(PivTol);
spSetReal( Matrix ); spSetReal( Matrix );
LoadGmin( Matrix, Gmin );
/*!!*/
// LoadGmin( Matrix, Gmin );
return spFactor( Matrix ); return spFactor( Matrix );
} }
@ -194,7 +198,10 @@ int
SMPreorder(SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin) SMPreorder(SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin)
{ {
spSetReal( Matrix ); spSetReal( Matrix );
LoadGmin( Matrix, Gmin );
/*!!*/
// LoadGmin( Matrix, Gmin );
return spOrderAndFactor( Matrix, NULL, return spOrderAndFactor( Matrix, NULL,
PivRel, PivTol, YES ); PivRel, PivTol, YES );
} }
@ -419,6 +426,7 @@ SMPcDProd(SMPmatrix *Matrix, SPcomplex *pMantissa, int *pExponent)
* for compatibility with Spice3. * for compatibility with Spice3.
*/ */
/*!!*/
static void static void
LoadGmin(SMPmatrix *Matrix, double Gmin) LoadGmin(SMPmatrix *Matrix, double Gmin)
{ {

View File

@ -294,8 +294,10 @@ SwapCols( MatrixPtr Matrix, ElementPtr pTwin1, ElementPtr pTwin2 )
Matrix->ExtToIntColMap[Matrix->IntToExtColMap[Col1]]=Col1; Matrix->ExtToIntColMap[Matrix->IntToExtColMap[Col1]]=Col1;
#endif #endif
/*!!*/
Matrix->Diag[Col1] = pTwin2; Matrix->Diag[Col1] = pTwin2;
Matrix->Diag[Col2] = pTwin1; Matrix->Diag[Col2] = pTwin1;
Matrix->NumberOfInterchangesIsOdd = !Matrix->NumberOfInterchangesIsOdd; Matrix->NumberOfInterchangesIsOdd = !Matrix->NumberOfInterchangesIsOdd;
return; return;
} }

View File

@ -74,6 +74,15 @@ CKTload(CKTcircuit *ckt)
} }
} }
/*!!*/
/* GMIN Stepping */
for (i = 1 ; i <= size ; i++)
{
if (ckt->CKTdiag [i] != NULL)
{
*(ckt->CKTdiag [i]) += ckt->CKTdiagGmin ;
}
}
#ifdef XSPICE #ifdef XSPICE
/* gtri - add - wbk - 11/26/90 - reset the MIF init flags */ /* gtri - add - wbk - 11/26/90 - reset the MIF init flags */

View File

@ -127,6 +127,22 @@ CKTsetup(CKTcircuit *ckt)
/* gtri - end - Setup for adding rshunt option resistors */ /* gtri - end - Setup for adding rshunt option resistors */
#endif #endif
/*!!*/
/* GMIN Stepping */
CKTnode *node ;
node = ckt->CKTnodes ;
for (i = 1 ; i <= SMPmatSize (ckt->CKTmatrix) ; i++)
{
node = node->next ;
if (node->type == SP_VOLTAGE)
{
ckt->CKTdiag [i] = SMPmakeElt (ckt->CKTmatrix, i, i) ;
}
}
return(OK); return(OK);
} }