Browse Source

introduce option "epsmin"

To define a minimum argument for some log() function invocations.
(most notably for the diode saturation current 'is')
pre-master-46
h_vogt 9 years ago
committed by rlar
parent
commit
c82ee9d949
  1. 1
      src/frontend/com_option.c
  2. 1
      src/frontend/spiceif.c
  3. 2
      src/include/ngspice/cktdefs.h
  4. 1
      src/include/ngspice/optdefs.h
  5. 1
      src/include/ngspice/tskdefs.h
  6. 1
      src/spicelib/analysis/cktdojob.c
  7. 2
      src/spicelib/analysis/cktntask.c
  8. 7
      src/spicelib/analysis/cktsopt.c
  9. 1
      src/spicelib/devices/cktinit.c

1
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);

1
src/frontend/spiceif.c

@ -1411,6 +1411,7 @@ void com_snload(wordlist *wl)
_t(CKTintegrateMethod);
_t(CKTxmu);
_t(CKTindverbosity);
_t(CKTepsmin);
_t(CKTniState);

2
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;

1
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

1
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

1
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;

2
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*/
}

7
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);

1
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 */

Loading…
Cancel
Save