From c68f740e855653b0b8825f8b4d6a431e5be7b8c8 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 | 2 ++ 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, 15 insertions(+), 1 deletion(-) diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 3db63dfa1..fb3cd999e 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -303,6 +303,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 524dc5ef8..2c4711262 100644 --- a/src/include/ngspice/optdefs.h +++ b/src/include/ngspice/optdefs.h @@ -120,6 +120,8 @@ enum { OPT_XMU, OPT_INDVERBOSITY, OPT_EPSMIN, + OPT_SPARSE, + OPT_KLU_MEMGROW_FACTOR, }; #ifdef XSPICE diff --git a/src/include/ngspice/tskdefs.h b/src/include/ngspice/tskdefs.h index 67744f7ed..b6cd30edb 100644 --- a/src/include/ngspice/tskdefs.h +++ b/src/include/ngspice/tskdefs.h @@ -72,6 +72,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 497517267..e7ed839dc 100644 --- a/src/spicelib/analysis/cktdojob.c +++ b/src/spicelib/analysis/cktdojob.c @@ -110,6 +110,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 491a80dad..e67f8a8fa 100644 --- a/src/spicelib/analysis/cktntask.c +++ b/src/spicelib/analysis/cktntask.c @@ -78,6 +78,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) #ifdef KLU tsk->TSKkluMODE = def->TSKkluMODE; + tsk->TSKkluMemGrowFactor = def->TSKkluMemGrowFactor ; #endif #ifdef NEWTRUNC @@ -139,6 +140,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 501e36522..d1ad36477 100644 --- a/src/spicelib/analysis/cktsopt.c +++ b/src/spicelib/analysis/cktsopt.c @@ -177,6 +177,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 */ @@ -339,7 +343,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 };