diff --git a/src/spicelib/devices/hicum2/hicum2defs.h b/src/spicelib/devices/hicum2/hicum2defs.h index 8c3f14217..fe2629b9f 100644 --- a/src/spicelib/devices/hicum2/hicum2defs.h +++ b/src/spicelib/devices/hicum2/hicum2defs.h @@ -235,8 +235,27 @@ typedef struct sHICUMinstance { /* excess phase */ double *HICUMxfXfPtr; + double *HICUMxfBaseBIPtr; + double *HICUMxfEmitEIPtr; + double *HICUMxfCollCIPtr; + double *HICUMxfTempPtr; + double *HICUMxf1Xf1Ptr; + double *HICUMxf1TempPtr; + double *HICUMxf1BaseBIPtr; + double *HICUMxf1EmitEIPtr; + double *HICUMxf1CollCIPtr; + double *HICUMxf1Xf2Ptr; + + double *HICUMxf2Xf1Ptr; + double *HICUMxf2TempPtr; + double *HICUMxf2BaseBIPtr; + double *HICUMxf2EmitEIPtr; + double *HICUMxf2CollCIPtr; double *HICUMxf2Xf2Ptr; + double *HICUMemitXf2Ptr; + double *HICUMemitEIXf2Ptr; + double *HICUMcollCIXf2Ptr; /* self heating */ double *HICUMcollTempPtr; diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index 343bfda50..064b88e15 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -656,9 +656,27 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(HICUMsubsCollPtr,HICUMsubsNode,HICUMcollNode); //s-c TSTALLOC(HICUMcollSubsPtr,HICUMcollNode,HICUMsubsNode); //c-s -// TSTALLOC(HICUMxfXfPtr,HICUMxfNode,HICUMxfNode); -// TSTALLOC(HICUMxf1Xf1Ptr,HICUMxf1Node,HICUMxf1Node); -// TSTALLOC(HICUMxf2Xf2Ptr,HICUMxf2Node,HICUMxf2Node); + TSTALLOC(HICUMxf1Xf1Ptr,HICUMxf1Node,HICUMxf1Node); + TSTALLOC(HICUMxf1TempPtr,HICUMxf1Node,HICUMtempNode); + TSTALLOC(HICUMxf1BaseBIPtr,HICUMxf1Node,HICUMbaseBINode); + TSTALLOC(HICUMxf1EmitEIPtr,HICUMxf1Node,HICUMemitEINode); + TSTALLOC(HICUMxf1CollCIPtr,HICUMxf1Node,HICUMcollCINode); + TSTALLOC(HICUMxf1Xf2Ptr,HICUMxf1Node,HICUMxf2Node); + + TSTALLOC(HICUMxf2Xf1Ptr,HICUMxf1Node,HICUMxf1Node); + TSTALLOC(HICUMxf2TempPtr,HICUMxf1Node,HICUMtempNode); + TSTALLOC(HICUMxf2BaseBIPtr,HICUMxf1Node,HICUMbaseBINode); + TSTALLOC(HICUMxf2EmitEIPtr,HICUMxf1Node,HICUMemitEINode); + TSTALLOC(HICUMxf2CollCIPtr,HICUMxf1Node,HICUMcollCINode); + TSTALLOC(HICUMxf2Xf2Ptr,HICUMxf1Node,HICUMxf2Node); + TSTALLOC(HICUMemitEIXf2Ptr,HICUMemitEINode,HICUMxf2Node); + TSTALLOC(HICUMcollCIXf2Ptr,HICUMcollCINode,HICUMxf2Node); + + TSTALLOC(HICUMxfXfPtr,HICUMxfNode,HICUMxfNode); + TSTALLOC(HICUMxfTempPtr,HICUMxfNode,HICUMtempNode); + TSTALLOC(HICUMxfEmitEIPtr,HICUMxfNode,HICUMemitEINode); + TSTALLOC(HICUMxfCollCIPtr,HICUMxfNode,HICUMcollCINode); + TSTALLOC(HICUMxfBaseBIPtr,HICUMxfNode,HICUMbaseBINode); if (selfheat) { TSTALLOC(HICUMcollTempPtr, HICUMcollNode, HICUMtempNode); @@ -729,22 +747,22 @@ HICUMunsetup( here->HICUMcollCINode = 0; if (selfheat) { - if (here->HICUMtempNode > 5) // it is an internal node - CKTdltNNum(ckt, here->HICUMtempNode); - here->HICUMtempNode = 0; + // if (here->HICUMtempNode > 5) // it is an internal node + // CKTdltNNum(ckt, here->HICUMtempNode); + // here->HICUMtempNode = 0; } -// if(here->HICUMxfNode > 0) -// CKTdltNNum(ckt, here->HICUMxfNode); -// here->HICUMxfNode = 0; -// -// if(here->HICUMxf1Node > 0) -// CKTdltNNum(ckt, here->HICUMxf1Node); -// here->HICUMxf1Node = 0; -// -// if(here->HICUMxf2Node > 0) -// CKTdltNNum(ckt, here->HICUMxf2Node); -// here->HICUMxf2Node = 0; + if(here->HICUMxfNode > 0) + CKTdltNNum(ckt, here->HICUMxfNode); + here->HICUMxfNode = 0; + + if(here->HICUMxf1Node > 0) + CKTdltNNum(ckt, here->HICUMxf1Node); + here->HICUMxf1Node = 0; + + if(here->HICUMxf2Node > 0) + CKTdltNNum(ckt, here->HICUMxf2Node); + here->HICUMxf2Node = 0; } } diff --git a/src/spicelib/devices/hicum2/hicumL2.cpp b/src/spicelib/devices/hicum2/hicumL2.cpp index bb289f12b..657920cfa 100644 --- a/src/spicelib/devices/hicum2/hicumL2.cpp +++ b/src/spicelib/devices/hicum2/hicumL2.cpp @@ -400,6 +400,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //Charges, capacitances and currents double Qjci,Qjei,Qjep; double Qdei,Qrbi; + double Qdei_Vbiei, Qdei_Vbici, Qdei_dT; double it,ibei,irei,ibci,ibep,irep,ibh_rec; double volatile ibet,iavl,iavl_ditf,iavl_dT,iavl_Vbiei,iavl_dCjci; double ijbcx,ijbcx_dT,ijbcx_Vbpci,ijsc,ijsc_Vsici,ijsc_Vrth,Qjs,Qscp,HSI_Tsu,Qdsu; @@ -442,13 +443,15 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double ick, ick_Vciei, ick_dT;//,cjcx01;//,cjcx02; //NQS - double Ixf1,Ixf2,Qxf1,Qxf2; - double Ixf1_Vxf2, Ixf1_ditf, Ixf1_dTf, Ixf1_Vbiei, Ixf1_Vbici, Ixf1_dT; - double Ixf2_Vxf1, Ixf2_Vbiei, Ixf2_Vbici, Ixf2_dT; - double Ixf_Vxf, Ixf_Tf,Ixf_Qdei,Ixf_Vbiei, Ixf_Vbici, Ixf_dT; - double Ixf2_Vxf2, Ixf2_dTf; + double Ixf1=0,Ixf2=0,Qxf1,Qxf2; + double Ixf1_Vxf1=0, Ixf1_Vxf2=0, Ixf1_ditf=0, Ixf1_dTf, Ixf1_Vbiei=0, Ixf1_Vbici=0, Ixf1_dT=0; + double Ixf2_Vxf1=0, Ixf2_Vbiei=0, Ixf2_Vbici=0, Ixf2_dT=0; + double Ixf_Vxf=0, Ixf_Tf,Ixf_Qdei,Ixf_Vbiei=0, Ixf_Vbici=0, Ixf_dT=0; + double Ixf2_Vxf2=0, Ixf2_dTf; double Itxf, Qdeix; - double Qxf, Ixf, Vxf; + double Itxf_Vxf2, Itxf_Vbici, Itxf_Vbiei, Itxf_dT; + double Qdeix_Vxf, Qdeix_dT, Qdeix_Vbici, Qdeix_Vbiei; + double Qxf, Ixf=0, Vxf; double Vxf1, Vxf2; double hjei_vbe; @@ -481,7 +484,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double ceq, geq=0.0; double volatile rhs_current; int icheck=1; - int ichk1, ichk2, ichk3, ichk4, ichk5; + int ichk1, ichk2, ichk3, ichk4, ichk5, ichk6, ichk7, ichk8; int error; double Vbe, Vcic, Vbbp, Veie, Vsis, Vbpe; @@ -491,7 +494,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double Ibpci=0, Ibpci_Vbpci; double Isici, Isici_Vsici;// double Isc=0, Isc_Vsc=0; - double volatile Iciei, Iciei_Vbiei, Iciei_Vbici, Iciei_Vrth; + double volatile Iciei, Iciei_Vbiei, Iciei_Vbici, Iciei_Vrth, Iciei_Vxf2; double Ibbp_Vbbp=0; double Isis_Vsis; double Ieie, Ieie_Veie=0; @@ -539,9 +542,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) double cqsu, gqsu; //NQS - double Vbxf, Vbxf1, Vbxf2; double Qxf_Vxf, Qxf1_Vxf1, Qxf2_Vxf2; - // double Iqxf, Iqxf_Vxf, Iqxf1, Iqxf1_Vxf1, Iqxf2, Iqxf2_Vxf2; //not needed withouth NQS + double Iqxf=0, Iqxf_Vxf=0, Iqxf1=0, Iqxf1_Vxf1=0, Iqxf2=0, Iqxf2_Vxf2=0; //not needed withouth NQS, initialized with 0 here double volatile Ith=0, Vrth=0, Icth, Icth_Vrth, delvrth; @@ -1297,9 +1299,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsis = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMsubsSINode)- *(ckt->CKTrhsOld+here->HICUMsubsNode)); - Vbxf = *(ckt->CKTrhsOld + here->HICUMxfNode); - Vbxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); - Vbxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); + Vxf = *(ckt->CKTrhsOld + here->HICUMxfNode); + Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); + Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); if (selfheat) { if (model->HICUMrth_de == 1) { Vrth = *(ckt->CKTstate0 + here->HICUMith)*here->HICUMrth_t.rpart; @@ -1340,9 +1342,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsis = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMsubsSINode)- *(ckt->CKTrhsOld+here->HICUMsubsNode)); - Vbxf = *(ckt->CKTrhsOld + here->HICUMxfNode); - Vbxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); - Vbxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); + Vxf = *(ckt->CKTrhsOld + here->HICUMxfNode); + Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); + Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); if (selfheat) { if (model->HICUMrth_de == 1) { Vrth = *(ckt->CKTstate1 + here->HICUMith)*here->HICUMrth_t.rpart; @@ -1368,7 +1370,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsc=Vsici=0.0; Vsis=0.0; Icth=0.0,Icth_Vrth=0.0; - Vbxf=Vbxf1=Vbxf2=0.0; + Vxf=Vxf1=Vxf2=0.0; } else if((ckt->CKTmode & MODEINITJCT) && (here->HICUMoff==0)) { Vbe = here->HICUMicVB-here->HICUMicVE; Vbiei = here->HICUMicVBi-here->HICUMicVEi; //here was a hicumtype before, why? @@ -1386,7 +1388,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsc=Vsici=0.0; Vsis=0.0; Icth=0.0,Icth_Vrth=0.0; - Vbxf=Vbxf1=Vbxf2=0.0; + Vxf=Vxf1=Vxf2=0.0; } else if((ckt->CKTmode & MODEINITJCT) || ( (ckt->CKTmode & MODEINITFIX) && (here->HICUMoff!=0))) { Vbe=0.0; @@ -1398,7 +1400,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbpbi=Vbbp=Vbpe=0.0; Vcic=Veie=Vsis=0.0; Vrth=0.0,Icth=0.0,Icth_Vrth=0.0; - Vbxf=Vbxf1=Vbxf2=0.0; + Vxf=Vxf1=Vxf2=0.0; } else { #ifndef PREDICTOR if(ckt->CKTmode & MODEINITPRED) { @@ -1416,11 +1418,11 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) xfact * *(ckt->CKTstate2 + here->HICUMvsici); Vbpbi = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvbpbi)- xfact * *(ckt->CKTstate2 + here->HICUMvbpbi); - Vbxf = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf)- + Vxf = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf)- xfact * *(ckt->CKTstate2 + here->HICUMvxf); - Vbxf1 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf1)- + Vxf1 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf1)- xfact * *(ckt->CKTstate2 + here->HICUMvxf1); - Vbxf2 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf2)- + Vxf2 = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvxf2)- xfact * *(ckt->CKTstate2 + here->HICUMvxf2); Vrth = (1+xfact) * *(ckt->CKTstate1 + here->HICUMvrth); Veie = (1+xfact) * *(ckt->CKTstate1 + here->HICUMveie)- @@ -1603,9 +1605,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsici = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMsubsSINode)- *(ckt->CKTrhsOld+here->HICUMcollCINode)); - Vbxf = *(ckt->CKTrhsOld + here->HICUMxfNode); - Vbxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); - Vbxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); + Vxf = *(ckt->CKTrhsOld + here->HICUMxfNode); + Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); + Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); Vciei = Vbiei - Vbici; if (selfheat) { if (model->HICUMrth_de==1) { @@ -1660,9 +1662,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vsis = model->HICUMtype*( *(ckt->CKTrhsOld+here->HICUMsubsSINode)- *(ckt->CKTrhsOld+here->HICUMsubsNode)); - Vbxf = *(ckt->CKTrhsOld + here->HICUMxfNode); - Vbxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); - Vbxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); + Vxf = *(ckt->CKTrhsOld + here->HICUMxfNode); + Vxf1 = *(ckt->CKTrhsOld + here->HICUMxf1Node); + Vxf2 = *(ckt->CKTrhsOld + here->HICUMxf2Node); if (selfheat) { if (model->HICUMrth_de==1) { Vrth = *(ckt->CKTstate0 + here->HICUMith)*here->HICUMrth_t.rpart; @@ -1794,6 +1796,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbbp = *(ckt->CKTstate0 + here->HICUMvbbp); Veie = *(ckt->CKTstate0 + here->HICUMveie); Vrth = *(ckt->CKTstate0 + here->HICUMvrth); + Vxf = *(ckt->CKTstate0 + here->HICUMvxf); + Vxf1 = *(ckt->CKTstate0 + here->HICUMvxf1); + Vxf2 = *(ckt->CKTstate0 + here->HICUMvxf2); Ibiei = *(ckt->CKTstate0 + here->HICUMibiei); Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei); @@ -1807,7 +1812,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Iciei = *(ckt->CKTstate0 + here->HICUMiciei); Iciei_Vbiei = *(ckt->CKTstate0 + here->HICUMiciei_Vbiei); Iciei_Vbici = *(ckt->CKTstate0 + here->HICUMiciei_Vbici); - Iciei_Vrth = *(ckt->CKTstate0 + here->HICUMiciei_Vrth); + Iciei_Vrth = *(ckt->CKTstate0 + here->HICUMiciei_Vrth); Ibici = *(ckt->CKTstate0 + here->HICUMibici); Ibici_Vbici = *(ckt->CKTstate0 + here->HICUMibici_Vbici); @@ -1847,7 +1852,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) /* * limit nonlinear branch voltages */ - ichk1 = 1, ichk2 = 1, ichk3 = 1, ichk4 = 1, ichk5 = 0; + ichk1 = 1, ichk2 = 1, ichk3 = 1, ichk4 = 1, ichk5 = 1, ichk6=1, ichk7=1, ichk8=0; Vbiei = DEVpnjlim(Vbiei,*(ckt->CKTstate0 + here->HICUMvbiei),here->HICUMvt.rpart, here->HICUMtVcrit,&icheck); Vbici = DEVpnjlim(Vbici,*(ckt->CKTstate0 + here->HICUMvbici),here->HICUMvt.rpart, @@ -1858,12 +1863,18 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) here->HICUMtVcrit,&ichk3); Vsici = DEVpnjlim(Vsici,*(ckt->CKTstate0 + here->HICUMvsici),here->HICUMvt.rpart, here->HICUMtVcrit,&ichk4); + Vxf = DEVpnjlim(Vxf,*(ckt->CKTstate0 + here->HICUMvxf),here->HICUMvt.rpart, + here->HICUMtVcrit,&ichk5); + Vxf1 = DEVpnjlim(Vxf1,*(ckt->CKTstate0 + here->HICUMvxf1),here->HICUMvt.rpart, + here->HICUMtVcrit,&ichk6); + Vxf2 = DEVpnjlim(Vxf2,*(ckt->CKTstate0 + here->HICUMvxf2),here->HICUMvt.rpart, + here->HICUMtVcrit,&ichk7); if (selfheat) { - ichk5 = 1; + ichk8 = 1; Vrth = HICUMlimitlog(Vrth, - *(ckt->CKTstate0 + here->HICUMvrth),100,&ichk5); + *(ckt->CKTstate0 + here->HICUMvrth),100,&ichk8); } - if ((ichk1 == 1) || (ichk2 == 1) || (ichk3 == 1) || (ichk4 == 1) || (ichk5 == 1)) icheck=1; + if ((ichk1 == 1) || (ichk2 == 1) || (ichk3 == 1) || (ichk4 == 1) || (ichk5 == 1)|| (ichk6 == 1)|| (ichk7 == 1)|| (ichk8 == 1)) icheck=1; } /* * determine dc current and derivatives @@ -1877,6 +1888,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Vbci = model->HICUMtype*Vbci; Vsici = model->HICUMtype*Vsici; Vsc = model->HICUMtype*Vsc; + // Vxf = model->HICUMtype*Vxf; + // Vxf1 = model->HICUMtype*Vxf1; + // Vxf2 = model->HICUMtype*Vxf2; //Vrth not needed if (selfheat) { // Thermal_update_with_self_heating @@ -2247,6 +2261,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) itf_Vbici -= itf_Vciei; itr_Vbiei += itr_Vciei; itr_Vbici -= itr_Vciei; + Qf_Vbiei += Qf_Vciei; + Qf_Vbici -= Qf_Vciei; // finally the transfer current it = itf-itr; @@ -2266,7 +2282,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) //Once the delay in ITF is considered, IT_NQS is calculated afterwards //Diffusion charges for further use (remember derivatives if this will be used somebday) - Qdei = Qf; + Qdei = Qf; + Qdei_Vbici = Qf_Vbici; + Qdei_Vbiei = Qf_Vbiei; + Qdei_dT = Qf_dT; //Qdci = Qr; //we just use Qr herein //High-frequency emitter current crowding (lateral NQS) @@ -2398,8 +2417,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) rbi_dQf = result.dpart(); here->HICUMrbi = rbi; - rbi_Vbiei = rbi_dQjei* Qjei_Vbiei + rbi_dQf *(Qf_Vbiei+Qf_Vciei) ; - rbi_Vbici = rbi_dQf * (Qf_Vbici-Qf_Vciei); + rbi_Vbiei = rbi_dQjei* Qjei_Vbiei + rbi_dQf *(Qf_Vbiei) ; + rbi_Vbici = rbi_dQf * (Qf_Vbici); rbi_dT += rbi_dQjei*Qjei_dT + rbi_dQf*Qf_dT; //Base currents across peripheral b-e junction @@ -2505,21 +2524,25 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) } here->HICUMpterm = pterm; - Itxf = itf; - Qdeix = Qdei; + Itxf = itf; + Itxf_Vbici = itf_Vbici; + Itxf_Vbiei = itf_Vbiei; + Itxf_dT = itf_dT; + Itxf_Vxf2 = 0.0; + Qdeix = Qdei; + Qdeix_Vbiei = Qdei_Vbiei; + Qdeix_Vbici = Qdei_Vbici; + Qdeix_dT = Qdei_dT; + Qdeix_Vxf = 0.0; // Excess Phase calculation - if ((model->HICUMflnqs != 0 || model->HICUMflcomp == 0.0 || model->HICUMflcomp == 2.1) && Tf != 0 && (model->HICUMalit > 0 || model->HICUMalqf > 0)) { - Vxf1 = Vbxf1; - Vxf2 = Vbxf2; - - Ixf1 = (Vxf2-itf)/Tf*model->HICUMt0; + Ixf1 = (Vxf2-itf)/Tf*model->HICUMt0; Ixf1_Vxf2 = 1.0/Tf*model->HICUMt0; - Ixf1_ditf = -1.0/Tf*model->HICUMt0; + Ixf1_ditf = -Ixf1_Vxf2; Ixf1_dTf = -Ixf1/Tf; //Tf(Vbiei,Vciei=Vbiei-Vbici) - Ixf1_Vbiei = Ixf1_ditf*itf_Vbiei + Ixf1_dTf*Tf_Vbiei + Ixf1_dTf*Tf_Vciei; - Ixf1_Vbici = Ixf1_ditf*itf_Vbici + Ixf1_dTf*Tf_Vbici - Ixf1_dTf*Tf_Vciei; + Ixf1_Vbiei = Ixf1_ditf*itf_Vbiei + Ixf1_dTf*(Tf_Vbiei + Tf_Vciei); + Ixf1_Vbici = Ixf1_ditf*itf_Vbici + Ixf1_dTf*(Tf_Vbici - Tf_Vciei); Ixf1_dT = Ixf1_ditf*itf_dT + Ixf1_dTf*Tf_dT; Ixf2 = (Vxf2-Vxf1)/Tf*model->HICUMt0; @@ -2530,35 +2553,65 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ixf2_Vbici = Ixf2_dTf*(Tf_Vbici-Tf_Vciei); Ixf2_dT = Ixf2_dTf*Tf_dT; - Qxf1 = model->HICUMalit*model->HICUMt0*Vxf1; - Qxf1_Vxf1 = model->HICUMalit*model->HICUMt0; - Qxf2 = model->HICUMalit*model->HICUMt0*Vxf2/3; - Qxf2_Vxf2 = model->HICUMalit*model->HICUMt0/3; - Itxf = Vxf2; + Qxf1 = model->HICUMalit*model->HICUMt0*Vxf1; + Qxf1_Vxf1 = model->HICUMalit*model->HICUMt0; + Qxf2 = model->HICUMalit*model->HICUMt0*Vxf2/3; + Qxf2_Vxf2 = model->HICUMalit*model->HICUMt0/3; + + Itxf = Vxf2; + Itxf_Vbiei = 0; + Itxf_Vbici = 0; + Itxf_dT = 0; + Itxf_Vxf2 = 1.0; - Vxf = Vbxf; //for RC nw Ixf = (Vxf - Qdei)*model->HICUMt0/Tf; //for RC nw - Ixf_Vxf = Vxf*model->HICUMt0/Tf; + Ixf_Vxf = 1.0*model->HICUMt0/Tf; + Ixf_Qdei = -Ixf_Vxf; Ixf_Tf = -Ixf/Tf; - Ixf_Qdei = -1.0/model->HICUMt0/Tf; - Ixf_Vbiei = Ixf_Tf*(Tf_Vbiei+Tf_Vciei) + Ixf_Vbiei*(Qf_Vbiei+Qf_Vciei); - Ixf_Vbici = Ixf_Tf*(Tf_Vbici-Tf_Vciei) + Ixf_Qdei*(Qf_Vbici-Qf_Vciei); - Ixf_dT = Ixf_Tf*Tf_dT + Ixf_Qdei*Qf_dT; + Ixf_Vbiei = Ixf_Tf*(Tf_Vbiei+Tf_Vciei) + Ixf_Vbiei*Qf_Vbiei; + Ixf_Vbici = Ixf_Tf*(Tf_Vbici-Tf_Vciei) + Ixf_Qdei *Qf_Vbici; + Ixf_dT = Ixf_Tf*Tf_dT + Ixf_Qdei*Qdei_dT; - Qxf = model->HICUMalqf*model->HICUMt0*Vxf; //for RC nw - Qxf_Vxf = model->HICUMalqf*model->HICUMt0; //for RC nw - Qdeix = Vxf; //for RC nw + Qxf = model->HICUMalqf*model->HICUMt0*Vxf; //for RC nw + Qxf_Vxf = model->HICUMalqf*model->HICUMt0; //for RC nw + + Qdeix = Vxf; //for RC nw + Qdeix_Vxf = 1.0; } else { - Ixf1 = Vbxf1; - Ixf2 = Vbxf2; - Qxf1 = 0; - Qxf2 = 0; - Qxf1_Vxf1 = 0; - Qxf2_Vxf2 = 0; + Ixf1 = Vxf1; + Ixf1_Vxf1 = 1.0; + Ixf1_Vxf2 = 0; + Ixf1_ditf = 0; + Ixf1_dTf = 0; + Ixf1_Vbiei = 0; + Ixf1_Vbici = 0; + Ixf1_dT = 0; + + Ixf2 = Vxf2; + Ixf2_Vxf2 = 0; + Ixf2_Vxf1 = 0; + Ixf2_dTf = 0; + Ixf2_Vbiei = 0; + Ixf2_Vbici = 0; + Ixf2_dT = 0; + + Qxf1 = 0; + Qxf1_Vxf1 = 0; + + Qxf2 = 0; + Qxf2_Vxf2 = 0; + + Ixf = Vxf; + Ixf_Vxf = 1.0; + Ixf_Tf = 0; + Ixf_Qdei = 0; + Ixf_Vbiei = 0; + Ixf_Vbici = 0; + Ixf_dT = 0; + + Qxf = 0; + Qxf_Vxf = 0; - Ixf = Vbxf; - Qxf = 0; - Qxf_Vxf = 0; } // end of Model_evaluation @@ -2621,10 +2674,11 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Isici_Vsici = model->HICUMtype*ijsc_Vsici; Isici_Vrth = model->HICUMtype*ijsc_Vrth; - Iciei = model->HICUMtype*it; - Iciei_Vbiei = model->HICUMtype*it_Vbiei; - Iciei_Vbici = model->HICUMtype*it_Vbici; - Iciei_Vrth = model->HICUMtype*it_dT; + Iciei = model->HICUMtype*(Itxf - itr); + Iciei_Vbiei = model->HICUMtype*(Itxf_Vbiei - itr_Vbiei); + Iciei_Vbici = model->HICUMtype*(Itxf_Vbici - itr_Vbici); + Iciei_Vrth = model->HICUMtype*(Itxf_dT - itr_dT); + Iciei_Vxf2 = model->HICUMtype*Itxf_Vxf2; if (rbi >= MIN_R) { Ibpbi = Vbpbi / rbi; @@ -2791,6 +2845,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Ibici_Vrth += ckt->CKTgmin; //Iciei Iciei_Vrth += ckt->CKTgmin; + Iciei_Vxf2 += ckt->CKTgmin; //Ibpei Ibpei_Vrth += ckt->CKTgmin; // Ibpbi @@ -2858,10 +2913,10 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->HICUMcqjei) = Qjei_Vbiei; *(ckt->CKTstate0 + here->HICUMqjei_Vrth) = Qjei_dT; //Qf - *(ckt->CKTstate0 + here->HICUMqf) = Qf; - *(ckt->CKTstate0 + here->HICUMcqf) = Qf_Vbiei; - *(ckt->CKTstate0 + here->HICUMqf_Vbici) = Qf_Vbici; - *(ckt->CKTstate0 + here->HICUMqf_Vrth) = Qf_dT; + *(ckt->CKTstate0 + here->HICUMqf) = Qdeix; + *(ckt->CKTstate0 + here->HICUMcqf) = Qdeix_Vbiei; + *(ckt->CKTstate0 + here->HICUMqf_Vbici) = Qdeix_Vbici; + *(ckt->CKTstate0 + here->HICUMqf_Vrth) = Qdeix_dT; //Qr *(ckt->CKTstate0 + here->HICUMqr) = Qr; *(ckt->CKTstate0 + here->HICUMcqr) = Qr_Vbici; @@ -2944,9 +2999,9 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if(ckt->CKTmode & MODEINITSMSIG) { //TODO (transient not yet implented) - *(ckt->CKTstate0 + here->HICUMcqf) = Qf_Vbiei; - *(ckt->CKTstate0 + here->HICUMqf_Vbici) = Qf_Vbici; - *(ckt->CKTstate0 + here->HICUMqf_Vrth) = Qf_dT; + *(ckt->CKTstate0 + here->HICUMcqf) = Qdeix_Vbiei; + *(ckt->CKTstate0 + here->HICUMqf_Vbici) = Qdeix_Vbici; + *(ckt->CKTstate0 + here->HICUMqf_Vrth) = Qdeix_dT; *(ckt->CKTstate0 + here->HICUMcqjei) = Cjei; *(ckt->CKTstate0 + here->HICUMcqjci) = Cjci; @@ -3030,8 +3085,8 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) if(error) return(error); Ibiei_Vbiei += geq; Ibiei += *(ckt->CKTstate0 + here->HICUMcqjei); - //Qf - error = NIintegrate(ckt,&geq,&ceq,Cdei,here->HICUMqf); + //Qdeix + error = NIintegrate(ckt,&geq,&ceq,Qdeix_Vbiei,here->HICUMqf); if(error) return(error); Ibiei_Vbiei += geq; Ibiei += *(ckt->CKTstate0 + here->HICUMcqf); @@ -3076,21 +3131,20 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) Isc_Vsc = geq; Isc = *(ckt->CKTstate0 + here->HICUMcqscp); //NQS - // Iqxf1 <+ ddt(Qxf1); - // error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->HICUMqxf); - // if(error) return(error); - // Iqxf1_Vxf1 = geq; - // Iqxf1 = *(ckt->CKTstate0 + here->HICUMcqxf1); - // Iqxf2 <+ ddt(Qxf2); - // error = NIintegrate(ckt,&geq,&ceq,Qxf2_Vxf2,here->HICUMqxf); - // if(error) return(error); - // Iqxf2_Vxf2 = geq; - // Iqxf2 = *(ckt->CKTstate0 + here->HICUMcqxf2); - // Iqxf += ddt(Qxf); //for RC nw - // error = NIintegrate(ckt,&geq,&ceq,Qxf_Vxf,here->HICUMqxf); - // if(error) return(error); - // Iqxf_Vxf = geq; - // Iqxf = *(ckt->CKTstate0 + here->HICUMcqxf); + error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->HICUMqxf); + if(error) return(error); + Iqxf1_Vxf1 = geq; + Iqxf1 = *(ckt->CKTstate0 + here->HICUMcqxf1); + //Qxf2 + error = NIintegrate(ckt,&geq,&ceq,Qxf2_Vxf2,here->HICUMqxf); + if(error) return(error); + Iqxf2_Vxf2 = geq; + Iqxf2 = *(ckt->CKTstate0 + here->HICUMcqxf2); + //Qxf + error = NIintegrate(ckt,&geq,&ceq,Qxf_Vxf,here->HICUMqxf); + if(error) return(error); + Iqxf_Vxf = geq; + Iqxf = *(ckt->CKTstate0 + here->HICUMcqxf); if (selfheat) { @@ -3207,6 +3261,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->HICUMiciei_Vbiei) = Iciei_Vbiei; *(ckt->CKTstate0 + here->HICUMiciei_Vbici) = Iciei_Vbici; *(ckt->CKTstate0 + here->HICUMiciei_Vrth) = Iciei_Vrth; + //*(ckt->CKTstate0 + here->HICUMiciei_Vxf2) = Iciei_Vxf2; *(ckt->CKTstate0 + here->HICUMibici) = Ibici; *(ckt->CKTstate0 + here->HICUMibici_Vbici) = Ibici_Vbici; @@ -3369,7 +3424,7 @@ load: // finish // Branch: ciei, Stamp element: It - rhs_current = model->HICUMtype * (Iciei - Iciei_Vbiei*Vbiei - Iciei_Vbici*Vbici); + rhs_current = model->HICUMtype * (Iciei - Iciei_Vbiei*Vbiei - Iciei_Vbici*Vbici- Iciei_Vxf2*Vxf2); *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; // with respect to Vbiei f_CI = + f_EI = - @@ -3382,6 +3437,9 @@ load: *(here->HICUMemitEICollCIPtr) += Iciei_Vbici; *(here->HICUMcollCICollCIPtr) += -Iciei_Vbici; *(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici; + // with respect to Vxf2 + *(here->HICUMcollCIXf2Ptr) += Iciei_Vxf2; + *(here->HICUMemitEIXf2Ptr) += -Iciei_Vxf2; // finish // Branch: bci, Stamp element: Qbcx @@ -3499,67 +3557,69 @@ load: *(here->HICUMsubsSubsSIPtr) += -Isis_Vsis; // finish -//NQS -/* -c Branch: xf1-ground, Stamp element: Ixf1 -*/ -// rhs_current = (Ixf1 - Ixf1_Vxf1*Vxf1 - Ixf1_dT*Vrth - Ixf1_Vbiei*Vbiei - Ixf1_Vbici*Vbici - Ixf1_Vxf2*Vxf2); // TODO -// rhs_current = Ixf1; -// *(ckt->CKTrhs + here->HICUMxf1Node) += 0; // rhs_current; // into xf1 node -// *(here->HICUMxf1TempPtr) += -Ixf1_dT; -// *(here->HICUMxf1BaseBIPtr) += -Ixf1_Vbiei; -// *(here->HICUMxf1EmitEIPtr) += +Ixf1_Vbiei; -// *(here->HICUMxf1BaseBIPtr) += -Ixf1_Vbici; -// *(here->HICUMxf1CollCIPtr) += +Ixf1_Vbici; -// *(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2; -/* -c Branch: xf1-ground, Stamp element: Qxf1 // TODO Test in AC simulation! -*/ -// rhs_current = Iqxf1 - Iqxf1_Vxf1*Vxf1; -// *(ckt->CKTrhs + here->HICUMxf1Node) += rhs_current; // into ground -// *(here->HICUMxf1Xf1Ptr) += Iqxf1_Vxf1; + // NQS effect + // I(br_bxf1) <+ Ixf1; + // I(br_cxf1) <+ ddt(Qxf1); + // I(br_bxf2) <+ Ixf2; + // I(br_cxf2) <+ ddt(Qxf2); + + // I(br_bxf) <+ Ixf; //for RC nw + // I(br_cxf) <+ ddt(Qxf); //for RC nw + +// Branch: xf1-ground, Stamp element: Ixf1 f_xf1=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground? + rhs_current = Ixf1 - Ixf1_Vbici*Vbici - Ixf1_Vbiei*Vbiei -Ixf1_dT*Vrth -Ixf1_Vxf1*Vxf1 - Ixf1_Vxf2*Vxf2; + *(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current; // rhs_current; // into xf1 node + *(here->HICUMxf1TempPtr) += Ixf1_dT; + *(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbiei; + *(here->HICUMxf1EmitEIPtr) += -Ixf1_Vbiei; + *(here->HICUMxf1BaseBIPtr) += +Ixf1_Vbici; + *(here->HICUMxf1CollCIPtr) += -Ixf1_Vbici; + *(here->HICUMxf1Xf2Ptr) += +Ixf1_Vxf2; + *(here->HICUMxf1Xf1Ptr) += +Ixf1_Vxf1; + +// Branch: xf2-ground, Stamp element: Ixf2 f_xf2=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground? + rhs_current = Ixf2 - Ixf2_dT*Vrth - Ixf2_Vbici*Vbici - Ixf2_Vbiei*Vbiei - Ixf2_Vxf1*Vxf1 - Ixf2_Vxf2*Vxf2; + *(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current; // rhs_current; // into xf2 node + *(here->HICUMxf2TempPtr) += Ixf2_dT; + *(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbiei; + *(here->HICUMxf2EmitEIPtr) += -Ixf2_Vbiei; + *(here->HICUMxf2BaseBIPtr) += +Ixf2_Vbici; + *(here->HICUMxf2CollCIPtr) += -Ixf2_Vbici; + *(here->HICUMxf2Xf2Ptr) += +Ixf2_Vxf2; + *(here->HICUMxf2Xf1Ptr) += +Ixf2_Vxf1; + +// Branch: xf-ground, Stamp element: Ixf f_xf=+ //Markus has opposite sign than Dietmar. This current flows from xf1 to ground? + rhs_current = Ixf - Ixf_Vbici*Vbici - Ixf_Vbiei*Vbiei - Ixf_Vxf*Vxf- Ixf_dT; + *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // rhs_current; // into xf2 node + *(here->HICUMxfTempPtr) += Ixf_dT; + *(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei; + *(here->HICUMxfEmitEIPtr) += -Ixf_Vbiei; + *(here->HICUMxfBaseBIPtr) += +Ixf_Vbici; + *(here->HICUMxfCollCIPtr) += -Ixf_Vbici; + *(here->HICUMxfXfPtr) += +Ixf_Vxf; +// Branch: xf1-ground, Stamp element: Qxf1 // TODO Test in AC simulation! + rhs_current = Iqxf1 - Iqxf1_Vxf1*Vxf1; + *(ckt->CKTrhs + here->HICUMxf1Node) += -rhs_current; + *(here->HICUMxf1Xf1Ptr) += +Iqxf1_Vxf1; +// Branch: xf2-ground, Stamp element: Qxf2 // TODO Test in AC simulation! + rhs_current = Iqxf2 - Iqxf2_Vxf2*Vxf2; + *(ckt->CKTrhs + here->HICUMxf2Node) += -rhs_current; + *(here->HICUMxf2Xf2Ptr) += +Iqxf2_Vxf2; +// Branch: xf-ground, Stamp element: Qxf // TODO Test in AC simulation! + rhs_current = model->HICUMtype * (Iqxf - Iqxf_Vxf*Vxf); + *(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // into ground + *(here->HICUMxfXfPtr) += +Iqxf_Vxf; /* c Branch: xf1-ground, Stamp element: Rxf1 TODO: This is wrong, but needed at the moment for convergence */ // *(here->HICUMxf1Xf1Ptr) += 1; // current Ixf1 is normalized to Tf /* -c Branch: xf2-ground, Stamp element: Ixf2 -*/ -// rhs_current = (Ixf2 - Ixf2_Vxf1*Vxf1 - Ixf2_dT*Vrth - Ixf2_Vbiei*Vbiei - Ixf2_Vbici*Vbici - Ixf2_Vxf2*Vxf2); // TODO -// rhs_current = Ixf2; -// *(ckt->CKTrhs + here->HICUMxf2Node) += rhs_current; // into xf2 node -// *(here->HICUMxf2TempPtr) += -Ixf2_dT; -// *(here->HICUMxf2BaseBIPtr) += -Ixf2_Vbiei; -// *(here->HICUMxf2EmitEIPtr) += +Ixf2_Vbiei; -// *(here->HICUMxf2BaseBIPtr) += -Ixf2_Vbici; -// *(here->HICUMxf2CollCIPtr) += +Ixf2_Vbici; -/* -c Branch: xf2-ground, Stamp element: Qxf2 // TODO Test in AC simulation! -*/ -// rhs_current = Iqxf2 - Iqxf2_Vxf2*Vxf2; -// *(ckt->CKTrhs + here->HICUMxf2Node) += rhs_current; // into ground -// *(here->HICUMxf2Xf2Ptr) += Iqxf2_Vxf2; -/* c Branch: xf2-ground, Stamp element: Rxf2 */ // *(here->HICUMxf2Xf2Ptr) += 1; // current Ixf2 is normalized to Tf /* c Branch: xf-ground, Stamp element: Ixf */ -// rhs_current = model->HICUMtype * (Ixf - Ixf_dT*Vrth - Ixf_Vbiei*Vbiei - Ixf_Vbici*Vbici); -// rhs_current = model->HICUMtype * Ixf; -// *(ckt->CKTrhs + here->HICUMxfNode) += rhs_current; // into xf node -// *(here->HICUMxfTempPtr) += -Ixf_dT; -// *(here->HICUMxfBaseBIPtr) += -Ixf_Vbiei; -// *(here->HICUMxfEmitEIPtr) += +Ixf_Vbiei; -// *(here->HICUMxfBaseBIPtr) += -Ixf_Vbici; -// *(here->HICUMxfCollCIPtr) += +Ixf_Vbici; -/* -c Branch: xf-ground, Stamp element: Qxf // TODO Test in AC simulation! -*/ -// rhs_current = model->HICUMtype * (Iqxf - Iqxf_Vxf*Vxf); -// *(ckt->CKTrhs + here->HICUMxfNode) += rhs_current; // into ground -// *(here->HICUMxfXfPtr) += Iqxf_Vxf; /* c Branch: xf-ground, Stamp element: Rxf */