From b5ccfca24b175dc0053055d8a1b43d634365c608 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 18 Dec 2016 11:42:10 +0100 Subject: [PATCH] implement option 'indverbosity' to control check of inductive systems default is 2, maximum verbosity option indverbosity=1 can be used to prevent check for "incomplete set of couplings" option indverbosity=0 can be used to avoid the check altogether set indverbosity=INTEGER or .option indverbosity=INTEGER works as well --- src/frontend/com_option.c | 1 + src/frontend/spiceif.c | 1 + src/include/ngspice/cktdefs.h | 1 + src/include/ngspice/optdefs.h | 1 + src/include/ngspice/tskdefs.h | 1 + src/spicelib/analysis/cktdojob.c | 1 + src/spicelib/analysis/cktntask.c | 3 +++ src/spicelib/analysis/cktsopt.c | 4 ++++ src/spicelib/devices/cktinit.c | 1 + src/spicelib/devices/ind/muttemp.c | 7 ++++--- 10 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/frontend/com_option.c b/src/frontend/com_option.c index a7f6ce420..318bf215f 100644 --- a/src/frontend/com_option.c +++ b/src/frontend/com_option.c @@ -47,6 +47,7 @@ com_option(wordlist *wl) } printf("MaxOrder = %d\n", circuit->CKTmaxOrder); printf("xmu = %g\n", circuit->CKTxmu); + printf("indverbosity = %d\n", circuit->CKTindverbosity); printf("\nTolerances (absolute):\n"); printf("abstol (current) = %g\n", circuit->CKTabstol); diff --git a/src/frontend/spiceif.c b/src/frontend/spiceif.c index 550559e53..0fe484e0e 100644 --- a/src/frontend/spiceif.c +++ b/src/frontend/spiceif.c @@ -1410,6 +1410,7 @@ void com_snload(wordlist *wl) _t(CKTmaxOrder); _t(CKTintegrateMethod); _t(CKTxmu); + _t(CKTindverbosity); _t(CKTniState); diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index eeff067e8..511cf6f22 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -102,6 +102,7 @@ struct CKTcircuit { int CKTmaxOrder; /* maximum integration method order */ int CKTintegrateMethod; /* the integration method to be used */ double CKTxmu; /* for trapezoidal method */ + int CKTindverbosity; /* control check of inductive couplings */ /* known integration methods */ #define TRAPEZOIDAL 1 diff --git a/src/include/ngspice/optdefs.h b/src/include/ngspice/optdefs.h index 53ec8df20..8e2226851 100644 --- a/src/include/ngspice/optdefs.h +++ b/src/include/ngspice/optdefs.h @@ -120,6 +120,7 @@ typedef struct { #define OPT_NOOPAC 68 #define OPT_XMU 69 +#define OPT_INDVERBOSITY 70 #ifdef XSPICE diff --git a/src/include/ngspice/tskdefs.h b/src/include/ngspice/tskdefs.h index 0c6620682..731bc3791 100644 --- a/src/include/ngspice/tskdefs.h +++ b/src/include/ngspice/tskdefs.h @@ -21,6 +21,7 @@ struct TSKtask { int TSKmaxOrder; /* maximum integration method order */ int TSKintegrateMethod; /* the integration method to be used */ double TSKxmu; /* for trapezoidal method */ + int TSKindverbosity; /* control check of inductive systems */ int TSKcurrentAnalysis; /* the analysis in progress (if any) */ /* defines for the value of TSKcurrentAnalysis */ diff --git a/src/spicelib/analysis/cktdojob.c b/src/spicelib/analysis/cktdojob.c index f233ea628..c055076b6 100644 --- a/src/spicelib/analysis/cktdojob.c +++ b/src/spicelib/analysis/cktdojob.c @@ -52,6 +52,7 @@ CKTdoJob(CKTcircuit *ckt, int reset, TSKtask *task) ckt->CKTnomTemp = task->TSKnomTemp; ckt->CKTmaxOrder = task->TSKmaxOrder; ckt->CKTintegrateMethod = task->TSKintegrateMethod; + ckt->CKTindverbosity = task->TSKindverbosity; ckt->CKTxmu = task->TSKxmu; ckt->CKTbypass = task->TSKbypass; ckt->CKTdcMaxIter = task->TSKdcMaxIter; diff --git a/src/spicelib/analysis/cktntask.c b/src/spicelib/analysis/cktntask.c index c811ce220..a790603db 100644 --- a/src/spicelib/analysis/cktntask.c +++ b/src/spicelib/analysis/cktntask.c @@ -39,6 +39,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) tsk->TSKnomTemp = def->TSKnomTemp; tsk->TSKmaxOrder = def->TSKmaxOrder; tsk->TSKintegrateMethod = def->TSKintegrateMethod; + tsk->TSKindverbosity = def->TSKindverbosity; tsk->TSKxmu = def->TSKxmu; tsk->TSKbypass = def->TSKbypass; tsk->TSKdcMaxIter = def->TSKdcMaxIter; @@ -99,6 +100,8 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) tsk->TSKdcTrcvMaxIter = 50; tsk->TSKintegrateMethod = TRAPEZOIDAL; tsk->TSKmaxOrder = 2; + /* full check, and full verbosity */ + tsk->TSKindverbosity = 2; /* * when using trapezoidal method * xmu=0: Backward Euler diff --git a/src/spicelib/analysis/cktsopt.c b/src/spicelib/analysis/cktsopt.c index ce9bc3c39..cb6ff5047 100644 --- a/src/spicelib/analysis/cktsopt.c +++ b/src/spicelib/analysis/cktsopt.c @@ -114,6 +114,9 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val) case OPT_BYPASS: task->TSKbypass = val->iValue; break; + case OPT_INDVERBOSITY: + task->TSKindverbosity = val->iValue; + break; case OPT_XMU: task->TSKxmu = val->rValue; break; @@ -268,6 +271,7 @@ static IFparm OPTtbl[] = { { "lvltim", 0, IF_INTEGER,"Type of timestep control" }, { "method", OPT_METHOD, IF_SET|IF_STRING,"Integration method" }, { "maxord", OPT_MAXORD, IF_SET|IF_INTEGER,"Maximum integration order" }, + { "indverbosity", OPT_INDVERBOSITY, IF_SET|IF_INTEGER,"Control Inductive Systems Check (coupling)" }, { "xmu", OPT_XMU, IF_SET|IF_REAL,"Coefficient for trapezoidal method" }, { "defm", OPT_DEFM,IF_SET|IF_REAL,"Default MOSfet Multiplier" }, { "defl", OPT_DEFL,IF_SET|IF_REAL,"Default MOSfet length" }, diff --git a/src/spicelib/devices/cktinit.c b/src/spicelib/devices/cktinit.c index 98582233f..caf45f901 100644 --- a/src/spicelib/devices/cktinit.c +++ b/src/spicelib/devices/cktinit.c @@ -65,6 +65,7 @@ CKTinit(CKTcircuit **ckt) /* new circuit to create */ sckt->CKTintegrateMethod = TRAPEZOIDAL; sckt->CKTorder = 1; sckt->CKTmaxOrder = 2; + sckt->CKTindverbosity = 2; sckt->CKTxmu = 0.5; sckt->CKTpivotAbsTol = 1e-13; sckt->CKTpivotRelTol = 1e-3; diff --git a/src/spicelib/devices/ind/muttemp.c b/src/spicelib/devices/ind/muttemp.c index abe92a2c0..2dc41d2c7 100644 --- a/src/spicelib/devices/ind/muttemp.c +++ b/src/spicelib/devices/ind/muttemp.c @@ -55,7 +55,8 @@ MUTtemp(GENmodel *inModel, CKTcircuit *ckt) */ here->MUTfactor = here->MUTcoupling * sqrt(fabs(ind1 * ind2)); - { + if (ckt->CKTindverbosity > 0) { + struct INDsystem *system; if (!here->MUTind1->system && !here->MUTind2->system) { @@ -179,7 +180,7 @@ MUTtemp(GENmodel *inModel, CKTcircuit *ckt) } } - if (!positive || repetitions || expect) { + if (!positive || repetitions || (expect && ckt->CKTindverbosity > 1)) { fprintf(stderr, "The Inductive System consisting of\n"); for (ind = system->first_ind; ind; ind = ind->system_next_ind) fprintf(stderr, " %s", ind->INDname); @@ -197,7 +198,7 @@ MUTtemp(GENmodel *inModel, CKTcircuit *ckt) fprintf(stderr, " %s < 0\n", ind->INDname); if (repetitions) fprintf(stderr, "has dupplicate K instances\n"); - if (expect) + if (expect && ckt->CKTindverbosity > 1) fprintf(stderr, "has an incomplete set of K couplings, (missing ones are implicitly 0)\n"); fprintf(stderr, "\n"); }