diff --git a/src/frontend/com_option.c b/src/frontend/com_option.c index 5ded8146e..e4f1804fd 100644 --- a/src/frontend/com_option.c +++ b/src/frontend/com_option.c @@ -82,6 +82,7 @@ com_option(wordlist *wl) #ifdef NEWTRUNC printf("ltereltol = %g\n", circuit->CKTlteReltol); printf("lteabstol = %g\n", circuit->CKTlteAbstol); + printf("ltetrtol = %g\n", circuit->CKTlteTrtol); #endif /* NEWTRUNC */ printf("\nConductances:\n"); diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 60a07db02..92f57e8d0 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -221,6 +221,7 @@ struct CKTcircuit { #ifdef NEWTRUNC double CKTlteReltol; double CKTlteAbstol; + double CKTlteTrtol; #endif /* NEWTRUNC */ double CKTgmin; /* .options GMIN */ double CKTgshunt; /* .options RSHUNT */ diff --git a/src/include/ngspice/optdefs.h b/src/include/ngspice/optdefs.h index 3455a2454..07dc8a90d 100644 --- a/src/include/ngspice/optdefs.h +++ b/src/include/ngspice/optdefs.h @@ -132,6 +132,12 @@ enum { OPT_KLU_MEMGROW_FACTOR, #endif +#ifdef NEWTRUNC + OPT_LTERELTOL, + OPT_LTEABSTOL, + OPT_LTETRTOL, +#endif + }; #ifdef XSPICE diff --git a/src/include/ngspice/tskdefs.h b/src/include/ngspice/tskdefs.h index 9d59bd4b4..588633b79 100644 --- a/src/include/ngspice/tskdefs.h +++ b/src/include/ngspice/tskdefs.h @@ -51,6 +51,7 @@ struct TSKtask { #ifdef NEWTRUNC double TSKlteReltol; double TSKlteAbstol; + double TSKlteTrtol; #endif /* NEWTRUNC */ double TSKgmin; double TSKgshunt; /* shunt conductance (CKTdiagGmin) */ diff --git a/src/spicelib/analysis/cktdojob.c b/src/spicelib/analysis/cktdojob.c index 627626a2e..c96d7cc04 100644 --- a/src/spicelib/analysis/cktdojob.c +++ b/src/spicelib/analysis/cktdojob.c @@ -117,6 +117,7 @@ CKTdoJob(CKTcircuit* ckt, int reset, TSKtask* task) #ifdef NEWTRUNC ckt->CKTlteReltol = task->TSKlteReltol; ckt->CKTlteAbstol = task->TSKlteAbstol; + ckt->CKTlteTrtol = task->TSKlteTrtol; #endif /* NEWTRUNC */ fprintf(stdout, "Doing analysis at TEMP = %f and TNOM = %f\n\n", diff --git a/src/spicelib/analysis/cktntask.c b/src/spicelib/analysis/cktntask.c index be681b2b6..8b6a1122f 100644 --- a/src/spicelib/analysis/cktntask.c +++ b/src/spicelib/analysis/cktntask.c @@ -85,6 +85,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) #ifdef NEWTRUNC tsk->TSKlteReltol = def->TSKlteReltol; tsk->TSKlteAbstol = def->TSKlteAbstol; + tsk->TSKlteTrtol = def->TSKlteTrtol; #endif } else { @@ -101,6 +102,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) #ifdef NEWTRUNC tsk->TSKlteReltol = 1e-3; tsk->TSKlteAbstol = 1e-6; + tsk->TSKlteTrtol = 7; #endif tsk->TSKtrtol = 7; tsk->TSKbypass = 0; diff --git a/src/spicelib/analysis/cktsopt.c b/src/spicelib/analysis/cktsopt.c index 0c1f723e1..00a2b9c7a 100644 --- a/src/spicelib/analysis/cktsopt.c +++ b/src/spicelib/analysis/cktsopt.c @@ -353,7 +353,13 @@ static IFparm OPTtbl[] = { { "klu", OPT_KLU, IF_SET|IF_FLAG, "Set KLU as Direct Linear Solver" }, { "klu_memgrow_factor", OPT_KLU_MEMGROW_FACTOR, IF_SET|IF_REAL, - "KLU Memory Grow Factor (default is 1.2)" } + "KLU Memory Grow Factor (default is 1.2)" }, +#endif + +#ifdef NEWTRUNC + { "ltereltol", OPT_RELTOL,IF_SET | IF_REAL ,"Relative error tolerence" }, + { "lteabstol", OPT_ABSTOL,IF_SET | IF_REAL,"Absolute error tolerence" }, + { "ltetrtol", OPT_TRTOL,IF_SET | IF_REAL,"Truncation error overestimation factor" } #endif }; diff --git a/src/spicelib/analysis/ckttrunc.c b/src/spicelib/analysis/ckttrunc.c index 0f3506636..898353be5 100644 --- a/src/spicelib/analysis/ckttrunc.c +++ b/src/spicelib/analysis/ckttrunc.c @@ -92,7 +92,7 @@ CKTtrunc(CKTcircuit *ckt, double *timeStep) #endif if(diff != 0) { // if (!AlmostEqualUlps(diff, 0, 10)) { - tmp = ckt->CKTtrtol * tol * 2 /diff; + tmp = ckt->CKTlteTrtol * tol * 2 /diff; tmp = ckt->CKTdeltaOld[0]*sqrt(fabs(tmp)); timetemp = MIN(timetemp,tmp); #ifdef STEPDEBUG @@ -118,7 +118,7 @@ CKTtrunc(CKTcircuit *ckt, double *timeStep) #endif if(diff != 0) { // if(!AlmostEqualUlps(diff, 0, 10)) { - tmp = tol * ckt->CKTtrtol * (ckt->CKTdeltaOld[0] + ckt->CKTdeltaOld[1]) + tmp = tol * ckt->CKTlteTrtol * (ckt->CKTdeltaOld[0] + ckt->CKTdeltaOld[1]) / (diff * ckt->CKTdelta); tmp = fabs(tmp); tmp = exp(log(tmp) / 3); @@ -160,7 +160,7 @@ CKTtrunc(CKTcircuit *ckt, double *timeStep) ckt->CKTpred[i]); #endif if(diff != 0) { - tmp = tol*ckt->CKTtrtol*delsum/(diff*ckt->CKTdelta); + tmp = tol*ckt->CKTlteTrtol*delsum/(diff*ckt->CKTdelta); tmp = fabs(tmp); switch(ckt->CKTorder) { case 0: