From 60a35725f59649fd4b93d7f984d589f55135b539 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 22 Jul 2018 10:18:52 +0200 Subject: [PATCH] few optimizations for diode recombination current calculation --- src/spicelib/devices/dio/dioload.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/spicelib/devices/dio/dioload.c b/src/spicelib/devices/dio/dioload.c index e991cd302..69c17e964 100644 --- a/src/spicelib/devices/dio/dioload.c +++ b/src/spicelib/devices/dio/dioload.c @@ -46,7 +46,7 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt) double evd; double evrev; double gd, gdb, gdsw, gen_fac, gen_fac_vd; - double evd_rec, cdb_rec, gdb_rec; + double t1, evd_rec, cdb_rec, gdb_rec; double geq; double gspr; /* area-scaled conductance */ double sarg; @@ -235,15 +235,18 @@ next1: if (model->DIOsatSWCurGiven) { /* sidewall current */ evd = exp(vd/vte); cdb = csat*(evd-1); gdb = csat*evd/vte; - evd_rec = exp(vd/(model->DIOrecEmissionCoeff*vt)); /* recombination current */ - cdb_rec = here->DIOtRecSatCur*(evd_rec-1); - gdb_rec = here->DIOtRecSatCur*evd_rec/vt; - gen_fac = pow((pow((1-vd/here->DIOtJctPot), 2) + 0.005), here->DIOtGradingCoeff/2); - gen_fac_vd = here->DIOtGradingCoeff * (1-vd/here->DIOtJctPot) * pow((pow((1-vd/here->DIOtJctPot), 2) + 0.005), here->DIOtGradingCoeff/2-1); - cdb_rec = cdb_rec * gen_fac; - gdb_rec = gdb_rec * gen_fac + cdb_rec * gen_fac_vd; - cdb = cdb + cdb_rec; - gdb = gdb + gdb_rec; + if (model->DIOrecSatCurGiven) { /* recombination current */ + evd_rec = exp(vd/(model->DIOrecEmissionCoeff*vt)); + cdb_rec = here->DIOtRecSatCur*(evd_rec-1); + gdb_rec = here->DIOtRecSatCur*evd_rec/vt; + t1 = pow((1-vd/here->DIOtJctPot), 2) + 0.005; + gen_fac = pow(t1, here->DIOtGradingCoeff/2); + gen_fac_vd = here->DIOtGradingCoeff * (1-vd/here->DIOtJctPot) * pow(t1, (here->DIOtGradingCoeff/2-1)); + cdb_rec = cdb_rec * gen_fac; + gdb_rec = gdb_rec * gen_fac + cdb_rec * gen_fac_vd; + cdb = cdb + cdb_rec; + gdb = gdb + gdb_rec; + } } else if((!(model->DIObreakdownVoltageGiven)) || vd >= -here->DIOtBrkdwnV) { /* reverse */