diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index f4b2aba47..452787130 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -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 + }; diff --git a/src/include/ngspice/optdefs.h b/src/include/ngspice/optdefs.h index 3c968e455..52aef8a1f 100644 --- a/src/include/ngspice/optdefs.h +++ b/src/include/ngspice/optdefs.h @@ -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 diff --git a/src/include/ngspice/smpdefs.h b/src/include/ngspice/smpdefs.h index 6c5d52eba..cde5d0610 100644 --- a/src/include/ngspice/smpdefs.h +++ b/src/include/ngspice/smpdefs.h @@ -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 diff --git a/src/include/ngspice/tskdefs.h b/src/include/ngspice/tskdefs.h index 2c39c02ec..c489fb080 100644 --- a/src/include/ngspice/tskdefs.h +++ b/src/include/ngspice/tskdefs.h @@ -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 diff --git a/src/maths/ni/niinit.c b/src/maths/ni/niinit.c index 8169de1e8..a30060392 100644 --- a/src/maths/ni/niinit.c +++ b/src/maths/ni/niinit.c @@ -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) ; diff --git a/src/spicelib/analysis/cktdojob.c b/src/spicelib/analysis/cktdojob.c index 8b995bb40..ffbfb37fb 100644 --- a/src/spicelib/analysis/cktdojob.c +++ b/src/spicelib/analysis/cktdojob.c @@ -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; diff --git a/src/spicelib/analysis/cktntask.c b/src/spicelib/analysis/cktntask.c index 7a0d5dcb5..50d8ea14c 100644 --- a/src/spicelib/analysis/cktntask.c +++ b/src/spicelib/analysis/cktntask.c @@ -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 diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index 4f214f5ea..6e2512004 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -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) diff --git a/src/spicelib/analysis/cktsopt.c b/src/spicelib/analysis/cktsopt.c index 22249abcd..9f8f377df 100644 --- a/src/spicelib/analysis/cktsopt.c +++ b/src/spicelib/analysis/cktsopt.c @@ -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);