From 0d59e12518a542e4a305c9067ba0f17d62ef1371 Mon Sep 17 00:00:00 2001 From: Markus Mueller Date: Tue, 2 Jun 2020 19:13:50 +0200 Subject: [PATCH] fixed avalanche --- src/spicelib/devices/hicum2/hicum2conv.c | 2 +- src/spicelib/devices/hicum2/hicumL2.cpp | 54 +++++++++++++++--------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2conv.c b/src/spicelib/devices/hicum2/hicum2conv.c index 05be76650..305d9b3c1 100644 --- a/src/spicelib/devices/hicum2/hicum2conv.c +++ b/src/spicelib/devices/hicum2/hicum2conv.c @@ -38,7 +38,7 @@ HICUMconvTest(GENmodel *inModel, CKTcircuit *ckt) double ibpcihat; double ibpsihat; double isicihat; - double ithhat; + double volatile ithhat; double Vbiei, Vbici, Vciei, Vbpei, Vbpbi, Vbpci, Vbci, Vsici, Vrth; double Ibiei, Ibici, Iciei, Ibpei, Ibpbi, Ibpci, Ibpsi, Isici, Ith; diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index 76876557b..404ec266d 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -482,10 +482,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Ibiei, Ibiei_Vbiei, Ibiei_Vbici; double Ibici, Ibici_Vbici, Ibici_Vbiei; double Ibpei, Ibpei_Vbpei; - double Ibpci, Ibpci_Vbpci; + double Ibpci=0, Ibpci_Vbpci; double Isici, Isici_Vsici;// double Isc=0, Isc_Vsc=0; - double Iciei, Iciei_Vbiei, Iciei_Vbici, Iciei_dT; + double volatile Iciei, Iciei_Vbiei, Iciei_Vbici, Iciei_dT; double Ibbp_Vbbp=0; double Isis_Vsis; double Ieie, Ieie_Veie=0; @@ -885,9 +885,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) std::function calc_iavl = [&](duals::duald Vbici, duals::duald Cjci, duals::duald itf, duals::duald T){ //Avalanche current duals::duald iavl; - iavl = 0; if (use_aval == 1) {//begin : HICAVL - duals::duald v_bord,v_q,U0,av,avl,iavl, cjci0_t, vdci_t, qavl_t,favl_t, kavl_t; + duals::duald v_bord,v_q,U0,av,avl,cjci0_t, vdci_t, qavl_t,favl_t, kavl_t; double T_dpart = T.dpart(); cjci0_t = here->HICUMcjci0_t.rpart; vdci_t = here->HICUMvdci_t.rpart; @@ -926,9 +925,19 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) } else { iavl = itf*avl; } + // if (avl > 0 && iavl==0){ + // printf("error"); + // fflush(stdout); + // } } else { iavl = 0.0; + // printf("error"); + // fflush(stdout); } + } else{ + iavl = 0; + // printf("error"); + // fflush(stdout); } // Note that iavl = 0.0 is already set in the initialization block for use_aval == 0 (Markus: not for this lambda!) return iavl; @@ -1704,6 +1713,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbci = model->HICUMtype*Vbci; Vsici = model->HICUMtype*Vsici; Vsc = model->HICUMtype*Vsc; + Vrth = model->HICUMtype*Vrth; if (model->HICUMflsh!=0 && model->HICUMrth >= MIN_R) { // Thermal_update_with_self_heating here->HICUMtemp = ckt->CKTtemp+Vrth; @@ -2042,12 +2052,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Q_bf_Vbici+= Q_bf_dT_f0*T_f0_Vbici; Tf_Vbici += Tf_dT_f0*T_f0_Vbici; - itf_Vbici += itf_dT_f0*T_f0_Vbici; - itr_Vbici += itr_dT_f0*T_f0_Vbici; - Qf_Vbici += Qf_dT_f0*T_f0_Vbici; - Qr_Vbici += Qr_dT_f0*T_f0_Vbici; - Q_bf_Vbici+= Q_bf_dT_f0*T_f0_Vbici; - Tf_Vbici += Tf_dT_f0*T_f0_Vbici; + itf_dT += itf_dT_f0*T_f0_dT; + itr_dT += itr_dT_f0*T_f0_dT; + Qf_dT += Qf_dT_f0*T_f0_dT; + Qr_dT += Qr_dT_f0*T_f0_dT; + Q_bf_dT += Q_bf_dT_f0*T_f0_dT; + Tf_dT += Tf_dT_f0*T_f0_dT; // add derivatives of ick=f(Vciei, T) itf_Vciei += itf_dick*ick_Vciei; @@ -2112,15 +2122,18 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) result = calc_iavl(Vbici+1_e, Cjci , itf , here->HICUMtemp); iavl = result.rpart(); iavl_Vbici = result.dpart(); + result = calc_iavl(Vbici , Cjci+1_e, itf , here->HICUMtemp); iavl_dCjci = result.dpart(); iavl_Vbici += iavl_dCjci*Cjci_Vbici; + result = calc_iavl(Vbici , Cjci , itf+1_e, here->HICUMtemp); iavl_ditf = result.dpart(); iavl_Vbici += iavl_ditf*itf_Vbici; iavl_Vbiei = iavl_ditf*itf_Vbiei; + result = calc_iavl(Vbici , Cjci , itf , here->HICUMtemp+1_e); - iavl_dT = result.dpart(); //TODO done: derivatives kavl_t favl_t qavl_t cjci0_t vdci_t + iavl_dT = result.dpart(); iavl_dT += iavl_ditf*itf_dT + iavl_dCjci*Cjci_dT; here->HICUMiavl = iavl; @@ -2221,7 +2234,6 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ieie = Veie/here->HICUMre_t.rpart; // only needed for re flicker noise //Diode current for s-c junction (si,ci) - //HICDIO(here->HICUMvt,model->HICUMiscs,here->HICUMiscs_t,model->HICUMmsc,Vsici,&ijsc,&Isici_Vsici); hicum_diode(here->HICUMtemp,here->HICUMiscs_t,model->HICUMmsc, Vsici, &ijsc, &ijsc_Vsici, &ijsc_dT); // Self-heating calculation @@ -2230,9 +2242,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) // assuming Vciei_dT and Vbici_dT are 0 pterm_dT = (Vbiei-Vbici)*it_dT + (here->HICUMvdci_t.rpart-Vbici)*iavl_dT + here->HICUMvdci_t.dpart*iavl; } else if (model->HICUMflsh == 2 && model->HICUMrth >= MIN_R) { - pterm = Vciei*it + (here->HICUMvdci_t.rpart-Vbici)*iavl + ibei*Vbiei + ibci*Vbici + ibep*Vbpei + ijbcx*Vbpci + ijsc*Vsici; + pterm = (Vbiei-Vbici)*it + (here->HICUMvdci_t.rpart-Vbici)*iavl + ibei*Vbiei + ibci*Vbici + ibep*Vbpei + ijbcx*Vbpci + ijsc*Vsici; // assuming Vciei_dT, Vbiei_dT, Vbpei_dT, Vbpci_dT, Vsici and Vbici_dT are 0 - pterm_dT = Vciei*it_dT + (here->HICUMvdci_t.rpart-Vbici)*iavl_dT + here->HICUMvdci_t.dpart*iavl + + pterm_dT = (Vbiei-Vbici)*it_dT + (here->HICUMvdci_t.rpart-Vbici)*iavl_dT + here->HICUMvdci_t.dpart*iavl + ibei_dT*Vbiei + ibci_dT*Vbici + ibep_dT*Vbpei + ijbcx_dT*Vbpci + ijsc_dT*Vsici; if (rbi >= MIN_R) { @@ -2479,7 +2491,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) // end of Load_sources - Qjcx_i_Vbci = Cjcx_i; + Qjcx_i_Vbci = Cjcx_i;// Qjcx_ii_Vbpci = Cjcx_ii; Qjep_Vbpei = Cjep; Qdeix_Vbiei = Cdei; @@ -2740,12 +2752,12 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) /* * check convergence */ - // if ( (!(ckt->CKTmode & MODEINITFIX))||(!(here->HICUMoff))) { - // if (icheck == 1) { - // ckt->CKTnoncon++; - // ckt->CKTtroubleElt = (GENinstance *) here; - // } - // } + if ( (!(ckt->CKTmode & MODEINITFIX))||(!(here->HICUMoff))) { + if (icheck == 1) { + ckt->CKTnoncon++; + ckt->CKTtroubleElt = (GENinstance *) here; + } + } /* * charge storage for outer junctions