diff --git a/src/frontend/com_option.c b/src/frontend/com_option.c index 318bf215f..877c3bd9e 100644 --- a/src/frontend/com_option.c +++ b/src/frontend/com_option.c @@ -48,6 +48,7 @@ com_option(wordlist *wl) printf("MaxOrder = %d\n", circuit->CKTmaxOrder); printf("xmu = %g\n", circuit->CKTxmu); printf("indverbosity = %d\n", circuit->CKTindverbosity); + printf("epsmin = %g\n", circuit->CKTepsmin); printf("\nTolerances (absolute):\n"); printf("abstol (current) = %g\n", circuit->CKTabstol); diff --git a/src/frontend/spiceif.c b/src/frontend/spiceif.c index 0fe484e0e..d0cf6fd83 100644 --- a/src/frontend/spiceif.c +++ b/src/frontend/spiceif.c @@ -1411,6 +1411,7 @@ void com_snload(wordlist *wl) _t(CKTintegrateMethod); _t(CKTxmu); _t(CKTindverbosity); + _t(CKTepsmin); _t(CKTniState); diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index ed52166b2..f7777ae1d 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -293,6 +293,8 @@ struct CKTcircuit { a safe operating area (SOA) check is executed */ int CKTsoaMaxWarns; /* specifies the maximum number of SOA warnings */ + double CKTepsmin; /* minimum argument value for some log functions, e.g. diode saturation current*/ + NGHASHPTR DEVnameHash; NGHASHPTR MODnameHash; diff --git a/src/include/ngspice/optdefs.h b/src/include/ngspice/optdefs.h index 8e2226851..bca139d06 100644 --- a/src/include/ngspice/optdefs.h +++ b/src/include/ngspice/optdefs.h @@ -121,6 +121,7 @@ typedef struct { #define OPT_NOOPAC 68 #define OPT_XMU 69 #define OPT_INDVERBOSITY 70 +#define OPT_EPSMIN 71 #ifdef XSPICE diff --git a/src/include/ngspice/tskdefs.h b/src/include/ngspice/tskdefs.h index 731bc3791..1bba643ef 100644 --- a/src/include/ngspice/tskdefs.h +++ b/src/include/ngspice/tskdefs.h @@ -68,6 +68,7 @@ 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 */ + double TSKepsmin; /* minimum value for log */ }; #endif diff --git a/src/spicelib/analysis/cktdojob.c b/src/spicelib/analysis/cktdojob.c index 04944ebab..fc52981bb 100644 --- a/src/spicelib/analysis/cktdojob.c +++ b/src/spicelib/analysis/cktdojob.c @@ -106,6 +106,7 @@ CKTdoJob(CKTcircuit *ckt, int reset, TSKtask *task) ckt->CKTtroubleNode = 0; ckt->CKTtroubleElt = NULL; ckt->CKTnoopac = task->TSKnoopac && ckt->CKTisLinear; + ckt->CKTepsmin = task->TSKepsmin; #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 a790603db..cb56373a3 100644 --- a/src/spicelib/analysis/cktntask.c +++ b/src/spicelib/analysis/cktntask.c @@ -74,6 +74,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) tsk->TSKabsDv = def->TSKabsDv; tsk->TSKrelDv = def->TSKrelDv; tsk->TSKnoopac = def->TSKnoopac; + tsk->TSKepsmin = def->TSKepsmin; #ifdef NEWTRUNC tsk->TSKlteReltol = def->TSKlteReltol; tsk->TSKlteAbstol = def->TSKlteAbstol; @@ -129,6 +130,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) tsk->TSKnodeDamping = 0; tsk->TSKabsDv = 0.5; tsk->TSKrelDv = 2.0; + tsk->TSKepsmin = 1e-28; #if (1) /*CDHW*/ } diff --git a/src/spicelib/analysis/cktsopt.c b/src/spicelib/analysis/cktsopt.c index cb6ff5047..88cb6fbc7 100644 --- a/src/spicelib/analysis/cktsopt.c +++ b/src/spicelib/analysis/cktsopt.c @@ -169,6 +169,9 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val) case OPT_NOOPAC: task->TSKnoopac = (val->iValue != 0); break; + case OPT_EPSMIN: + task->TSKepsmin = val->rValue; + break; /* gtri - begin - wbk - add new options */ #ifdef XSPICE case OPT_EVT_MAX_OP_ALTER: @@ -323,7 +326,9 @@ 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" }, + { "epsmin", OPT_EPSMIN, IF_SET|IF_REAL, + "Minimum value for log" } }; int OPTcount = NUMELEMS(OPTtbl); diff --git a/src/spicelib/devices/cktinit.c b/src/spicelib/devices/cktinit.c index caf45f901..4e9119c0d 100644 --- a/src/spicelib/devices/cktinit.c +++ b/src/spicelib/devices/cktinit.c @@ -96,6 +96,7 @@ CKTinit(CKTcircuit **ckt) /* new circuit to create */ sckt->CKTvarHertz = 0; sckt->DEVnameHash = nghash_init_pointer(100); sckt->MODnameHash = nghash_init_pointer(100); + sckt->CKTepsmin = 1e-28; #ifdef XSPICE /* gtri - begin - wbk - allocate/initialize substructs */