Browse Source

few optimizations for diode recombination current calculation

pre-master-46
dwarning 8 years ago
parent
commit
60a35725f5
  1. 23
      src/spicelib/devices/dio/dioload.c

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

Loading…
Cancel
Save