From 49f64449574cefe1acde4757b6d29eb1a12e5b54 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 30 Jun 2020 23:10:23 +0200 Subject: [PATCH] Added "klu_memgrow_factor" option to control the KLU memory grow factor --- src/include/ngspice/cktdefs.h | 1 + src/include/ngspice/optdefs.h | 6 ++++++ src/include/ngspice/tskdefs.h | 1 + src/maths/ni/niinit.c | 1 + src/spicelib/analysis/cktdojob.c | 1 + src/spicelib/analysis/cktntask.c | 2 ++ src/spicelib/analysis/cktsopt.c | 8 +++++++- 7 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 20a09057b..b4cbef2ee 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -328,6 +328,7 @@ struct CKTcircuit { #ifdef KLU unsigned int CKTkluMODE:1; + unsigned int CKTkluMemGrowFactor : 1 ; #endif }; diff --git a/src/include/ngspice/optdefs.h b/src/include/ngspice/optdefs.h index 1bce23e77..a39f57b23 100644 --- a/src/include/ngspice/optdefs.h +++ b/src/include/ngspice/optdefs.h @@ -121,6 +121,12 @@ enum { OPT_INDVERBOSITY, OPT_EPSMIN, OPT_CSHUNT, + +#ifdef KLU + OPT_SPARSE, + OPT_KLU_MEMGROW_FACTOR, +#endif + }; #ifdef XSPICE diff --git a/src/include/ngspice/tskdefs.h b/src/include/ngspice/tskdefs.h index e2a6e9387..7f624d5e2 100644 --- a/src/include/ngspice/tskdefs.h +++ b/src/include/ngspice/tskdefs.h @@ -76,6 +76,7 @@ struct TSKtask { #ifdef KLU unsigned int TSKkluMODE:1; + unsigned int TSKkluMemGrowFactor : 1 ; #endif }; diff --git a/src/maths/ni/niinit.c b/src/maths/ni/niinit.c index 301269de5..968562f43 100644 --- a/src/maths/ni/niinit.c +++ b/src/maths/ni/niinit.c @@ -48,6 +48,7 @@ NIinit(CKTcircuit *ckt) ckt->CKTmatrix->CKTkluMODE = ckt->CKTkluMODE ; /* TO BE SUBSTITUTED WITH THE HEURISTICS */ klu_defaults (ckt->CKTmatrix->CKTkluCommon) ; + ckt->CKTmatrix->CKTkluCommon->memgrow = ckt->CKTkluMemGrowFactor ; #endif ckt->CKTniState = NIUNINITIALIZED; diff --git a/src/spicelib/analysis/cktdojob.c b/src/spicelib/analysis/cktdojob.c index b4a0d56c7..9b12fb097 100644 --- a/src/spicelib/analysis/cktdojob.c +++ b/src/spicelib/analysis/cktdojob.c @@ -111,6 +111,7 @@ CKTdoJob(CKTcircuit* ckt, int reset, TSKtask* task) #ifdef KLU ckt->CKTkluMODE = task->TSKkluMODE; + ckt->CKTkluMemGrowFactor = task->TSKkluMemGrowFactor ; #endif #ifdef NEWTRUNC diff --git a/src/spicelib/analysis/cktntask.c b/src/spicelib/analysis/cktntask.c index 146225685..2ad44e3b0 100644 --- a/src/spicelib/analysis/cktntask.c +++ b/src/spicelib/analysis/cktntask.c @@ -79,6 +79,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) #ifdef KLU tsk->TSKkluMODE = def->TSKkluMODE; + tsk->TSKkluMemGrowFactor = def->TSKkluMemGrowFactor ; #endif #ifdef NEWTRUNC @@ -141,6 +142,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) #ifdef KLU tsk->TSKkluMODE = CKTkluON; + tsk->TSKkluMemGrowFactor = 1.2 ; #endif #if (1) /*CDHW*/ diff --git a/src/spicelib/analysis/cktsopt.c b/src/spicelib/analysis/cktsopt.c index f37688c54..f4f8ddb45 100644 --- a/src/spicelib/analysis/cktsopt.c +++ b/src/spicelib/analysis/cktsopt.c @@ -180,6 +180,10 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val) case OPT_SPARSE: task->TSKkluMODE = (val->iValue == 0); break; + + case OPT_KLU_MEMGROW_FACTOR: + task->TSKkluMemGrowFactor = (val->rValue == 1.2); + break; #endif /* gtri - begin - wbk - add new options */ @@ -343,7 +347,9 @@ static IFparm OPTtbl[] = { #ifdef KLU { "sparse", OPT_SPARSE, IF_SET|IF_FLAG, - "Set SPARSE 1.3 as Direct Linear Solver" } + "Set SPARSE 1.3 as Direct Linear Solver" }, + { "klu_memgrow_factor", OPT_KLU_MEMGROW_FACTOR, IF_SET|IF_FLAG, + "KLU Memory Grow Factor (default is 1.2)" } #endif };