From f8357dad886b67061e27951e22c02962a4c8fedd Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Fri, 2 Apr 2021 15:21:45 +0200 Subject: [PATCH] Prepare Cshunt: add a cpacitor to each voltage node Function inppas4() will add the extra caps, to be done. --- src/frontend/inp.c | 4 ++++ src/include/ngspice/cktdefs.h | 1 + src/include/ngspice/inpdefs.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 | 1 + src/spicelib/analysis/cktsopt.c | 4 ++++ visualc/vngspice.vcxproj | 2 ++ 9 files changed, 16 insertions(+) diff --git a/src/frontend/inp.c b/src/frontend/inp.c index 4bb004986..d04bbbaed 100644 --- a/src/frontend/inp.c +++ b/src/frontend/inp.c @@ -1336,6 +1336,10 @@ inp_dodeck( } } // if (!noparse) . . . + /* If option cshunt is given, add capacitors to each voltage node */ + if (ft_curckt->ci_defTask->TSKcshunt > 0.) + INPpas4(ckt, tab); + /* add title of deck to data base */ /* this won't work if the title is the empty string * cp_addkword() doesn't work for tt === "" diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index dd4686507..8cc4376f7 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -215,6 +215,7 @@ struct CKTcircuit { #endif /* NEWTRUNC */ double CKTgmin; /* .options GMIN */ double CKTgshunt; /* .options RSHUNT */ + double CKTcshunt; /* .options CSHUNT */ double CKTdelmin; /* minimum time step for tran analysis */ double CKTtrtol; /* .options TRTOL */ double CKTfinalTime; /* TSTOP */ diff --git a/src/include/ngspice/inpdefs.h b/src/include/ngspice/inpdefs.h index a391d1a94..40c9f5494 100644 --- a/src/include/ngspice/inpdefs.h +++ b/src/include/ngspice/inpdefs.h @@ -136,6 +136,7 @@ void INPpas1(CKTcircuit *, struct card *, INPtables *); void INPpas2(CKTcircuit *, struct card *, INPtables *, TSKtask *); void INPpas3( CKTcircuit *, struct card *, INPtables *, TSKtask *, IFparm *, int); +void INPpas4(CKTcircuit *, INPtables *); int INPpName(char *, IFvalue *, CKTcircuit *, int, GENinstance *); int INPtermInsert(CKTcircuit *, char **, INPtables *, CKTnode **); int INPtermSearch(CKTcircuit*, char**, INPtables*, CKTnode**); diff --git a/src/include/ngspice/optdefs.h b/src/include/ngspice/optdefs.h index 524dc5ef8..1bce23e77 100644 --- a/src/include/ngspice/optdefs.h +++ b/src/include/ngspice/optdefs.h @@ -120,6 +120,7 @@ enum { OPT_XMU, OPT_INDVERBOSITY, OPT_EPSMIN, + OPT_CSHUNT, }; #ifdef XSPICE diff --git a/src/include/ngspice/tskdefs.h b/src/include/ngspice/tskdefs.h index 1bba643ef..bc4d420fc 100644 --- a/src/include/ngspice/tskdefs.h +++ b/src/include/ngspice/tskdefs.h @@ -51,6 +51,7 @@ struct TSKtask { #endif /* NEWTRUNC */ double TSKgmin; double TSKgshunt; /* shunt conductance (CKTdiagGmin) */ + double TSKcshunt; /* shunt capacitor to ground */ double TSKdelmin; double TSKtrtol; double TSKdefaultMosM; diff --git a/src/spicelib/analysis/cktdojob.c b/src/spicelib/analysis/cktdojob.c index 5c87b2101..10c33d3ca 100644 --- a/src/spicelib/analysis/cktdojob.c +++ b/src/spicelib/analysis/cktdojob.c @@ -71,6 +71,7 @@ CKTdoJob(CKTcircuit *ckt, int reset, TSKtask *task) ckt->CKTvoltTol = task->TSKvoltTol; ckt->CKTgmin = task->TSKgmin; ckt->CKTgshunt = task->TSKgshunt; + ckt->CKTcshunt = task->TSKcshunt; ckt->CKTdelmin = task->TSKdelmin; ckt->CKTtrtol = task->TSKtrtol; #ifdef XSPICE diff --git a/src/spicelib/analysis/cktntask.c b/src/spicelib/analysis/cktntask.c index cb56373a3..ec7b8e5e6 100644 --- a/src/spicelib/analysis/cktntask.c +++ b/src/spicelib/analysis/cktntask.c @@ -86,6 +86,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) /* use the application defaults */ tsk->TSKgmin = 1e-12; tsk->TSKgshunt = 0; + tsk->TSKcshunt = -1; tsk->TSKabstol = 1e-12; tsk->TSKreltol = 1e-3; tsk->TSKchgtol = 1e-14; diff --git a/src/spicelib/analysis/cktsopt.c b/src/spicelib/analysis/cktsopt.c index 17db13d3b..1a36fb7bb 100644 --- a/src/spicelib/analysis/cktsopt.c +++ b/src/spicelib/analysis/cktsopt.c @@ -172,6 +172,9 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val) case OPT_EPSMIN: task->TSKepsmin = val->rValue; break; + case OPT_CSHUNT: + task->TSKcshunt = val->rValue; + break; /* gtri - begin - wbk - add new options */ #ifdef XSPICE case OPT_EVT_MAX_OP_ALTER: @@ -238,6 +241,7 @@ static IFparm OPTtbl[] = { { "rshunt", OPT_ENH_RSHUNT, IF_SET|IF_REAL, "Shunt resistance from analog nodes to ground" }, /* gtri - end - wbk - add new options */ #endif + { "cshunt", OPT_CSHUNT, IF_SET|IF_REAL, "Shunt capacitor from analog nodes to ground" }, { "noopiter", OPT_NOOPITER,IF_SET|IF_FLAG,"Go directly to gmin stepping" }, { "gmin", OPT_GMIN,IF_SET|IF_REAL,"Minimum conductance" }, { "gshunt", OPT_GSHUNT,IF_SET|IF_REAL,"Shunt conductance" }, diff --git a/visualc/vngspice.vcxproj b/visualc/vngspice.vcxproj index 056d32512..4b8871115 100644 --- a/visualc/vngspice.vcxproj +++ b/visualc/vngspice.vcxproj @@ -1336,6 +1336,7 @@ + @@ -2655,6 +2656,7 @@ +