Added an option to still select SPARSE 1.3 even when KLU is compiled

However, in this case, KLU is selected by default
To enable SPARSE 1.3, please use the following syntax:
.OPTIONS sparse
in NON-capital letters
This commit is contained in:
Francesco Lannutti 2013-04-03 16:37:59 +02:00
parent bfe7a5444c
commit c84d46bab5
9 changed files with 50 additions and 5 deletions

View File

@ -281,6 +281,11 @@ struct CKTcircuit {
contains only linear elements */
unsigned int CKTnoopac:1; /* flag to indicate that OP will not be evaluated
during AC simulation */
#ifdef KLU
unsigned int CKTkluMODE:1 ;
#endif
};

View File

@ -120,6 +120,10 @@ typedef struct {
#define OPT_NOOPAC 68
#ifdef KLU
#define OPT_SPARSE 69
#endif
#ifdef XSPICE
/* gtri - begin - wbk - add new options */
#define OPT_ENH_NOOPALTER 100

View File

@ -48,7 +48,7 @@ typedef struct sSMPmatrix {
double **CKTdiag_CSC ; /* KLU pointer to diagonal element to perform Gmin */
int CKTkluN ; /* KLU N, copied */
int CKTklunz ; /* KLU nz, copied for AC Analysis */
int CKTkluMODE ; /* KLU MODE parameter to enable KLU or not from the heuristic */
unsigned int CKTkluMODE:1 ; /* KLU MODE parameter to enable KLU or not from the heuristic */
#define CKTkluON 1 /* KLU MODE ON definition */
#define CKTkluOFF 0 /* KLU MODE OFF definition */
#elif defined(SuperLU)
@ -71,7 +71,7 @@ typedef struct sSMPmatrix {
double **CKTdiag_CSC ;
int CKTsuperluN ;
int CKTsuperlunz ;
int CKTsuperluMODE ;
unsigned int CKTsuperluMODE:1 ;
#define CKTsuperluON 1 /* SuperLU MODE ON definition */
#define CKTsuperluOFF 0 /* SuperLU MODE OFF definition */
#elif defined(UMFPACK)
@ -88,7 +88,7 @@ typedef struct sSMPmatrix {
double **CKTdiag_CSC ;
int CKTumfpackN ;
int CKTumfpacknz ;
int CKTumfpackMODE ;
unsigned int CKTumfpackMODE:1 ;
#define CKTumfpackON 1 /* UMFPACK MODE ON definition */
#define CKTumfpackOFF 0 /* UMFPACK MODE OFF definition */
#endif

View File

@ -66,6 +66,11 @@ struct TSKtask {
double TSKabsDv; /* abs limit for iter-iter voltage change */
double TSKrelDv; /* rel limit for iter-iter voltage change */
unsigned int TSKnoopac:1; /* flag for no OP calculation before AC */
#ifdef KLU
unsigned int TSKkluMODE:1 ;
#endif
};
#endif

View File

@ -45,7 +45,7 @@ NIinit(CKTcircuit *ckt)
ckt->CKTmatrix->CKTdiag_CSC = NULL ;
ckt->CKTmatrix->CKTkluN = 0 ;
ckt->CKTmatrix->CKTklunz = 0 ;
ckt->CKTmatrix->CKTkluMODE = CKTkluON ; /* TO BE SUBSTITUTED WITH THE HEURISTICS */
ckt->CKTmatrix->CKTkluMODE = ckt->CKTkluMODE ; /* TO BE SUBSTITUTED WITH THE HEURISTICS */
klu_defaults (ckt->CKTmatrix->CKTkluCommon) ;

View File

@ -103,6 +103,11 @@ CKTdoJob(CKTcircuit *ckt, int reset, TSKtask *task)
ckt->CKTtroubleNode = 0;
ckt->CKTtroubleElt = NULL;
ckt->CKTnoopac = task->TSKnoopac && ckt->CKTisLinear;
#ifdef KLU
ckt->CKTkluMODE = task->TSKkluMODE ;
#endif
#ifdef NEWTRUNC
ckt->CKTlteReltol = task->TSKlteReltol;
ckt->CKTlteAbstol = task->TSKlteAbstol;

View File

@ -72,6 +72,11 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr)
tsk->TSKabsDv = def->TSKabsDv;
tsk->TSKrelDv = def->TSKrelDv;
tsk->TSKnoopac = def->TSKnoopac;
#ifdef KLU
tsk->TSKkluMODE = def->TSKkluMODE ;
#endif
#ifdef NEWTRUNC
tsk->TSKlteReltol = def->TSKlteReltol;
tsk->TSKlteAbstol = def->TSKlteAbstol;
@ -119,6 +124,10 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr)
tsk->TSKabsDv = 0.5;
tsk->TSKrelDv = 2.0;
#ifdef KLU
tsk->TSKkluMODE = CKTkluON ;
#endif
#if (1) /*CDHW*/
}
#endif

View File

@ -110,6 +110,8 @@ CKTsetup(CKTcircuit *ckt)
#if defined(KLU)
if (ckt->CKTmatrix->CKTkluMODE)
{
printf ("Using KLU as Direct Linear Solver\n") ;
int i ;
int n = SMPmatSize (ckt->CKTmatrix) ;
ckt->CKTmatrix->CKTkluN = n ;
@ -141,6 +143,8 @@ CKTsetup(CKTcircuit *ckt)
DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ;
} else {
printf ("Using SPARSE 1.3 as Direct Linear Solver\n") ;
}
#elif defined(SuperLU)
if (ckt->CKTmatrix->CKTsuperluMODE)

View File

@ -161,6 +161,13 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val)
case OPT_NOOPAC:
task->TSKnoopac = (val->iValue != 0);
break;
#ifdef KLU
case OPT_SPARSE:
task->TSKkluMODE = (val->iValue == 0) ;
break ;
#endif
/* gtri - begin - wbk - add new options */
#ifdef XSPICE
case OPT_EVT_MAX_OP_ALTER:
@ -313,7 +320,13 @@ static IFparm OPTtbl[] = {
{ "reldv", OPT_RELDV, IF_SET|IF_REAL,
"Maximum relative iter-iter node voltage change" },
{ "noopac", OPT_NOOPAC, IF_SET|IF_FLAG,
"No op calculation in ac if circuit is linear" }
"No op calculation in ac if circuit is linear" },
#ifdef KLU
{ "sparse", OPT_SPARSE, IF_SET|IF_FLAG,
"Set SPARSE 1.3 as Direct Linear Solver" }
#endif
};
int OPTcount = NUMELEMS(OPTtbl);