From c84d46bab5cb951b2ac1cfbf1c8bc2beb23a0ec8 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Wed, 3 Apr 2013 16:37:59 +0200 Subject: [PATCH] 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 --- src/include/ngspice/cktdefs.h | 5 +++++ src/include/ngspice/optdefs.h | 4 ++++ src/include/ngspice/smpdefs.h | 6 +++--- src/include/ngspice/tskdefs.h | 5 +++++ src/maths/ni/niinit.c | 2 +- src/spicelib/analysis/cktdojob.c | 5 +++++ src/spicelib/analysis/cktntask.c | 9 +++++++++ src/spicelib/analysis/cktsetup.c | 4 ++++ src/spicelib/analysis/cktsopt.c | 15 ++++++++++++++- 9 files changed, 50 insertions(+), 5 deletions(-) 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);