introduce option "epsmin"

To define a minimum argument for some log() function invocations.
(most notably for the diode saturation current 'is')
This commit is contained in:
h_vogt 2017-04-02 01:17:27 +02:00 committed by rlar
parent 78cc48575b
commit c82ee9d949
9 changed files with 16 additions and 1 deletions

View File

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

View File

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

View File

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

View File

@ -121,6 +121,7 @@ typedef struct {
#define OPT_NOOPAC 68
#define OPT_XMU 69
#define OPT_INDVERBOSITY 70
#define OPT_EPSMIN 71
#ifdef XSPICE

View File

@ -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

View File

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

View File

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

View File

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

View File

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