From fdecb84ff9c075b59b49e22794f72c38e3553f54 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 30 Jan 2025 14:47:34 +0100 Subject: [PATCH] VBIC: lean and mean code revision --- src/spicelib/devices/vbic/vbic.c | 13 +- src/spicelib/devices/vbic/vbicacld.c | 13 +- src/spicelib/devices/vbic/vbicask.c | 31 +- src/spicelib/devices/vbic/vbicdefs.h | 25 +- src/spicelib/devices/vbic/vbicload.c | 1339 ++------------------------ src/spicelib/devices/vbic/vbicpzld.c | 14 +- 6 files changed, 99 insertions(+), 1336 deletions(-) diff --git a/src/spicelib/devices/vbic/vbic.c b/src/spicelib/devices/vbic/vbic.c index 6ded01fc5..36e806af5 100644 --- a/src/spicelib/devices/vbic/vbic.c +++ b/src/spicelib/devices/vbic/vbic.c @@ -36,14 +36,16 @@ IFparm VBICpTable[] = { /* parameters */ OPU("baseBPnode",VBIC_QUEST_BASEBPNODE,IF_INTEGER, "Internal base node"), OPU("emitEInode",VBIC_QUEST_EMITEINODE,IF_INTEGER, "Internal emitter node"), OPU("subsSInode",VBIC_QUEST_SUBSSINODE,IF_INTEGER, "Internal substrate node"), - OPU("xf1node", VBIC_QUEST_XF1NODE, IF_INTEGER, "Internal phase node xf1"), - OPU("xf2node", VBIC_QUEST_XF2NODE, IF_INTEGER, "Internal phase node xf2"), OP("vbe", VBIC_QUEST_VBE, IF_REAL, "B-E voltage"), OP("vbc", VBIC_QUEST_VBC, IF_REAL, "B-C voltage"), OP("ic", VBIC_QUEST_CC, IF_REAL, "Collector current"), OP("ib", VBIC_QUEST_CB, IF_REAL, "Base current"), OP("ie", VBIC_QUEST_CE, IF_REAL, "Emitter current"), OP("is", VBIC_QUEST_CS, IF_REAL, "Substrate current"), + OP("p", VBIC_QUEST_POWER,IF_REAL, "Power dissipation"), + OPR("power",VBIC_QUEST_POWER,IF_REAL, "Power dissipation"), + OP("beta", VBIC_QUEST_BETA, IF_REAL, "CE current gain DC"), + OPR("betad",VBIC_QUEST_BETA, IF_REAL, "CE current gain DC"), OP("gm", VBIC_QUEST_GM, IF_REAL, "Small signal transconductance dIc/dVbe"), OP("go", VBIC_QUEST_GO, IF_REAL, "Small signal output conductance dIc/dVbc"), OP("gpi", VBIC_QUEST_GPI, IF_REAL, "Small signal input conductance dIb/dVbe"), @@ -55,15 +57,8 @@ IFparm VBICpTable[] = { /* parameters */ OP("cbcx", VBIC_QUEST_CBCX, IF_REAL, "External Base to collector capacitance"), OP("cbep", VBIC_QUEST_CBEP, IF_REAL, "Parasitic Base to emitter capacitance"), OP("cbcp", VBIC_QUEST_CBCP, IF_REAL, "Parasitic Base to collector capacitance"), - OP("p", VBIC_QUEST_POWER,IF_REAL, "Power dissipation"), - OPU("geqcb",VBIC_QUEST_GEQCB,IF_REAL, "Internal C-B-base cap. equiv. cond."), - OPU("geqbx",VBIC_QUEST_GEQBX,IF_REAL, "External C-B-base cap. equiv. cond."), OPU("qbe", VBIC_QUEST_QBE, IF_REAL, "Charge storage B-E junction"), - OPU("cqbe", VBIC_QUEST_CQBE, IF_REAL, "Cap. due to charge storage in B-E jct."), OPU("qbc", VBIC_QUEST_QBC, IF_REAL, "Charge storage B-C junction"), - OPU("cqbc", VBIC_QUEST_CQBC, IF_REAL, "Cap. due to charge storage in B-C jct."), - OPU("qbx", VBIC_QUEST_QBX, IF_REAL, "Charge storage B-X junction"), - OPU("cqbx", VBIC_QUEST_CQBX, IF_REAL, "Cap. due to charge storage in B-X jct.") }; IFparm VBICmPTable[] = { /* model parameters */ diff --git a/src/spicelib/devices/vbic/vbicacld.c b/src/spicelib/devices/vbic/vbicacld.c index a26e119f1..244ea1561 100644 --- a/src/spicelib/devices/vbic/vbicacld.c +++ b/src/spicelib/devices/vbic/vbicacld.c @@ -59,7 +59,7 @@ VBICacLoad(GENmodel *inModel, CKTcircuit *ckt) for( ; model != NULL; model = VBICnextModel(model)) { /* loop through all the instances of the model */ - for( here = VBICinstances(model); here!= NULL; + for( here = VBICinstances(model); here!= NULL; here = VBICnextInstance(here)) { Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); @@ -129,7 +129,7 @@ c Stamp element: Iciei *(here->VBICemitEIEmitEIPtr) += Iciei_Vbei; *(here->VBICemitEIBaseBIPtr) += -Iciei_Vbci; *(here->VBICemitEICollCIPtr) += Iciei_Vbci; - if (here->VBIC_excessPhase) { + if (here->VBIC_excessPhase) { *(here->VBICcollCIXf2Ptr) += Iciei_Vxf2; *(here->VBICemitEIXf2Ptr) += -Iciei_Vxf2; } @@ -251,7 +251,6 @@ c Stamp element: Rs Ibe_Vrth = here->VBICibe_Vrth; Ibex_Vrth = here->VBICibex_Vrth; - Iciei_Vrth = here->VBICiciei_Vrth; Ibc_Vrth = here->VBICibc_Vrth; Ibep_Vrth = here->VBICibep_Vrth; Ircx_Vrth = here->VBICircx_Vrth; @@ -391,7 +390,7 @@ c Stamp element: Ith *(here->VBICtempSubsPtr) += -Ith_Vrs; *(here->VBICtempSubsSIPtr) += +Ith_Vrs; } - if (here->VBIC_excessPhase) { + if (here->VBIC_excessPhase) { //Ixf1 *(here->VBICxf1BaseBIPtr) += +Ixf1_Vbei; *(here->VBICxf1EmitEIPtr) += -Ixf1_Vbei; @@ -518,10 +517,10 @@ c Stamp element: Qbco *(here->VBICbaseBPtempPtr + 1) += -XQbep_Vrth; *(here->VBICsubsSItempPtr + 1) += XQbcp_Vrth; *(here->VBICbaseBPtempPtr + 1) += -XQbcp_Vrth; - if (here->VBIC_excessPhase) { -// Stamp element: Ixf1 f_xf1 = + + if (here->VBIC_excessPhase) { +// Stamp element: Ixf1 f_xf1 = + *(here->VBICxf1TempPtr) += Ixf1_Vrth; -// Stamp element: Ixf2 f_xf2 = + +// Stamp element: Ixf2 f_xf2 = + *(here->VBICxf2TempPtr) += Ixf2_Vrth; } } diff --git a/src/spicelib/devices/vbic/vbicask.c b/src/spicelib/devices/vbic/vbicask.c index db5ecbac1..58450a0a9 100644 --- a/src/spicelib/devices/vbic/vbicask.c +++ b/src/spicelib/devices/vbic/vbicask.c @@ -22,9 +22,11 @@ Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH int VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalue *select) { - IFvalue IC, IB, IE, IS; + NG_IGNORE(select); VBICinstance *here = (VBICinstance*)instPtr; + IFvalue IC, IB; + switch(which) { case VBIC_AREA: value->rValue = here->VBICarea; @@ -76,6 +78,7 @@ VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalu return(OK); case VBIC_QUEST_CC: value->rValue = *(ckt->CKTstate0 + here->VBICiciei) - + *(ckt->CKTstate0 + here->VBICiccp) - *(ckt->CKTstate0 + here->VBICibc); value->rValue *= VBICmodPtr(here)->VBICtype; return(OK); @@ -99,26 +102,16 @@ VBICask(CKTcircuit *ckt, GENinstance *instPtr, int which, IFvalue *value, IFvalu value->rValue *= VBICmodPtr(here)->VBICtype; return(OK); case VBIC_QUEST_POWER: + value->rValue = fabs(here->VBICpower); + return(OK); + case VBIC_QUEST_BETA: VBICask(ckt, instPtr, VBIC_QUEST_CC, &IC, select); VBICask(ckt, instPtr, VBIC_QUEST_CB, &IB, select); - VBICask(ckt, instPtr, VBIC_QUEST_CE, &IE, select); - VBICask(ckt, instPtr, VBIC_QUEST_CS, &IS, select); - if (!here->VBIC_excessPhase) - value->rValue = fabs(*(ckt->CKTstate0 + here->VBICibe) * *(ckt->CKTstate0 + here->VBICvbei)) + - fabs(*(ckt->CKTstate0 + here->VBICibc) * *(ckt->CKTstate0 + here->VBICvbci)) + - fabs(*(ckt->CKTstate0 + here->VBICiciei)) - * fabs(*(ckt->CKTstate0 + here->VBICvbei) - *(ckt->CKTstate0 + here->VBICvbci)) + - fabs(*(ckt->CKTstate0 + here->VBICibex) * *(ckt->CKTstate0 + here->VBICvbex)) + - fabs(*(ckt->CKTstate0 + here->VBICibep) * *(ckt->CKTstate0 + here->VBICvbep)) + - fabs(*(ckt->CKTstate0 + here->VBICibcp) * *(ckt->CKTstate0 + here->VBICvbcp)) + - fabs(*(ckt->CKTstate0 + here->VBICiccp)) - * fabs(*(ckt->CKTstate0 + here->VBICvbep) - *(ckt->CKTstate0 + here->VBICvbcp)) + - fabs(IC.rValue * IC.rValue * here->VBICtextCollResist) + - fabs(IC.rValue * *(ckt->CKTstate0 + here->VBICvrci)) + - fabs(IB.rValue * IB.rValue * here->VBICtextBaseResist) + - fabs(IB.rValue * *(ckt->CKTstate0 + here->VBICvrbi)) + - fabs(IE.rValue * IE.rValue * here->VBICtemitterResist) + - fabs(IS.rValue * *(ckt->CKTstate0 + here->VBICvrbp)); + if (IB.rValue != 0.0) { + value->rValue = IC.rValue/IB.rValue; + } else { + value->rValue = 0.0; + } return(OK); case VBIC_QUEST_GM: value->rValue = *(ckt->CKTstate0 + here->VBICiciei_Vbei); diff --git a/src/spicelib/devices/vbic/vbicdefs.h b/src/spicelib/devices/vbic/vbicdefs.h index 0e97d06dd..e0edf1248 100644 --- a/src/spicelib/devices/vbic/vbicdefs.h +++ b/src/spicelib/devices/vbic/vbicdefs.h @@ -312,6 +312,8 @@ typedef struct sVBICinstance { double VBICith_Vre; double VBICith_Vrs; + double VBICpower; + int VBIC_selfheat; /* self-heating enabled */ int VBIC_excessPhase; /* excess phase enabled */ @@ -933,8 +935,7 @@ enum { /* device questions */ enum { - VBIC_QUEST_FT = 221, - VBIC_QUEST_COLLNODE, + VBIC_QUEST_COLLNODE = 221, VBIC_QUEST_BASENODE, VBIC_QUEST_EMITNODE, VBIC_QUEST_SUBSNODE, @@ -945,39 +946,27 @@ enum { VBIC_QUEST_BASEBPNODE, VBIC_QUEST_EMITEINODE, VBIC_QUEST_SUBSSINODE, - VBIC_QUEST_XF1NODE, - VBIC_QUEST_XF2NODE, VBIC_QUEST_VBE, VBIC_QUEST_VBC, VBIC_QUEST_CC, VBIC_QUEST_CB, VBIC_QUEST_CE, VBIC_QUEST_CS, + VBIC_QUEST_POWER, + VBIC_QUEST_BETA, VBIC_QUEST_GM, VBIC_QUEST_GO, VBIC_QUEST_GPI, VBIC_QUEST_GMU, VBIC_QUEST_GX, - VBIC_QUEST_QBE, - VBIC_QUEST_CQBE, - VBIC_QUEST_QBC, - VBIC_QUEST_CQBC, - VBIC_QUEST_QBX, - VBIC_QUEST_CQBX, - VBIC_QUEST_QBCP, - VBIC_QUEST_CQBCP, - VBIC_QUEST_CEXBC, - VBIC_QUEST_GEQCB, - VBIC_QUEST_GCSUB, - VBIC_QUEST_GDSUB, - VBIC_QUEST_GEQBX, VBIC_QUEST_CBE, VBIC_QUEST_CBEX, VBIC_QUEST_CBC, VBIC_QUEST_CBCX, VBIC_QUEST_CBEP, VBIC_QUEST_CBCP, - VBIC_QUEST_POWER, + VBIC_QUEST_QBE, + VBIC_QUEST_QBC, }; /* model questions */ diff --git a/src/spicelib/devices/vbic/vbicload.c b/src/spicelib/devices/vbic/vbicload.c index 78a08bf5a..708d86c82 100644 --- a/src/spicelib/devices/vbic/vbicload.c +++ b/src/spicelib/devices/vbic/vbicload.c @@ -18,20 +18,6 @@ Spice3 Implementation: 2003 Dietmar Warning DAnalyse GmbH #include "ngspice/sperror.h" #include "ngspice/devdefs.h" -int vbic_4T_it_cf_fj( - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *,double *,double *, - double *,double *,double *,double *,double *, - double *, double *, double *, - double *); int vbic_4T_et_cf_fj( double *,double *,double *,double *,double *,double *,double *, double *,double *,double *,double *,double *,double *,double *, @@ -65,23 +51,23 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) double p[108] ,Vrth=0.0,Vbei,Vbex,Vbci,Vbep,Vbcp ,Vrcx,Vbcx,Vrci,Vrbx,Vrbi,Vre,Vrbp - ,Vrs,Vbe,Vbc,Vcei=0.0,Vcep=0.0,Ibe,Ibe_Vrth=0.0 - ,Ibe_Vbei,Ibex,Ibex_Vrth=0.0,Ibex_Vbex,Itzf=0.0,Itzf_Vrth=0.0,Itzf_Vbei=0.0 - ,Itzf_Vbci=0.0,Itzr,Itzr_Vrth=0.0,Itzr_Vbci,Itzr_Vbei,Ibc,Ibc_Vrth=0.0 - ,Ibc_Vbci,Ibc_Vbei,Ibep,Ibep_Vrth=0.0,Ibep_Vbep,Ircx,Ircx_Vrcx - ,Ircx_Vrth=0.0,Irci,Irci_Vrci,Irci_Vrth=0.0,Irci_Vbci,Irci_Vbcx,Irbx - ,Irbx_Vrbx,Irbx_Vrth=0.0,Irbi,Irbi_Vrbi,Irbi_Vrth=0.0,Irbi_Vbei,Irbi_Vbci - ,Ire,Ire_Vre,Ire_Vrth=0.0,Irbp,Irbp_Vrbp,Irbp_Vrth=0.0,Irbp_Vbep - ,Irbp_Vbci,Qbe,Qbe_Vrth=0.0,Qbe_Vbei,Qbe_Vbci,Qbex,Qbex_Vrth=0.0 - ,Qbex_Vbex,Qbc,Qbc_Vrth=0.0,Qbc_Vbci,Qbcx,Qbcx_Vrth=0.0,Qbcx_Vbcx - ,Qbep,Qbep_Vrth=0.0,Qbep_Vbep,Qbep_Vbci,Qbeo,Qbeo_Vbe,Qbco - ,Qbco_Vbc,Ibcp,Ibcp_Vrth=0.0,Ibcp_Vbcp,Iccp,Iccp_Vrth=0.0,Iccp_Vbep - ,Iccp_Vbci,Iccp_Vbcp,Irs,Irs_Vrs,Irs_Vrth=0.0,Qbcp,Qbcp_Vrth=0.0 - ,Qbcp_Vbcp,Irth,Irth_Vrth=0.0,Ith=0.0,Ith_Vrth=0.0,Ith_Vbei=0.0,Ith_Vbci=0.0 + ,Vrs,Vbe,Vbc,Vcei=0.0,Vcep=0.0,Ibe=0.0,Ibe_Vrth=0.0 + ,Ibe_Vbei=0.0,Ibex=0.0,Ibex_Vrth=0.0,Ibex_Vbex=0.0,Itzf=0.0,Itzf_Vrth=0.0,Itzf_Vbei=0.0 + ,Itzf_Vbci=0.0,Itzr=0.0,Itzr_Vrth=0.0,Itzr_Vbci=0.0,Itzr_Vbei=0.0,Ibc=0.0,Ibc_Vrth=0.0 + ,Ibc_Vbci=0.0,Ibc_Vbei=0.0,Ibep=0.0,Ibep_Vrth=0.0,Ibep_Vbep=0.0,Ircx,Ircx_Vrcx=0.0 + ,Ircx_Vrth=0.0,Irci=0.0,Irci_Vrci=0.0,Irci_Vrth=0.0,Irci_Vbci=0.0,Irci_Vbcx=0.0,Irbx + ,Irbx_Vrbx=0.0,Irbx_Vrth=0.0,Irbi=0.0,Irbi_Vrbi=0.0,Irbi_Vrth=0.0,Irbi_Vbei=0.0,Irbi_Vbci=0.0 + ,Ire,Ire_Vre=0.0,Ire_Vrth=0.0,Irbp=0.0,Irbp_Vrbp=0.0,Irbp_Vrth=0.0,Irbp_Vbep=0.0 + ,Irbp_Vbci=0.0,Qbe=0.0,Qbe_Vrth=0.0,Qbe_Vbei=0.0,Qbe_Vbci=0.0,Qbex=0.0,Qbex_Vrth=0.0 + ,Qbex_Vbex=0.0,Qbc=0.0,Qbc_Vrth=0.0,Qbc_Vbci=0.0,Qbcx=0.0,Qbcx_Vrth=0.0,Qbcx_Vbcx=0.0 + ,Qbep=0.0,Qbep_Vrth=0.0,Qbep_Vbep=0.0,Qbep_Vbci=0.0,Qbeo=0.0,Qbeo_Vbe=0.0,Qbco=0.0 + ,Qbco_Vbc=0.0,Ibcp=0.0,Ibcp_Vrth=0.0,Ibcp_Vbcp=0.0,Iccp=0.0,Iccp_Vrth=0.0,Iccp_Vbep=0.0 + ,Iccp_Vbci=0.0,Iccp_Vbcp=0.0,Irs=0.0,Irs_Vrs=0.0,Irs_Vrth=0.0,Qbcp=0.0,Qbcp_Vrth=0.0 + ,Qbcp_Vbcp=0.0,Irth,Irth_Vrth=0.0,Ith=0.0,Ith_Vrth=0.0,Ith_Vbei=0.0,Ith_Vbci=0.0 ,Ith_Vcei=0.0,Ith_Vbex=0.0,Ith_Vbep=0.0,Ith_Vrs=0.0,Ith_Vbcp=0.0,Ith_Vcep=0.0,Ith_Vrcx=0.0 ,Ith_Vrci=0.0,Ith_Vbcx=0.0,Ith_Vrbx=0.0,Ith_Vrbi=0.0,Ith_Vre=0.0,Ith_Vrbp=0.0,Qcth=0.0 ,Qcth_Vrth=0.0 - ,Tf, Tf_Vbei, Tf_Vbci, Tf_Vrth=0.0 + ,Tf=0.0, Tf_Vbei=0.0, Tf_Vbci=0.0, Tf_Vrth=0.0 ,SCALE; int iret; @@ -117,14 +103,13 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) double Icth, Icth_Vrth; double Iciei, Iciei_Vbei, Iciei_Vbci, Iciei_Vrth, Iciei_Vxf2; //NQS - double Ixf1, Ixf2, Qxf1, Qxf2, Qxf1_Vxf1, Qxf2_Vxf2; - double Ixf1_Vxf1, Ixf1_Vxf2, Ixf1_ditf, Ixf1_dTf, Ixf1_Vbei, Ixf1_Vbci, Ixf1_Vrth; - double Ixf2_Vxf1, Ixf2_Vbei, Ixf2_Vbci, Ixf2_Vrth; - double Ixf2_Vxf2, Ixf2_dTf; - double Itxf; - double Itxf_Vxf2, Itxf_Vbci, Itxf_Vbei, Itxf_Vrth; - double Vxf1, Vxf2; - + double Ixf1=0.0, Ixf2=0.0, Qxf1=0.0, Qxf2=0.0, Qxf1_Vxf1=0.0, Qxf2_Vxf2=0.0; + double Ixf1_Vxf1=0.0, Ixf1_Vxf2=0.0, Ixf1_ditf=0.0, Ixf1_dTf=0.0, Ixf1_Vbei=0.0, Ixf1_Vbci=0.0, Ixf1_Vrth=0.0; + double Ixf2_Vxf1=0.0, Ixf2_Vbei=0.0, Ixf2_Vbci=0.0, Ixf2_Vrth=0.0; + double Ixf2_Vxf2=0.0, Ixf2_dTf=0.0; + double Itxf=0.0; + double Itxf_Vxf2=0.0, Itxf_Vbci=0.0, Itxf_Vbei=0.0, Itxf_Vrth=0.0; + double Vxf1=0.0, Vxf2=0.0; double delvxf2; /* loop through all the models */ @@ -661,18 +646,18 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) Irs_Vrs = *(ckt->CKTstate0 + here->VBICirs_Vrs); Ire_Vre = *(ckt->CKTstate0 + here->VBICire_Vre); if (here->VBIC_excessPhase) { - Ixf1 = *(ckt->CKTstate0 + here->VBICixf1) ; - Ixf1_Vbei = *(ckt->CKTstate0 + here->VBICixf1_Vbei) ; - Ixf1_Vbci = *(ckt->CKTstate0 + here->VBICixf1_Vbci) ; - Ixf1_Vxf2 = *(ckt->CKTstate0 + here->VBICixf1_Vxf2) ; - Ixf1_Vxf1 = *(ckt->CKTstate0 + here->VBICixf1_Vxf1) ; - Ixf1_Vrth = *(ckt->CKTstate0 + here->VBICixf1_Vrth) ; - Ixf2 = *(ckt->CKTstate0 + here->VBICixf2) ; - Ixf2_Vbei = *(ckt->CKTstate0 + here->VBICixf2_Vbei) ; - Ixf2_Vbci = *(ckt->CKTstate0 + here->VBICixf2_Vbci) ; - Ixf2_Vxf1 = *(ckt->CKTstate0 + here->VBICixf2_Vxf1) ; - Ixf2_Vxf2 = *(ckt->CKTstate0 + here->VBICixf2_Vxf2) ; - Ixf2_Vrth = *(ckt->CKTstate0 + here->VBICixf2_Vrth) ; + Ixf1 = *(ckt->CKTstate0 + here->VBICixf1); + Ixf1_Vbei = *(ckt->CKTstate0 + here->VBICixf1_Vbei); + Ixf1_Vbci = *(ckt->CKTstate0 + here->VBICixf1_Vbci); + Ixf1_Vxf2 = *(ckt->CKTstate0 + here->VBICixf1_Vxf2); + Ixf1_Vxf1 = *(ckt->CKTstate0 + here->VBICixf1_Vxf1); + Ixf1_Vrth = *(ckt->CKTstate0 + here->VBICixf1_Vrth); + Ixf2 = *(ckt->CKTstate0 + here->VBICixf2); + Ixf2_Vbei = *(ckt->CKTstate0 + here->VBICixf2_Vbei); + Ixf2_Vbci = *(ckt->CKTstate0 + here->VBICixf2_Vbci); + Ixf2_Vxf1 = *(ckt->CKTstate0 + here->VBICixf2_Vxf1); + Ixf2_Vxf2 = *(ckt->CKTstate0 + here->VBICixf2_Vxf2); + Ixf2_Vrth = *(ckt->CKTstate0 + here->VBICixf2_Vrth); } goto load; } @@ -704,44 +689,28 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) */ Vcei = Vbei - Vbci; Vcep = Vbep - Vbcp; - if (!here->VBIC_selfheat) { - iret = vbic_4T_it_cf_fj(p - ,&Vbei, &Vbex, &Vbci, &Vbep, &Vbcp, &Vrcx - ,&Vbcx, &Vrci, &Vrbx, &Vrbi, &Vre, &Vrbp, &Vrs - ,&Vbe, &Vbc, &Ibe, &Ibe_Vbei, &Ibex, &Ibex_Vbex, &Itzf - ,&Itzf_Vbei, &Itzf_Vbci, &Itzr, &Itzr_Vbci, &Itzr_Vbei, &Ibc, &Ibc_Vbci - ,&Ibc_Vbei, &Ibep, &Ibep_Vbep, &Ircx, &Ircx_Vrcx, &Irci, &Irci_Vrci - ,&Irci_Vbci, &Irci_Vbcx, &Irbx, &Irbx_Vrbx, &Irbi, &Irbi_Vrbi, &Irbi_Vbei - ,&Irbi_Vbci, &Ire, &Ire_Vre, &Irbp, &Irbp_Vrbp, &Irbp_Vbep, &Irbp_Vbci - ,&Qbe, &Qbe_Vbei, &Qbe_Vbci, &Qbex, &Qbex_Vbex, &Qbc, &Qbc_Vbci - ,&Qbcx, &Qbcx_Vbcx, &Qbep, &Qbep_Vbep, &Qbep_Vbci, &Qbeo, &Qbeo_Vbe - ,&Qbco, &Qbco_Vbc, &Ibcp, &Ibcp_Vbcp, &Iccp, &Iccp_Vbep, &Iccp_Vbci - ,&Iccp_Vbcp, &Irs, &Irs_Vrs, &Qbcp, &Qbcp_Vbcp - ,&Tf, &Tf_Vbei, &Tf_Vbci - ,&SCALE); - } else if (here->VBIC_selfheat) { - iret = vbic_4T_et_cf_fj(p - ,&Vrth, &Vbei, &Vbex, &Vbci, &Vbep, &Vbcp - ,&Vrcx, &Vbcx, &Vrci, &Vrbx, &Vrbi, &Vre, &Vrbp - ,&Vrs, &Vbe, &Vbc, &Vcei, &Vcep, &Ibe, &Ibe_Vrth - ,&Ibe_Vbei, &Ibex, &Ibex_Vrth, &Ibex_Vbex, &Itzf, &Itzf_Vrth, &Itzf_Vbei - ,&Itzf_Vbci, &Itzr, &Itzr_Vrth, &Itzr_Vbci, &Itzr_Vbei, &Ibc, &Ibc_Vrth - ,&Ibc_Vbci, &Ibc_Vbei, &Ibep, &Ibep_Vrth, &Ibep_Vbep, &Ircx, &Ircx_Vrcx - ,&Ircx_Vrth, &Irci, &Irci_Vrci, &Irci_Vrth, &Irci_Vbci, &Irci_Vbcx, &Irbx - ,&Irbx_Vrbx, &Irbx_Vrth, &Irbi, &Irbi_Vrbi, &Irbi_Vrth, &Irbi_Vbei, &Irbi_Vbci - ,&Ire, &Ire_Vre, &Ire_Vrth, &Irbp, &Irbp_Vrbp, &Irbp_Vrth, &Irbp_Vbep - ,&Irbp_Vbci, &Qbe, &Qbe_Vrth, &Qbe_Vbei, &Qbe_Vbci, &Qbex, &Qbex_Vrth - ,&Qbex_Vbex, &Qbc, &Qbc_Vrth, &Qbc_Vbci, &Qbcx, &Qbcx_Vrth, &Qbcx_Vbcx - ,&Qbep, &Qbep_Vrth, &Qbep_Vbep, &Qbep_Vbci, &Qbeo, &Qbeo_Vbe, &Qbco - ,&Qbco_Vbc, &Ibcp, &Ibcp_Vrth, &Ibcp_Vbcp, &Iccp, &Iccp_Vrth, &Iccp_Vbep - ,&Iccp_Vbci, &Iccp_Vbcp, &Irs, &Irs_Vrs, &Irs_Vrth, &Qbcp, &Qbcp_Vrth - ,&Qbcp_Vbcp, &Irth, &Irth_Vrth, &Ith, &Ith_Vrth, &Ith_Vbei, &Ith_Vbci - ,&Ith_Vcei, &Ith_Vbex, &Ith_Vbep, &Ith_Vrs, &Ith_Vbcp, &Ith_Vcep, &Ith_Vrcx - ,&Ith_Vrci, &Ith_Vbcx, &Ith_Vrbx, &Ith_Vrbi, &Ith_Vre, &Ith_Vrbp, &Qcth - ,&Qcth_Vrth - ,&Tf, &Tf_Vbei, &Tf_Vbci, &Tf_Vrth - ,&SCALE); - } + iret = vbic_4T_et_cf_fj(p + ,&Vrth, &Vbei, &Vbex, &Vbci, &Vbep, &Vbcp + ,&Vrcx, &Vbcx, &Vrci, &Vrbx, &Vrbi, &Vre, &Vrbp + ,&Vrs, &Vbe, &Vbc, &Vcei, &Vcep, &Ibe, &Ibe_Vrth + ,&Ibe_Vbei, &Ibex, &Ibex_Vrth, &Ibex_Vbex, &Itzf, &Itzf_Vrth, &Itzf_Vbei + ,&Itzf_Vbci, &Itzr, &Itzr_Vrth, &Itzr_Vbci, &Itzr_Vbei, &Ibc, &Ibc_Vrth + ,&Ibc_Vbci, &Ibc_Vbei, &Ibep, &Ibep_Vrth, &Ibep_Vbep, &Ircx, &Ircx_Vrcx + ,&Ircx_Vrth, &Irci, &Irci_Vrci, &Irci_Vrth, &Irci_Vbci, &Irci_Vbcx, &Irbx + ,&Irbx_Vrbx, &Irbx_Vrth, &Irbi, &Irbi_Vrbi, &Irbi_Vrth, &Irbi_Vbei, &Irbi_Vbci + ,&Ire, &Ire_Vre, &Ire_Vrth, &Irbp, &Irbp_Vrbp, &Irbp_Vrth, &Irbp_Vbep + ,&Irbp_Vbci, &Qbe, &Qbe_Vrth, &Qbe_Vbei, &Qbe_Vbci, &Qbex, &Qbex_Vrth + ,&Qbex_Vbex, &Qbc, &Qbc_Vrth, &Qbc_Vbci, &Qbcx, &Qbcx_Vrth, &Qbcx_Vbcx + ,&Qbep, &Qbep_Vrth, &Qbep_Vbep, &Qbep_Vbci, &Qbeo, &Qbeo_Vbe, &Qbco + ,&Qbco_Vbc, &Ibcp, &Ibcp_Vrth, &Ibcp_Vbcp, &Iccp, &Iccp_Vrth, &Iccp_Vbep + ,&Iccp_Vbci, &Iccp_Vbcp, &Irs, &Irs_Vrs, &Irs_Vrth, &Qbcp, &Qbcp_Vrth + ,&Qbcp_Vbcp, &Irth, &Irth_Vrth, &Ith, &Ith_Vrth, &Ith_Vbei, &Ith_Vbci + ,&Ith_Vcei, &Ith_Vbex, &Ith_Vbep, &Ith_Vrs, &Ith_Vbcp, &Ith_Vcep, &Ith_Vrcx + ,&Ith_Vrci, &Ith_Vbcx, &Ith_Vrbx, &Ith_Vrbi, &Ith_Vre, &Ith_Vrbp, &Qcth, &Qcth_Vrth + ,&Tf, &Tf_Vbei, &Tf_Vbci, &Tf_Vrth + ,&SCALE); + + here->VBICpower = Ith; // Excess Phase calculation if (here->VBIC_excessPhase) { @@ -984,9 +953,9 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->VBICcqcth); if (here->VBIC_excessPhase) { *(ckt->CKTstate1 + here->VBICcqxf1) = - *(ckt->CKTstate0 + here->VBICcqxf1) ; + *(ckt->CKTstate0 + here->VBICcqxf1); *(ckt->CKTstate1 + here->VBICcqxf2) = - *(ckt->CKTstate0 + here->VBICcqxf2) ; + *(ckt->CKTstate0 + here->VBICcqxf2); } } } @@ -1093,7 +1062,6 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) here->VBICibe_Vrth = Ibe_Vrth; here->VBICibex_Vrth = Ibex_Vrth; -// here->VBICiciei_Vrth = Iciei_Vrth; here->VBICibc_Vrth = Ibc_Vrth; here->VBICibep_Vrth = Ibep_Vrth; here->VBICircx_Vrth = Ircx_Vrth; @@ -1226,7 +1194,7 @@ c Stamp element: Rcx *(here->VBICcollCollCXPtr) += -Ircx_Vrcx; /* -c Stamp element: Irci +c Stamp element: Rci */ rhs_current = model->VBICtype * (Irci - Irci_Vrci*Vrci - Irci_Vbci*Vbci - Irci_Vbcx*Vbcx); *(ckt->CKTrhs + here->VBICcollCXNode) += -rhs_current; @@ -1251,7 +1219,7 @@ c Stamp element: Rbx *(here->VBICbaseBXBasePtr) += -Irbx_Vrbx; *(here->VBICbaseBaseBXPtr) += -Irbx_Vrbx; /* -c Stamp element: Irbi +c Stamp element: Rbi */ rhs_current = model->VBICtype * (Irbi - Irbi_Vrbi*Vrbi - Irbi_Vbei*Vbei - Irbi_Vbci*Vbci); *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; @@ -1276,7 +1244,7 @@ c Stamp element: Re *(here->VBICemitEIEmitPtr) += -Ire_Vre; *(here->VBICemitEmitEIPtr) += -Ire_Vre; /* -c Stamp element: Irbp +c Stamp element: Rbp */ rhs_current = model->VBICtype * (Irbp - Irbp_Vrbp*Vrbp - Irbp_Vbep*Vbep - Irbp_Vbci*Vbci); *(ckt->CKTrhs + here->VBICbaseBPNode) += -rhs_current; @@ -1402,7 +1370,7 @@ c Stamp element: Rcx *(ckt->CKTrhs + here->VBICcollCXNode) += rhs_current; *(here->VBICcollCXtempPtr) += -Ircx_Vrth; /* -c Stamp element: Irci +c Stamp element: Rci */ rhs_current = -Irci_Vrth*Vrth; *(ckt->CKTrhs + here->VBICcollCXNode) += -rhs_current; @@ -1418,7 +1386,7 @@ c Stamp element: Rbx *(ckt->CKTrhs + here->VBICbaseBXNode) += rhs_current; *(here->VBICbaseBXtempPtr) += -Irbx_Vrth; /* -c Stamp element: Irbi +c Stamp element: Rbi */ rhs_current = -Irbi_Vrth*Vrth; *(ckt->CKTrhs + here->VBICbaseBXNode) += -rhs_current; @@ -1539,1186 +1507,6 @@ c Stamp element: Ith return(OK); } -int vbic_4T_it_cf_fj(double *p - ,double *Vbei, double *Vbex, double *Vbci, double *Vbep, double *Vbcp, double *Vrcx - ,double *Vbcx, double *Vrci, double *Vrbx, double *Vrbi, double *Vre, double *Vrbp, double *Vrs - ,double *Vbe, double *Vbc, double *Ibe, double *Ibe_Vbei, double *Ibex, double *Ibex_Vbex, double *Itzf - ,double *Itzf_Vbei, double *Itzf_Vbci, double *Itzr, double *Itzr_Vbci, double *Itzr_Vbei, double *Ibc, double *Ibc_Vbci - ,double *Ibc_Vbei, double *Ibep, double *Ibep_Vbep, double *Ircx, double *Ircx_Vrcx, double *Irci, double *Irci_Vrci - ,double *Irci_Vbci, double *Irci_Vbcx, double *Irbx, double *Irbx_Vrbx, double *Irbi, double *Irbi_Vrbi, double *Irbi_Vbei - ,double *Irbi_Vbci, double *Ire, double *Ire_Vre, double *Irbp, double *Irbp_Vrbp, double *Irbp_Vbep, double *Irbp_Vbci - ,double *Qbe, double *Qbe_Vbei, double *Qbe_Vbci, double *Qbex, double *Qbex_Vbex, double *Qbc, double *Qbc_Vbci - ,double *Qbcx, double *Qbcx_Vbcx, double *Qbep, double *Qbep_Vbep, double *Qbep_Vbci, double *Qbeo, double *Qbeo_Vbe - ,double *Qbco, double *Qbco_Vbc, double *Ibcp, double *Ibcp_Vbcp, double *Iccp, double *Iccp_Vbep, double *Iccp_Vbci - ,double *Iccp_Vbcp, double *Irs, double *Irs_Vrs, double *Qbcp, double *Qbcp_Vbcp - ,double *tff, double *tff_Vbei, double *tff_Vbci - ,double *SCALE) -{ -double Vtv,IVEF,IVER,IIKF,IIKR,IIKP,IVO; -double IHRCF,IVTF,IITF,slTF,dv0,dvh,dvh_Vbei; -double xvar1,xvar2,pwq,qlo,qlo_Vbei,qhi,qhi_dvh; -double qhi_Vbei,xvar1_Vbei,xvar3,xvar3_xvar1,xvar3_Vbei,qlo_xvar3,qdbe; -double qdbe_qlo,qdbe_Vbei,qdbe_qhi,mv0,vl0,q0,dv; -double dv_Vbei,mv,mv_dv,mv_Vbei,vl,vl_dv,vl_Vbei; -double vl_mv,xvar1_vl,qdbe_vl,dvh_Vbex,qlo_Vbex,qhi_Vbex,xvar1_Vbex; -double xvar3_Vbex,qdbex,qdbex_qlo,qdbex_Vbex,qdbex_qhi,dv_Vbex,mv_Vbex; -double vl_Vbex,qdbex_vl,dvh_Vbci,qlo_Vbci,qhi_Vbci,xvar1_Vbci,xvar3_Vbci; -double qdbc,qdbc_qlo,qdbc_Vbci,qdbc_qhi,vn0,vnl0,qlo0; -double vn,vn_Vbci,vnl,vnl_vn,vnl_Vbci,vl_vnl,vl_Vbci; -double sel,sel_vnl,sel_Vbci,crt,cmx,cl,cl_sel; -double cl_Vbci,ql,ql_Vbci,ql_vl,ql_cl,qdbc_ql,dv_Vbci; -double mv_Vbci,qdbc_vl,dvh_Vbep,qlo_Vbep,qhi_Vbep,xvar1_Vbep,xvar3_Vbep; -double qdbep,qdbep_qlo,qdbep_Vbep,qdbep_qhi,vn_Vbep,vnl_Vbep,vl_Vbep; -double sel_Vbep,cl_Vbep,ql_Vbep,qdbep_ql,dv_Vbep,mv_Vbep,qdbep_vl; -double dvh_Vbcp,qlo_Vbcp,qhi_Vbcp,xvar1_Vbcp,xvar3_Vbcp,qdbcp,qdbcp_qlo; -double qdbcp_Vbcp,qdbcp_Vbep,qdbcp_qhi,dv_Vbcp,mv_Vbcp,vl_Vbcp,qdbcp_vl; -double argi,argi_Vbei,expi,expi_argi,expi_Vbei,Ifi,Ifi_expi; -double Ifi_Vbei,argi_Vbci,expi_Vbci,Iri,Iri_expi,Iri_Vbci,q1z; -double q1z_qdbe,q1z_Vbei,q1z_qdbc,q1z_Vbci,q1,q1_q1z,q1_Vbei; -double q1_Vbci,q2,q2_Ifi,q2_Vbei,q2_Iri,q2_Vbci,xvar3_q1; -double xvar1_xvar3,xvar1_q2,xvar4,xvar4_xvar1,xvar4_Vbei,xvar4_Vbci,qb; -double qb_q1,qb_Vbei,qb_Vbci,qb_xvar4,xvar2_xvar1,xvar2_Vbei,xvar2_Vbci; -double qb_xvar2,Itzr_Iri,Itzr_qb,Itzf_Ifi,Itzf_qb,argi_Vbep,expi_Vbep; -double argx,argx_Vbci,expx,expx_argx,expx_Vbci,Ifp,Ifp_expi; -double Ifp_Vbep,Ifp_expx,Ifp_Vbci,q2p,q2p_Ifp,q2p_Vbep,q2p_Vbci; -double qbp,qbp_q2p,qbp_Vbep,qbp_Vbci,argi_Vbcp,expi_Vbcp,Irp; -double Irp_expi,Irp_Vbcp,Iccp_Ifp,Iccp_Irp,Iccp_qbp,argn,argn_Vbei; -double expn,expn_argn,expn_Vbei,argx_Vbei,expx_Vbei,Ibe_expi,Ibe_expn; -double Ibe_expx,argi_Vbex,expi_Vbex,argn_Vbex,expn_Vbex,argx_Vbex,expx_Vbex; -double Ibex_expi,Ibex_expn,Ibex_expx,argn_Vbci,expn_Vbci,Ibcj,Ibcj_expi; -double Ibcj_Vbci,Ibcj_expn,argn_Vbep,expn_Vbep,Ibep_expi,Ibep_expn,xvar3_vl; -double avalf,avalf_vl,avalf_Vbci,avalf_xvar4,Igc,Igc_Itzf,Igc_Vbei; -double Igc_Vbci,Igc_Itzr,Igc_Ibcj,Igc_avalf,Ibc_Ibcj,Ibc_Igc,argx_Vbcx; -double expx_Vbcx,Kbci,Kbci_expi,Kbci_Vbci,Kbcx,Kbcx_expx,Kbcx_Vbcx; -double rKp1,rKp1_Kbci,rKp1_Vbci,rKp1_Kbcx,rKp1_Vbcx,xvar1_rKp1,xvar1_Vbcx; -double Iohm,Iohm_Vrci,Iohm_Kbci,Iohm_Vbci,Iohm_Kbcx,Iohm_Vbcx,Iohm_xvar1; -double derf,derf_Iohm,derf_Vrci,derf_Vbci,derf_Vbcx,Irci_Iohm,Irci_derf; -double Irbi_qb,Irbp_qbp,argn_Vbcp,expn_Vbcp,Ibcp_expi,Ibcp_expn,sgIf; -double rIf,rIf_Ifi,rIf_Vbei,mIf,mIf_rIf,mIf_Vbei; -double tff_q1,tff_xvar2,tff_mIf,Qbe_qdbe,Qbe_tff; -double Qbe_Ifi,Qbe_qb,Qbex_qdbex,Qbc_qdbc,Qbc_Iri,Qbc_Kbci,Qbcx_Kbcx; -double Qbep_qdbep,Qbep_Ifp,Qbcp_qdbcp; -//double tff, tff_Vbei, tff_Vbci; - -/* Function and derivative code */ - - Vtv=1.380662e-23*(2.731500e+02+p[0])/1.602189e-19; - if(p[51]>0.0){ - IVEF=1.0/p[51]; - }else{ - IVEF=0.0; - } - if(p[52]>0.0){ - IVER=1.0/p[52]; - }else{ - IVER=0.0; - } - if(p[53]>0.0){ - IIKF=1.0/p[53]; - }else{ - IIKF=0.0; - } - if(p[54]>0.0){ - IIKR=1.0/p[54]; - }else{ - IIKR=0.0; - } - if(p[55]>0.0){ - IIKP=1.0/p[55]; - }else{ - IIKP=0.0; - } - if(p[3]>0.0){ - IVO=1.0/p[3]; - }else{ - IVO=0.0; - } - if(p[5]>0.0){ - IHRCF=1.0/p[5]; - }else{ - IHRCF=0.0; - } - if(p[59]>0.0){ - IVTF=1.0/p[59]; - }else{ - IVTF=0.0; - } - if(p[60]>0.0){ - IITF=1.0/p[60]; - }else{ - IITF=0.0; - } - if(p[60]>0.0){ - slTF=0.0; - }else{ - slTF=1.0; - } - dv0=-p[17]*p[14]; - if(p[19]<=0.0){ - dvh=(*Vbei)+dv0; - dvh_Vbei=1.0; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[18]); - pwq=pow(xvar1,xvar2); - qlo=p[17]*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[18]); - qlo_Vbei=0.0; - qhi=dvh*(1.0-p[14]+0.5*p[18]*dvh/p[17])*pwq; - qhi_dvh=(0.5*dvh*p[18]/p[17]-p[14]+1.0)*pwq+0.5*dvh*p[18]*pwq/p[17]; - qhi_Vbei=qhi_dvh*dvh_Vbei; - }else{ - xvar1=(1.0-(*Vbei)/p[17]); - xvar1_Vbei=-1.0/p[17]; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbei=xvar3_xvar1*xvar1_Vbei; - qlo=p[17]*(1.0-xvar3)/(1.0-p[18]); - qlo_xvar3=-p[17]/(1.0-p[18]); - qlo_Vbei=qlo_xvar3*xvar3_Vbei; - qhi=0.0; - qhi_Vbei=0.0; - } - qdbe=qlo+qhi; - qdbe_qlo=1.0; - qdbe_qhi=1.0; - qdbe_Vbei=qdbe_qlo*qlo_Vbei; - qdbe_Vbei=qdbe_Vbei+qdbe_qhi*qhi_Vbei; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[19]*p[19]); - vl0=-0.5*(dv0+mv0); - xvar1=(1.0-vl0/p[17]); - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - q0=-p[17]*xvar3/(1.0-p[18]); - dv=(*Vbei)+dv0; - dv_Vbei=1.0; - mv=sqrt(dv*dv+4.0*p[19]*p[19]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[19]*p[19])); - mv_Vbei=mv_dv*dv_Vbei; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_Vbei=vl_dv*dv_Vbei; - vl_Vbei=vl_Vbei+vl_mv*mv_Vbei; - xvar1=(1.0-vl/p[17]); - xvar1_vl=-1.0/p[17]; - xvar1_Vbei=xvar1_vl*vl_Vbei; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbei=xvar3_xvar1*xvar1_Vbei; - qlo=-p[17]*xvar3/(1.0-p[18]); - qlo_xvar3=-p[17]/(1.0-p[18]); - qlo_Vbei=qlo_xvar3*xvar3_Vbei; - xvar1=(1.0-p[14]); - xvar2=(-p[18]); - xvar3=pow(xvar1,xvar2); - qdbe=qlo+xvar3*((*Vbei)-vl+vl0)-q0; - qdbe_qlo=1.0; - qdbe_Vbei=xvar3; - qdbe_vl=-xvar3; - qdbe_Vbei=qdbe_Vbei+qdbe_qlo*qlo_Vbei; - qdbe_Vbei=qdbe_Vbei+qdbe_vl*vl_Vbei; - } - dv0=-p[17]*p[14]; - if(p[19]<=0.0){ - dvh=(*Vbex)+dv0; - dvh_Vbex=1.0; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[18]); - pwq=pow(xvar1,xvar2); - qlo=p[17]*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[18]); - qlo_Vbex=0.0; - qhi=dvh*(1.0-p[14]+0.5*p[18]*dvh/p[17])*pwq; - qhi_dvh=(0.5*dvh*p[18]/p[17]-p[14]+1.0)*pwq+0.5*dvh*p[18]*pwq/p[17]; - qhi_Vbex=qhi_dvh*dvh_Vbex; - }else{ - xvar1=(1.0-(*Vbex)/p[17]); - xvar1_Vbex=-1.0/p[17]; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbex=xvar3_xvar1*xvar1_Vbex; - qlo=p[17]*(1.0-xvar3)/(1.0-p[18]); - qlo_xvar3=-p[17]/(1.0-p[18]); - qlo_Vbex=qlo_xvar3*xvar3_Vbex; - qhi=0.0; - qhi_Vbex=0.0; - } - qdbex=qlo+qhi; - qdbex_qlo=1.0; - qdbex_qhi=1.0; - qdbex_Vbex=qdbex_qlo*qlo_Vbex; - qdbex_Vbex=qdbex_Vbex+qdbex_qhi*qhi_Vbex; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[19]*p[19]); - vl0=-0.5*(dv0+mv0); - xvar1=(1.0-vl0/p[17]); - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - q0=-p[17]*xvar3/(1.0-p[18]); - dv=(*Vbex)+dv0; - dv_Vbex=1.0; - mv=sqrt(dv*dv+4.0*p[19]*p[19]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[19]*p[19])); - mv_Vbex=mv_dv*dv_Vbex; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_Vbex=vl_dv*dv_Vbex; - vl_Vbex=vl_Vbex+vl_mv*mv_Vbex; - xvar1=(1.0-vl/p[17]); - xvar1_vl=-1.0/p[17]; - xvar1_Vbex=xvar1_vl*vl_Vbex; - xvar2=(1.0-p[18]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbex=xvar3_xvar1*xvar1_Vbex; - qlo=-p[17]*xvar3/(1.0-p[18]); - qlo_xvar3=-p[17]/(1.0-p[18]); - qlo_Vbex=qlo_xvar3*xvar3_Vbex; - xvar1=(1.0-p[14]); - xvar2=(-p[18]); - xvar3=pow(xvar1,xvar2); - qdbex=qlo+xvar3*((*Vbex)-vl+vl0)-q0; - qdbex_qlo=1.0; - qdbex_Vbex=xvar3; - qdbex_vl=-xvar3; - qdbex_Vbex=qdbex_Vbex+qdbex_qlo*qlo_Vbex; - qdbex_Vbex=qdbex_Vbex+qdbex_vl*vl_Vbex; - } - dv0=-p[24]*p[14]; - if(p[26]<=0.0){ - dvh=(*Vbci)+dv0; - dvh_Vbci=1.0; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[25]); - pwq=pow(xvar1,xvar2); - qlo=p[24]*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[25]); - qlo_Vbci=0.0; - qhi=dvh*(1.0-p[14]+0.5*p[25]*dvh/p[24])*pwq; - qhi_dvh=(0.5*dvh*p[25]/p[24]-p[14]+1.0)*pwq+0.5*dvh*p[25]*pwq/p[24]; - qhi_Vbci=qhi_dvh*dvh_Vbci; - }else{ - if((p[85]>0.0)&&((*Vbci)<-p[85])){ - xvar1=(1.0+p[85]/p[24]); - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - qlo=p[24]*(1.0-xvar3*(1.0-((1.0-p[25])*((*Vbci)+p[85]))/(p[24]+p[85])))/(1.0-p[25]); - qlo_Vbci=p[24]*xvar3/(p[85]+p[24]); - }else{ - xvar1=(1.0-(*Vbci)/p[24]); - xvar1_Vbci=-1.0/p[24]; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbci=xvar3_xvar1*xvar1_Vbci; - qlo=p[24]*(1.0-xvar3)/(1.0-p[25]); - qlo_xvar3=-p[24]/(1.0-p[25]); - qlo_Vbci=qlo_xvar3*xvar3_Vbci; - } - qhi=0.0; - qhi_Vbci=0.0; - } - qdbc=qlo+qhi; - qdbc_qlo=1.0; - qdbc_qhi=1.0; - qdbc_Vbci=qdbc_qlo*qlo_Vbci; - qdbc_Vbci=qdbc_Vbci+qdbc_qhi*qhi_Vbci; - }else{ - if((p[85]>0.0)&&(p[86]>0.0)){ - vn0=(p[85]+dv0)/(p[85]-dv0); - vnl0=2.0*vn0/(sqrt((vn0-1.0)*(vn0-1.0)+4.0*p[26]*p[26])+sqrt((vn0+1.0)*(vn0+1.0)+4.0*p[86]*p[86])); - vl0=0.5*(vnl0*(p[85]-dv0)-p[85]-dv0); - xvar1=(1.0-vl0/p[24]); - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - qlo0=p[24]*(1.0-xvar3)/(1.0-p[25]); - vn=(2.0*(*Vbci)+p[85]+dv0)/(p[85]-dv0); - vn_Vbci=2.0/(p[85]-dv0); - vnl=2.0*vn/(sqrt((vn-1.0)*(vn-1.0)+4.0*p[26]*p[26])+sqrt((vn+1.0)*(vn+1.0)+4.0*p[86]*p[86])); - vnl_vn=2.0/(sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))-2.0*vn*((vn+1.0)/sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+(vn-1.0)/sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))/((sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))*(sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))); - vnl_Vbci=vnl_vn*vn_Vbci; - vl=0.5*(vnl*(p[85]-dv0)-p[85]-dv0); - vl_vnl=0.5*(p[85]-dv0); - vl_Vbci=vl_vnl*vnl_Vbci; - xvar1=(1.0-vl/p[24]); - xvar1_vl=-1.0/p[24]; - xvar1_Vbci=xvar1_vl*vl_Vbci; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbci=xvar3_xvar1*xvar1_Vbci; - qlo=p[24]*(1.0-xvar3)/(1.0-p[25]); - qlo_xvar3=-p[24]/(1.0-p[25]); - qlo_Vbci=qlo_xvar3*xvar3_Vbci; - sel=0.5*(vnl+1.0); - sel_vnl=0.5; - sel_Vbci=sel_vnl*vnl_Vbci; - xvar1=(1.0+p[85]/p[24]); - xvar2=(-p[25]); - crt=pow(xvar1,xvar2); - xvar1=(1.0+dv0/p[24]); - xvar2=(-p[25]); - cmx=pow(xvar1,xvar2); - cl=(1.0-sel)*crt+sel*cmx; - cl_sel=cmx-crt; - cl_Vbci=cl_sel*sel_Vbci; - ql=((*Vbci)-vl+vl0)*cl; - ql_Vbci=cl; - ql_vl=-cl; - ql_cl=vl0-vl+(*Vbci); - ql_Vbci=ql_Vbci+ql_vl*vl_Vbci; - ql_Vbci=ql_Vbci+ql_cl*cl_Vbci; - qdbc=ql+qlo-qlo0; - qdbc_ql=1.0; - qdbc_qlo=1.0; - qdbc_Vbci=qdbc_ql*ql_Vbci; - qdbc_Vbci=qdbc_Vbci+qdbc_qlo*qlo_Vbci; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[26]*p[26]); - vl0=-0.5*(dv0+mv0); - xvar1=(1.0-vl0/p[24]); - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - q0=-p[24]*xvar3/(1.0-p[25]); - dv=(*Vbci)+dv0; - dv_Vbci=1.0; - mv=sqrt(dv*dv+4.0*p[26]*p[26]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[26]*p[26])); - mv_Vbci=mv_dv*dv_Vbci; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_Vbci=vl_dv*dv_Vbci; - vl_Vbci=vl_Vbci+vl_mv*mv_Vbci; - xvar1=(1.0-vl/p[24]); - xvar1_vl=-1.0/p[24]; - xvar1_Vbci=xvar1_vl*vl_Vbci; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbci=xvar3_xvar1*xvar1_Vbci; - qlo=-p[24]*xvar3/(1.0-p[25]); - qlo_xvar3=-p[24]/(1.0-p[25]); - qlo_Vbci=qlo_xvar3*xvar3_Vbci; - xvar1=(1.0-p[14]); - xvar2=(-p[25]); - xvar3=pow(xvar1,xvar2); - qdbc=qlo+xvar3*((*Vbci)-vl+vl0)-q0; - qdbc_qlo=1.0; - qdbc_Vbci=xvar3; - qdbc_vl=-xvar3; - qdbc_Vbci=qdbc_Vbci+qdbc_qlo*qlo_Vbci; - qdbc_Vbci=qdbc_Vbci+qdbc_vl*vl_Vbci; - } - } - dv0=-p[24]*p[14]; - if(p[26]<=0.0){ - dvh=(*Vbep)+dv0; - dvh_Vbep=1.0; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[25]); - pwq=pow(xvar1,xvar2); - qlo=p[24]*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[25]); - qlo_Vbep=0.0; - qhi=dvh*(1.0-p[14]+0.5*p[25]*dvh/p[24])*pwq; - qhi_dvh=(0.5*dvh*p[25]/p[24]-p[14]+1.0)*pwq+0.5*dvh*p[25]*pwq/p[24]; - qhi_Vbep=qhi_dvh*dvh_Vbep; - }else{ - if((p[85]>0.0)&&((*Vbep)<-p[85])){ - xvar1=(1.0+p[85]/p[24]); - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - qlo=p[24]*(1.0-xvar3*(1.0-((1.0-p[25])*((*Vbep)+p[85]))/(p[24]+p[85])))/(1.0-p[25]); - qlo_Vbep=p[24]*xvar3/(p[85]+p[24]); - }else{ - xvar1=(1.0-(*Vbep)/p[24]); - xvar1_Vbep=-1.0/p[24]; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbep=xvar3_xvar1*xvar1_Vbep; - qlo=p[24]*(1.0-xvar3)/(1.0-p[25]); - qlo_xvar3=-p[24]/(1.0-p[25]); - qlo_Vbep=qlo_xvar3*xvar3_Vbep; - } - qhi=0.0; - qhi_Vbep=0.0; - } - qdbep=qlo+qhi; - qdbep_qlo=1.0; - qdbep_qhi=1.0; - qdbep_Vbep=qdbep_qlo*qlo_Vbep; - qdbep_Vbep=qdbep_Vbep+qdbep_qhi*qhi_Vbep; - }else{ - if((p[85]>0.0)&&(p[86]>0.0)){ - vn0=(p[85]+dv0)/(p[85]-dv0); - vnl0=2.0*vn0/(sqrt((vn0-1.0)*(vn0-1.0)+4.0*p[26]*p[26])+sqrt((vn0+1.0)*(vn0+1.0)+4.0*p[86]*p[86])); - vl0=0.5*(vnl0*(p[85]-dv0)-p[85]-dv0); - xvar1=(1.0-vl0/p[24]); - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - qlo0=p[24]*(1.0-xvar3)/(1.0-p[25]); - vn=(2.0*(*Vbep)+p[85]+dv0)/(p[85]-dv0); - vn_Vbep=2.0/(p[85]-dv0); - vnl=2.0*vn/(sqrt((vn-1.0)*(vn-1.0)+4.0*p[26]*p[26])+sqrt((vn+1.0)*(vn+1.0)+4.0*p[86]*p[86])); - vnl_vn=2.0/(sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))-2.0*vn*((vn+1.0)/sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+(vn-1.0)/sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))/((sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))*(sqrt(((vn+1.0)*(vn+1.0))+4.0*(p[86]*p[86]))+sqrt(((vn-1.0)*(vn-1.0))+4.0*(p[26]*p[26])))); - vnl_Vbep=vnl_vn*vn_Vbep; - vl=0.5*(vnl*(p[85]-dv0)-p[85]-dv0); - vl_vnl=0.5*(p[85]-dv0); - vl_Vbep=vl_vnl*vnl_Vbep; - xvar1=(1.0-vl/p[24]); - xvar1_vl=-1.0/p[24]; - xvar1_Vbep=xvar1_vl*vl_Vbep; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbep=xvar3_xvar1*xvar1_Vbep; - qlo=p[24]*(1.0-xvar3)/(1.0-p[25]); - qlo_xvar3=-p[24]/(1.0-p[25]); - qlo_Vbep=qlo_xvar3*xvar3_Vbep; - sel=0.5*(vnl+1.0); - sel_vnl=0.5; - sel_Vbep=sel_vnl*vnl_Vbep; - xvar1=(1.0+p[85]/p[24]); - xvar2=(-p[25]); - crt=pow(xvar1,xvar2); - xvar1=(1.0+dv0/p[24]); - xvar2=(-p[25]); - cmx=pow(xvar1,xvar2); - cl=(1.0-sel)*crt+sel*cmx; - cl_sel=cmx-crt; - cl_Vbep=cl_sel*sel_Vbep; - ql=((*Vbep)-vl+vl0)*cl; - ql_Vbep=cl; - ql_vl=-cl; - ql_cl=vl0-vl+(*Vbep); - ql_Vbep=ql_Vbep+ql_vl*vl_Vbep; - ql_Vbep=ql_Vbep+ql_cl*cl_Vbep; - qdbep=ql+qlo-qlo0; - qdbep_ql=1.0; - qdbep_qlo=1.0; - qdbep_Vbep=qdbep_ql*ql_Vbep; - qdbep_Vbep=qdbep_Vbep+qdbep_qlo*qlo_Vbep; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[26]*p[26]); - vl0=-0.5*(dv0+mv0); - xvar1=(1.0-vl0/p[24]); - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - q0=-p[24]*xvar3/(1.0-p[25]); - dv=(*Vbep)+dv0; - dv_Vbep=1.0; - mv=sqrt(dv*dv+4.0*p[26]*p[26]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[26]*p[26])); - mv_Vbep=mv_dv*dv_Vbep; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_Vbep=vl_dv*dv_Vbep; - vl_Vbep=vl_Vbep+vl_mv*mv_Vbep; - xvar1=(1.0-vl/p[24]); - xvar1_vl=-1.0/p[24]; - xvar1_Vbep=xvar1_vl*vl_Vbep; - xvar2=(1.0-p[25]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbep=xvar3_xvar1*xvar1_Vbep; - qlo=-p[24]*xvar3/(1.0-p[25]); - qlo_xvar3=-p[24]/(1.0-p[25]); - qlo_Vbep=qlo_xvar3*xvar3_Vbep; - xvar1=(1.0-p[14]); - xvar2=(-p[25]); - xvar3=pow(xvar1,xvar2); - qdbep=qlo+xvar3*((*Vbep)-vl+vl0)-q0; - qdbep_qlo=1.0; - qdbep_Vbep=xvar3; - qdbep_vl=-xvar3; - qdbep_Vbep=qdbep_Vbep+qdbep_qlo*qlo_Vbep; - qdbep_Vbep=qdbep_Vbep+qdbep_vl*vl_Vbep; - } - } - if(p[27]>0.0){ - dv0=-p[28]*p[14]; - if(p[30]<=0.0){ - dvh=(*Vbcp)+dv0; - dvh_Vbcp=1.0; - if(dvh>0.0){ - xvar1=(1.0-p[14]); - xvar2=(-1.0-p[29]); - pwq=pow(xvar1,xvar2); - qlo=p[28]*(1.0-pwq*(1.0-p[14])*(1.0-p[14]))/(1.0-p[29]); - qlo_Vbep=0.0; - qlo_Vbcp=0.0; - qhi=dvh*(1.0-p[14]+0.5*p[29]*dvh/p[28])*pwq; - qhi_dvh=(0.5*dvh*p[29]/p[28]-p[14]+1.0)*pwq+0.5*dvh*p[29]*pwq/p[28]; - qhi_Vbep=0.0; - qhi_Vbcp=qhi_dvh*dvh_Vbcp; - }else{ - xvar1=(1.0-(*Vbcp)/p[28]); - xvar1_Vbcp=-1.0/p[28]; - xvar2=(1.0-p[29]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbcp=xvar3_xvar1*xvar1_Vbcp; - qlo=p[28]*(1.0-xvar3)/(1.0-p[29]); - qlo_xvar3=-p[28]/(1.0-p[29]); - qlo_Vbep=0.0; - qlo_Vbcp=qlo_xvar3*xvar3_Vbcp; - qhi=0.0; - qhi_Vbep=0.0; - qhi_Vbcp=0.0; - } - qdbcp=qlo+qhi; - qdbcp_qlo=1.0; - qdbcp_qhi=1.0; - qdbcp_Vbcp=qdbcp_qlo*qlo_Vbcp; - qdbcp_Vbep=qdbcp_qlo*qlo_Vbep; - qdbcp_Vbep=qdbcp_Vbep+qdbcp_qhi*qhi_Vbep; - qdbcp_Vbcp=qdbcp_Vbcp+qdbcp_qhi*qhi_Vbcp; - }else{ - mv0=sqrt(dv0*dv0+4.0*p[30]*p[30]); - vl0=-0.5*(dv0+mv0); - xvar1=(1.0-vl0/p[28]); - xvar2=(1.0-p[29]); - xvar3=pow(xvar1,xvar2); - q0=-p[28]*xvar3/(1.0-p[29]); - dv=(*Vbcp)+dv0; - dv_Vbcp=1.0; - mv=sqrt(dv*dv+4.0*p[30]*p[30]); - mv_dv=dv/sqrt((dv*dv)+4.0*(p[30]*p[30])); - mv_Vbcp=mv_dv*dv_Vbcp; - vl=0.5*(dv-mv)-dv0; - vl_dv=0.5; - vl_mv=-0.5; - vl_Vbcp=vl_dv*dv_Vbcp; - vl_Vbcp=vl_Vbcp+vl_mv*mv_Vbcp; - xvar1=(1.0-vl/p[28]); - xvar1_vl=-1.0/p[28]; - xvar1_Vbcp=xvar1_vl*vl_Vbcp; - xvar2=(1.0-p[29]); - xvar3=pow(xvar1,xvar2); - xvar3_xvar1=xvar3*xvar2/xvar1; - xvar3_Vbcp=xvar3_xvar1*xvar1_Vbcp; - qlo=-p[28]*xvar3/(1.0-p[29]); - qlo_xvar3=-p[28]/(1.0-p[29]); - qlo_Vbep=0.0; - qlo_Vbcp=qlo_xvar3*xvar3_Vbcp; - xvar1=(1.0-p[14]); - xvar2=(-p[29]); - xvar3=pow(xvar1,xvar2); - qdbcp=qlo+xvar3*((*Vbcp)-vl+vl0)-q0; - qdbcp_qlo=1.0; - qdbcp_Vbcp=xvar3; - qdbcp_vl=-xvar3; - qdbcp_Vbcp=qdbcp_Vbcp+qdbcp_qlo*qlo_Vbcp; - qdbcp_Vbep=qdbcp_qlo*qlo_Vbep; - qdbcp_Vbcp=qdbcp_Vbcp+qdbcp_vl*vl_Vbcp; - } - }else{ - qdbcp=0.0; - qdbcp_Vbcp=0.0; - } - argi=(*Vbei)/(p[12]*Vtv); - argi_Vbei=1.0/(p[12]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbei=expi_argi*argi_Vbei; - Ifi=p[11]*(expi-1.0); - Ifi_expi=p[11]; - Ifi_Vbei=Ifi_expi*expi_Vbei; - argi=(*Vbci)/(p[13]*Vtv); - argi_Vbci=1.0/(p[13]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbci=expi_argi*argi_Vbci; - Iri=p[11]*p[94]*(expi-1.0); - Iri_expi=p[11]*p[94]; - Iri_Vbci=Iri_expi*expi_Vbci; - q1z=1.0+qdbe*IVER+qdbc*IVEF; - q1z_qdbe=IVER; - q1z_qdbc=IVEF; - q1z_Vbei=q1z_qdbe*qdbe_Vbei; - q1z_Vbci=q1z_qdbc*qdbc_Vbci; - q1=0.5*(sqrt((q1z-1.0e-4)*(q1z-1.0e-4)+1.0e-8)+q1z-1.0e-4)+1.0e-4; - q1_q1z=0.5*((q1z-1.0e-4)/sqrt(((q1z-1.0e-4)*(q1z-1.0e-4))+1.0e-8)+1.0); - q1_Vbei=q1_q1z*q1z_Vbei; - q1_Vbci=q1_q1z*q1z_Vbci; - q2=Ifi*IIKF+Iri*IIKR; - q2_Ifi=IIKF; - q2_Iri=IIKR; - q2_Vbei=q2_Ifi*Ifi_Vbei; - q2_Vbci=q2_Iri*Iri_Vbci; - if(p[88]<0.5){ - xvar2=1.0/p[89]; - xvar3=pow(q1,xvar2); - xvar3_q1=xvar3*xvar2/q1; - xvar3_Vbei=xvar3_q1*q1_Vbei; - xvar3_Vbci=xvar3_q1*q1_Vbci; - xvar1=(xvar3+4.0*q2); - xvar1_xvar3=1.0; - xvar1_q2=4.0; - xvar1_Vbei=xvar1_xvar3*xvar3_Vbei; - xvar1_Vbci=xvar1_xvar3*xvar3_Vbci; - xvar1_Vbei=xvar1_Vbei+xvar1_q2*q2_Vbei; - xvar1_Vbci=xvar1_Vbci+xvar1_q2*q2_Vbci; - xvar4=pow(xvar1,p[89]); - xvar4_xvar1=xvar4*p[89]/xvar1; - xvar4_Vbei=xvar4_xvar1*xvar1_Vbei; - xvar4_Vbci=xvar4_xvar1*xvar1_Vbci; - qb=0.5*(q1+xvar4); - qb_q1=0.5; - qb_xvar4=0.5; - qb_Vbei=qb_q1*q1_Vbei; - qb_Vbci=qb_q1*q1_Vbci; - qb_Vbei=qb_Vbei+qb_xvar4*xvar4_Vbei; - qb_Vbci=qb_Vbci+qb_xvar4*xvar4_Vbci; - }else{ - xvar1=(1.0+4.0*q2); - xvar1_q2=4.0; - xvar1_Vbei=xvar1_q2*q2_Vbei; - xvar1_Vbci=xvar1_q2*q2_Vbci; - xvar2=pow(xvar1,p[89]); - xvar2_xvar1=xvar2*p[89]/xvar1; - xvar2_Vbei=xvar2_xvar1*xvar1_Vbei; - xvar2_Vbci=xvar2_xvar1*xvar1_Vbci; - qb=0.5*q1*(1.0+xvar2); - qb_q1=0.5*(xvar2+1.0); - qb_xvar2=0.5*q1; - qb_Vbei=qb_q1*q1_Vbei; - qb_Vbci=qb_q1*q1_Vbci; - qb_Vbei=qb_Vbei+qb_xvar2*xvar2_Vbei; - qb_Vbci=qb_Vbci+qb_xvar2*xvar2_Vbci; - } - (*Itzr)=Iri/qb; - Itzr_Iri=1.0/qb; - Itzr_qb=-Iri/(qb*qb); - *Itzr_Vbci=Itzr_Iri*Iri_Vbci; - *Itzr_Vbei=Itzr_qb*qb_Vbei; - *Itzr_Vbci=(*Itzr_Vbci)+Itzr_qb*qb_Vbci; - (*Itzf)=Ifi/qb; - Itzf_Ifi=1.0/qb; - Itzf_qb=-Ifi/(qb*qb); - *Itzf_Vbei=Itzf_Ifi*Ifi_Vbei; - *Itzf_Vbei=(*Itzf_Vbei)+Itzf_qb*qb_Vbei; - *Itzf_Vbci=Itzf_qb*qb_Vbci; - if(p[42]>0.0){ - argi=(*Vbep)/(p[44]*Vtv); - argi_Vbep=1.0/(p[44]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbep=expi_argi*argi_Vbep; - argx=(*Vbci)/(p[44]*Vtv); - argx_Vbci=1.0/(p[44]*Vtv); - expx=exp(argx); - expx_argx=expx; - expx_Vbci=expx_argx*argx_Vbci; - Ifp=p[42]*(p[43]*expi+(1.0-p[43])*expx-1.0); - Ifp_expi=p[42]*p[43]; - Ifp_expx=p[42]*(1.0-p[43]); - Ifp_Vbep=Ifp_expi*expi_Vbep; - Ifp_Vbci=Ifp_expx*expx_Vbci; - q2p=Ifp*IIKP; - q2p_Ifp=IIKP; - q2p_Vbep=q2p_Ifp*Ifp_Vbep; - q2p_Vbci=q2p_Ifp*Ifp_Vbci; - qbp=0.5*(1.0+sqrt(1.0+4.0*q2p)); - qbp_q2p=1.0/sqrt(4.0*q2p+1.0); - qbp_Vbep=qbp_q2p*q2p_Vbep; - qbp_Vbci=qbp_q2p*q2p_Vbci; - argi=(*Vbcp)/(p[44]*Vtv); - argi_Vbcp=1.0/(p[44]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbcp=expi_argi*argi_Vbcp; - Irp=p[42]*(expi-1.0); - Irp_expi=p[42]; - Irp_Vbcp=Irp_expi*expi_Vbcp; - (*Iccp)=(Ifp-Irp)/qbp; - Iccp_Ifp=1.0/qbp; - Iccp_Irp=-1.0/qbp; - Iccp_qbp=-(Ifp-Irp)/(qbp*qbp); - *Iccp_Vbep=Iccp_Ifp*Ifp_Vbep; - *Iccp_Vbci=Iccp_Ifp*Ifp_Vbci; - *Iccp_Vbcp=Iccp_Irp*Irp_Vbcp; - *Iccp_Vbep=(*Iccp_Vbep)+Iccp_qbp*qbp_Vbep; - *Iccp_Vbci=(*Iccp_Vbci)+Iccp_qbp*qbp_Vbci; - }else{ - Ifp=0.0; - Ifp_Vbep=0.0; - Ifp_Vbci=0.0; - qbp=1.0; - qbp_Vbep=0.0; - qbp_Vbci=0.0; - (*Iccp)=0.0; - *Iccp_Vbep=0.0; - *Iccp_Vbci=0.0; - *Iccp_Vbcp=0.0; - } - if(p[32]==1.0){ - argi=(*Vbei)/(p[33]*Vtv); - argi_Vbei=1.0/(p[33]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbei=expi_argi*argi_Vbei; - argn=(*Vbei)/(p[35]*Vtv); - argn_Vbei=1.0/(p[35]*Vtv); - expn=exp(argn); - expn_argn=expn; - expn_Vbei=expn_argn*argn_Vbei; - if(p[98]>0.0){ - argx=(-p[98]-(*Vbei))/(p[99]*Vtv); - argx_Vbei=-1.0/(p[99]*Vtv); - expx=exp(argx); - expx_argx=expx; - expx_Vbei=expx_argx*argx_Vbei; - (*Ibe)=p[31]*(expi-1.0)+p[34]*(expn-1.0)-p[100]*(expx-p[104]); - Ibe_expi=p[31]; - Ibe_expn=p[34]; - Ibe_expx=-p[100]; - *Ibe_Vbei=Ibe_expi*expi_Vbei; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expn*expn_Vbei; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expx*expx_Vbei; - }else{ - (*Ibe)=p[31]*(expi-1.0)+p[34]*(expn-1.0); - Ibe_expi=p[31]; - Ibe_expn=p[34]; - *Ibe_Vbei=Ibe_expi*expi_Vbei; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expn*expn_Vbei; - } - (*Ibex)=0.0; - *Ibex_Vbex=0.0; - }else if(p[32]==0.0){ - (*Ibe)=0.0; - *Ibe_Vbei=0.0; - argi=(*Vbex)/(p[33]*Vtv); - argi_Vbex=1.0/(p[33]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbex=expi_argi*argi_Vbex; - argn=(*Vbex)/(p[35]*Vtv); - argn_Vbex=1.0/(p[35]*Vtv); - expn=exp(argn); - expn_argn=expn; - expn_Vbex=expn_argn*argn_Vbex; - if(p[98]>0.0){ - argx=(-p[98]-(*Vbex))/(p[99]*Vtv); - argx_Vbex=-1.0/(p[99]*Vtv); - expx=exp(argx); - expx_argx=expx; - expx_Vbex=expx_argx*argx_Vbex; - (*Ibex)=p[31]*(expi-1.0)+p[34]*(expn-1.0)-p[100]*(expx-p[104]); - Ibex_expi=p[31]; - Ibex_expn=p[34]; - Ibex_expx=-p[100]; - *Ibex_Vbex=Ibex_expi*expi_Vbex; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expn*expn_Vbex; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expx*expx_Vbex; - }else{ - (*Ibex)=p[31]*(expi-1.0)+p[34]*(expn-1.0); - Ibex_expi=p[31]; - Ibex_expn=p[34]; - *Ibex_Vbex=Ibex_expi*expi_Vbex; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expn*expn_Vbex; - } - }else{ - argi=(*Vbei)/(p[33]*Vtv); - argi_Vbei=1.0/(p[33]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbei=expi_argi*argi_Vbei; - argn=(*Vbei)/(p[35]*Vtv); - argn_Vbei=1.0/(p[35]*Vtv); - expn=exp(argn); - expn_argn=expn; - expn_Vbei=expn_argn*argn_Vbei; - if(p[98]>0.0){ - argx=(-p[98]-(*Vbei))/(p[99]*Vtv); - argx_Vbei=-1.0/(p[99]*Vtv); - expx=exp(argx); - expx_argx=expx; - expx_Vbei=expx_argx*argx_Vbei; - (*Ibe)=p[32]*(p[31]*(expi-1.0)+p[34]*(expn-1.0)-p[100]*(expx-p[104])); - Ibe_expi=p[31]*p[32]; - Ibe_expn=p[34]*p[32]; - Ibe_expx=-p[100]*p[32]; - *Ibe_Vbei=Ibe_expi*expi_Vbei; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expn*expn_Vbei; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expx*expx_Vbei; - }else{ - (*Ibe)=p[32]*(p[31]*(expi-1.0)+p[34]*(expn-1.0)); - Ibe_expi=p[31]*p[32]; - Ibe_expn=p[34]*p[32]; - *Ibe_Vbei=Ibe_expi*expi_Vbei; - *Ibe_Vbei=(*Ibe_Vbei)+Ibe_expn*expn_Vbei; - } - argi=(*Vbex)/(p[33]*Vtv); - argi_Vbex=1.0/(p[33]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbex=expi_argi*argi_Vbex; - argn=(*Vbex)/(p[35]*Vtv); - argn_Vbex=1.0/(p[35]*Vtv); - expn=exp(argn); - expn_argn=expn; - expn_Vbex=expn_argn*argn_Vbex; - if(p[98]>0.0){ - argx=(-p[98]-(*Vbex))/(p[99]*Vtv); - argx_Vbex=-1.0/(p[99]*Vtv); - expx=exp(argx); - expx_argx=expx; - expx_Vbex=expx_argx*argx_Vbex; - (*Ibex)=(1.0-p[32])*(p[31]*(expi-1.0)+p[34]*(expn-1.0)-p[100]*(expx-p[104])); - Ibex_expi=p[31]*(1.0-p[32]); - Ibex_expn=p[34]*(1.0-p[32]); - Ibex_expx=-p[100]*(1.0-p[32]); - *Ibex_Vbex=Ibex_expi*expi_Vbex; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expn*expn_Vbex; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expx*expx_Vbex; - }else{ - (*Ibex)=(1.0-p[32])*(p[31]*(expi-1.0)+p[34]*(expn-1.0)); - Ibex_expi=p[31]*(1.0-p[32]); - Ibex_expn=p[34]*(1.0-p[32]); - *Ibex_Vbex=Ibex_expi*expi_Vbex; - *Ibex_Vbex=(*Ibex_Vbex)+Ibex_expn*expn_Vbex; - } - } - argi=(*Vbci)/(p[37]*Vtv); - argi_Vbci=1.0/(p[37]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbci=expi_argi*argi_Vbci; - argn=(*Vbci)/(p[39]*Vtv); - argn_Vbci=1.0/(p[39]*Vtv); - expn=exp(argn); - expn_argn=expn; - expn_Vbci=expn_argn*argn_Vbci; - Ibcj=p[36]*(expi-1.0)+p[38]*(expn-1.0); - Ibcj_expi=p[36]; - Ibcj_expn=p[38]; - Ibcj_Vbci=Ibcj_expi*expi_Vbci; - Ibcj_Vbci=Ibcj_Vbci+Ibcj_expn*expn_Vbci; - if((p[45]>0.0)||(p[46]>0.0)){ - argi=(*Vbep)/(p[37]*Vtv); - argi_Vbep=1.0/(p[37]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbep=expi_argi*argi_Vbep; - argn=(*Vbep)/(p[39]*Vtv); - argn_Vbep=1.0/(p[39]*Vtv); - expn=exp(argn); - expn_argn=expn; - expn_Vbep=expn_argn*argn_Vbep; - (*Ibep)=p[45]*(expi-1.0)+p[46]*(expn-1.0); - Ibep_expi=p[45]; - Ibep_expn=p[46]; - *Ibep_Vbep=Ibep_expi*expi_Vbep; - *Ibep_Vbep=(*Ibep_Vbep)+Ibep_expn*expn_Vbep; - }else{ - (*Ibep)=0.0; - *Ibep_Vbep=0.0; - } - if(p[40]>0.0){ - vl=0.5*(sqrt((p[24]-(*Vbci))*(p[24]-(*Vbci))+0.01)+(p[24]-(*Vbci))); - vl_Vbci=0.5*(-(p[24]-(*Vbci))/sqrt(((p[24]-(*Vbci))*(p[24]-(*Vbci)))+0.01)-1.0); - xvar2=(p[25]-1.0); - xvar3=pow(vl,xvar2); - xvar3_vl=xvar3*xvar2/vl; - xvar3_Vbci=xvar3_vl*vl_Vbci; - xvar1=-p[41]*xvar3; - xvar1_xvar3=-p[41]; - xvar1_Vbci=xvar1_xvar3*xvar3_Vbci; - xvar4=exp(xvar1); - xvar4_xvar1=xvar4; - xvar4_Vbci=xvar4_xvar1*xvar1_Vbci; - avalf=p[40]*vl*xvar4; - avalf_vl=p[40]*xvar4; - avalf_xvar4=p[40]*vl; - avalf_Vbci=avalf_vl*vl_Vbci; - avalf_Vbci=avalf_Vbci+avalf_xvar4*xvar4_Vbci; - Igc=((*Itzf)-(*Itzr)-Ibcj)*avalf; - Igc_Itzf=avalf; - Igc_Itzr=-avalf; - Igc_Ibcj=-avalf; - Igc_avalf=-(*Itzr)+(*Itzf)-Ibcj; - Igc_Vbei=Igc_Itzf*(*Itzf_Vbei); - Igc_Vbci=Igc_Itzf*(*Itzf_Vbci); - Igc_Vbci=Igc_Vbci+Igc_Itzr*(*Itzr_Vbci); - Igc_Vbei=Igc_Vbei+Igc_Itzr*(*Itzr_Vbei); - Igc_Vbci=Igc_Vbci+Igc_Ibcj*Ibcj_Vbci; - Igc_Vbci=Igc_Vbci+Igc_avalf*avalf_Vbci; - }else{ - Igc=0.0; - Igc_Vbei=0.0; - Igc_Vbci=0.0; - } - (*Ibc)=Ibcj-Igc; - Ibc_Ibcj=1.0; - Ibc_Igc=-1.0; - *Ibc_Vbci=Ibc_Ibcj*Ibcj_Vbci; - *Ibc_Vbei=Ibc_Igc*Igc_Vbei; - *Ibc_Vbci=(*Ibc_Vbci)+Ibc_Igc*Igc_Vbci; - if(p[1]>0.0){ - (*Ircx)=(*Vrcx)/p[1]; - *Ircx_Vrcx=1.0/p[1]; - }else{ - (*Ircx)=0.0; - *Ircx_Vrcx=0.0; - } - argi=(*Vbci)/Vtv; - argi_Vbci=1.0/Vtv; - expi=exp(argi); - expi_argi=expi; - expi_Vbci=expi_argi*argi_Vbci; - argx=(*Vbcx)/Vtv; - argx_Vbcx=1.0/Vtv; - expx=exp(argx); - expx_argx=expx; - expx_Vbcx=expx_argx*argx_Vbcx; - Kbci=sqrt(1.0+p[4]*expi); - Kbci_expi=p[4]/(2.0*sqrt(expi*p[4]+1.0)); - Kbci_Vbci=Kbci_expi*expi_Vbci; - Kbcx=sqrt(1.0+p[4]*expx); - Kbcx_expx=p[4]/(2.0*sqrt(expx*p[4]+1.0)); - Kbcx_Vbcx=Kbcx_expx*expx_Vbcx; - if(p[2]>0.0){ - rKp1=(Kbci+1.0)/(Kbcx+1.0); - rKp1_Kbci=1.0/(Kbcx+1.0); - rKp1_Kbcx=-(Kbci+1.0)/((Kbcx+1.0)*(Kbcx+1.0)); - rKp1_Vbci=rKp1_Kbci*Kbci_Vbci; - rKp1_Vbcx=rKp1_Kbcx*Kbcx_Vbcx; - xvar1=log(rKp1); - xvar1_rKp1=1.0/rKp1; - xvar1_Vbci=xvar1_rKp1*rKp1_Vbci; - xvar1_Vbcx=xvar1_rKp1*rKp1_Vbcx; - Iohm=((*Vrci)+Vtv*(Kbci-Kbcx-xvar1))/p[2]; - Iohm_Vrci=1.0/p[2]; - Iohm_Kbci=Vtv/p[2]; - Iohm_Kbcx=-Vtv/p[2]; - Iohm_xvar1=-Vtv/p[2]; - Iohm_Vbci=Iohm_Kbci*Kbci_Vbci; - Iohm_Vbcx=Iohm_Kbcx*Kbcx_Vbcx; - Iohm_Vbci=Iohm_Vbci+Iohm_xvar1*xvar1_Vbci; - Iohm_Vbcx=Iohm_Vbcx+Iohm_xvar1*xvar1_Vbcx; - derf=IVO*p[2]*Iohm/(1.0+0.5*IVO*IHRCF*sqrt((*Vrci)*(*Vrci)+0.01)); - derf_Iohm=IVO*p[2]/(0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0); - derf_Vrci=-0.5*IHRCF*Iohm*(IVO*IVO)*p[2]*(*Vrci)/(sqrt(((*Vrci)*(*Vrci))+0.01)*((0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0)*(0.5*IHRCF*IVO*sqrt(((*Vrci)*(*Vrci))+0.01)+1.0))); - derf_Vrci=derf_Vrci+derf_Iohm*Iohm_Vrci; - derf_Vbci=derf_Iohm*Iohm_Vbci; - derf_Vbcx=derf_Iohm*Iohm_Vbcx; - (*Irci)=Iohm/sqrt(1.0+derf*derf); - Irci_Iohm=1.0/sqrt((derf*derf)+1.0); - Irci_derf=-derf*Iohm/pow(((derf*derf)+1.0),(3.0/2.0)); - *Irci_Vrci=Irci_Iohm*Iohm_Vrci; - *Irci_Vbci=Irci_Iohm*Iohm_Vbci; - *Irci_Vbcx=Irci_Iohm*Iohm_Vbcx; - *Irci_Vrci=(*Irci_Vrci)+Irci_derf*derf_Vrci; - *Irci_Vbci=(*Irci_Vbci)+Irci_derf*derf_Vbci; - *Irci_Vbcx=(*Irci_Vbcx)+Irci_derf*derf_Vbcx; - }else{ - (*Irci)=0.0; - *Irci_Vrci=0.0; - *Irci_Vbci=0.0; - *Irci_Vbcx=0.0; - } - if(p[6]>0.0){ - (*Irbx)=(*Vrbx)/p[6]; - *Irbx_Vrbx=1.0/p[6]; - }else{ - (*Irbx)=0.0; - *Irbx_Vrbx=0.0; - } - if(p[7]>0.0){ - (*Irbi)=(*Vrbi)*qb/p[7]; - *Irbi_Vrbi=qb/p[7]; - Irbi_qb=(*Vrbi)/p[7]; - *Irbi_Vbei=Irbi_qb*qb_Vbei; - *Irbi_Vbci=Irbi_qb*qb_Vbci; - }else{ - (*Irbi)=0.0; - *Irbi_Vrbi=0.0; - *Irbi_Vbei=0.0; - *Irbi_Vbci=0.0; - } - if(p[8]>0.0){ - (*Ire)=(*Vre)/p[8]; - *Ire_Vre=1.0/p[8]; - }else{ - (*Ire)=0.0; - *Ire_Vre=0.0; - } - if(p[10]>0.0){ - (*Irbp)=(*Vrbp)*qbp/p[10]; - *Irbp_Vrbp=qbp/p[10]; - Irbp_qbp=(*Vrbp)/p[10]; - *Irbp_Vbep=Irbp_qbp*qbp_Vbep; - *Irbp_Vbci=Irbp_qbp*qbp_Vbci; - }else{ - (*Irbp)=0.0; - *Irbp_Vrbp=0.0; - *Irbp_Vbep=0.0; - *Irbp_Vbci=0.0; - } - if((p[47]>0.0)||(p[49]>0.0)){ - argi=(*Vbcp)/(p[48]*Vtv); - argi_Vbcp=1.0/(p[48]*Vtv); - expi=exp(argi); - expi_argi=expi; - expi_Vbcp=expi_argi*argi_Vbcp; - argn=(*Vbcp)/(p[50]*Vtv); - argn_Vbcp=1.0/(p[50]*Vtv); - expn=exp(argn); - expn_argn=expn; - expn_Vbcp=expn_argn*argn_Vbcp; - (*Ibcp)=p[47]*(expi-1.0)+p[49]*(expn-1.0); - Ibcp_expi=p[47]; - Ibcp_expn=p[49]; - *Ibcp_Vbcp=Ibcp_expi*expi_Vbcp; - *Ibcp_Vbcp=(*Ibcp_Vbcp)+Ibcp_expn*expn_Vbcp; - }else{ - (*Ibcp)=0.0; - *Ibcp_Vbcp=0.0; - } - if(p[9]>0.0){ - (*Irs)=(*Vrs)/p[9]; - *Irs_Vrs=1.0/p[9]; - }else{ - (*Irs)=0.0; - *Irs_Vrs=0.0; - } - if(Ifi>0.0){ - sgIf=1.0; - }else{ - sgIf=0.0; - } - rIf=Ifi*sgIf*IITF; - rIf_Ifi=IITF*sgIf; - rIf_Vbei=rIf_Ifi*Ifi_Vbei; - mIf=rIf/(rIf+1.0); - mIf_rIf=1.0/(rIf+1.0)-rIf/((rIf+1.0)*(rIf+1.0)); - mIf_Vbei=mIf_rIf*rIf_Vbei; - xvar1=(*Vbci)*IVTF/1.44; - xvar1_Vbci=0.6944444*IVTF; - xvar2=exp(xvar1); - xvar2_xvar1=xvar2; - xvar2_Vbci=xvar2_xvar1*xvar1_Vbci; - *tff=p[56]*(1.0+p[57]*q1)*(1.0+p[58]*xvar2*(slTF+mIf*mIf)*sgIf); - tff_q1=p[57]*p[56]*(sgIf*(slTF+(mIf*mIf))*p[58]*xvar2+1.0); - tff_xvar2=(q1*p[57]+1.0)*sgIf*(slTF+(mIf*mIf))*p[56]*p[58]; - tff_mIf=2.0*mIf*(q1*p[57]+1.0)*sgIf*p[56]*p[58]*xvar2; - *tff_Vbei=tff_q1*q1_Vbei; - *tff_Vbci=tff_q1*q1_Vbci; - *tff_Vbci=*tff_Vbci+tff_xvar2*xvar2_Vbci; - *tff_Vbei=*tff_Vbei+tff_mIf*mIf_Vbei; - (*Qbe)=p[16]*qdbe*p[32]+*tff*Ifi/qb; - Qbe_qdbe=p[16]*p[32]; - Qbe_tff=Ifi/qb; - Qbe_Ifi=*tff/qb; - Qbe_qb=-Ifi* *tff/(qb*qb); - *Qbe_Vbei=Qbe_qdbe*qdbe_Vbei; - *Qbe_Vbei=(*Qbe_Vbei)+Qbe_tff* *tff_Vbei; - *Qbe_Vbci=Qbe_tff* *tff_Vbci; - *Qbe_Vbei=(*Qbe_Vbei)+Qbe_Ifi*Ifi_Vbei; - *Qbe_Vbei=(*Qbe_Vbei)+Qbe_qb*qb_Vbei; - *Qbe_Vbci=(*Qbe_Vbci)+Qbe_qb*qb_Vbci; - (*Qbex)=p[16]*qdbex*(1.0-p[32]); - Qbex_qdbex=p[16]*(1.0-p[32]); - *Qbex_Vbex=Qbex_qdbex*qdbex_Vbex; - (*Qbc)=p[21]*qdbc+p[61]*Iri+p[22]*Kbci; - Qbc_qdbc=p[21]; - Qbc_Iri=p[61]; - Qbc_Kbci=p[22]; - *Qbc_Vbci=Qbc_qdbc*qdbc_Vbci; - *Qbc_Vbci=(*Qbc_Vbci)+Qbc_Iri*Iri_Vbci; - *Qbc_Vbci=(*Qbc_Vbci)+Qbc_Kbci*Kbci_Vbci; - (*Qbcx)=p[22]*Kbcx; - Qbcx_Kbcx=p[22]; - *Qbcx_Vbcx=Qbcx_Kbcx*Kbcx_Vbcx; - (*Qbep)=p[23]*qdbep+p[61]*Ifp; - Qbep_qdbep=p[23]; - Qbep_Ifp=p[61]; - *Qbep_Vbep=Qbep_qdbep*qdbep_Vbep; - *Qbep_Vbep=(*Qbep_Vbep)+Qbep_Ifp*Ifp_Vbep; - *Qbep_Vbci=Qbep_Ifp*Ifp_Vbci; - (*Qbcp)=p[27]*qdbcp+p[87]*(*Vbcp); - Qbcp_qdbcp=p[27]; - *Qbcp_Vbcp=p[87]; - *Qbcp_Vbcp=(*Qbcp_Vbcp)+Qbcp_qdbcp*qdbcp_Vbcp; - (*Qbeo)=(*Vbe)*p[15]; - *Qbeo_Vbe=p[15]; - (*Qbco)=(*Vbc)*p[20]; - *Qbco_Vbc=p[20]; - -/* Scale outputs */ - - if((*SCALE)!=1.0){ - *Ibe=(*SCALE)*(*Ibe); - *Ibe_Vbei=(*SCALE)*(*Ibe_Vbei); - *Ibex=(*SCALE)*(*Ibex); - *Ibex_Vbex=(*SCALE)*(*Ibex_Vbex); - *Itzf=(*SCALE)*(*Itzf); - *Itzf_Vbei=(*SCALE)*(*Itzf_Vbei); - *Itzf_Vbci=(*SCALE)*(*Itzf_Vbci); - *Itzr=(*SCALE)*(*Itzr); - *Itzr_Vbci=(*SCALE)*(*Itzr_Vbci); - *Itzr_Vbei=(*SCALE)*(*Itzr_Vbei); - *Ibc=(*SCALE)*(*Ibc); - *Ibc_Vbci=(*SCALE)*(*Ibc_Vbci); - *Ibc_Vbei=(*SCALE)*(*Ibc_Vbei); - *Ibep=(*SCALE)*(*Ibep); - *Ibep_Vbep=(*SCALE)*(*Ibep_Vbep); - *Ircx=(*SCALE)*(*Ircx); - *Ircx_Vrcx=(*SCALE)*(*Ircx_Vrcx); - *Irci=(*SCALE)*(*Irci); - *Irci_Vrci=(*SCALE)*(*Irci_Vrci); - *Irci_Vbci=(*SCALE)*(*Irci_Vbci); - *Irci_Vbcx=(*SCALE)*(*Irci_Vbcx); - *Irbx=(*SCALE)*(*Irbx); - *Irbx_Vrbx=(*SCALE)*(*Irbx_Vrbx); - *Irbi=(*SCALE)*(*Irbi); - *Irbi_Vrbi=(*SCALE)*(*Irbi_Vrbi); - *Irbi_Vbei=(*SCALE)*(*Irbi_Vbei); - *Irbi_Vbci=(*SCALE)*(*Irbi_Vbci); - *Ire=(*SCALE)*(*Ire); - *Ire_Vre=(*SCALE)*(*Ire_Vre); - *Irbp=(*SCALE)*(*Irbp); - *Irbp_Vrbp=(*SCALE)*(*Irbp_Vrbp); - *Irbp_Vbep=(*SCALE)*(*Irbp_Vbep); - *Irbp_Vbci=(*SCALE)*(*Irbp_Vbci); - *Qbe=(*SCALE)*(*Qbe); - *Qbe_Vbei=(*SCALE)*(*Qbe_Vbei); - *Qbe_Vbci=(*SCALE)*(*Qbe_Vbci); - *Qbex=(*SCALE)*(*Qbex); - *Qbex_Vbex=(*SCALE)*(*Qbex_Vbex); - *Qbc=(*SCALE)*(*Qbc); - *Qbc_Vbci=(*SCALE)*(*Qbc_Vbci); - *Qbcx=(*SCALE)*(*Qbcx); - *Qbcx_Vbcx=(*SCALE)*(*Qbcx_Vbcx); - *Qbep=(*SCALE)*(*Qbep); - *Qbep_Vbep=(*SCALE)*(*Qbep_Vbep); - *Qbep_Vbci=(*SCALE)*(*Qbep_Vbci); - *Qbeo=(*SCALE)*(*Qbeo); - *Qbeo_Vbe=(*SCALE)*(*Qbeo_Vbe); - *Qbco=(*SCALE)*(*Qbco); - *Qbco_Vbc=(*SCALE)*(*Qbco_Vbc); - *Ibcp=(*SCALE)*(*Ibcp); - *Ibcp_Vbcp=(*SCALE)*(*Ibcp_Vbcp); - *Iccp=(*SCALE)*(*Iccp); - *Iccp_Vbep=(*SCALE)*(*Iccp_Vbep); - *Iccp_Vbci=(*SCALE)*(*Iccp_Vbci); - *Iccp_Vbcp=(*SCALE)*(*Iccp_Vbcp); - *Irs=(*SCALE)*(*Irs); - *Irs_Vrs=(*SCALE)*(*Irs_Vrs); - *Qbcp=(*SCALE)*(*Qbcp); - *Qbcp_Vbcp=(*SCALE)*(*Qbcp_Vbcp); - } - return(0); -} int vbic_4T_et_cf_fj(double *p ,double *Vrth, double *Vbei, double *Vbex, double *Vbci, double *Vbep, double *Vbcp ,double *Vrcx, double *Vbcx, double *Vrci, double *Vrbx, double *Vrbi, double *Vre, double *Vrbp @@ -2736,8 +1524,7 @@ int vbic_4T_et_cf_fj(double *p ,double *Iccp_Vbci, double *Iccp_Vbcp, double *Irs, double *Irs_Vrs, double *Irs_Vrth, double *Qbcp, double *Qbcp_Vrth ,double *Qbcp_Vbcp, double *Irth, double *Irth_Vrth, double *Ith, double *Ith_Vrth, double *Ith_Vbei, double *Ith_Vbci ,double *Ith_Vcei, double *Ith_Vbex, double *Ith_Vbep, double *Ith_Vrs, double *Ith_Vbcp, double *Ith_Vcep, double *Ith_Vrcx - ,double *Ith_Vrci, double *Ith_Vbcx, double *Ith_Vrbx, double *Ith_Vrbi, double *Ith_Vre, double *Ith_Vrbp, double *Qcth - ,double *Qcth_Vrth + ,double *Ith_Vrci, double *Ith_Vbcx, double *Ith_Vrbx, double *Ith_Vrbi, double *Ith_Vre, double *Ith_Vrbp, double *Qcth, double *Qcth_Vrth ,double *tff, double *tff_Vbei, double *tff_Vbci, double *tff_Vrth ,double *SCALE) { diff --git a/src/spicelib/devices/vbic/vbicpzld.c b/src/spicelib/devices/vbic/vbicpzld.c index dd930ac2f..aae665655 100644 --- a/src/spicelib/devices/vbic/vbicpzld.c +++ b/src/spicelib/devices/vbic/vbicpzld.c @@ -59,13 +59,14 @@ VBICpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) for( ; model != NULL; model = VBICnextModel(model)) { /* loop through all the instances of the model */ - for( here = VBICinstances(model); here!= NULL; + for( here = VBICinstances(model); here!= NULL; here = VBICnextInstance(here)) { Ibe_Vbei = *(ckt->CKTstate0 + here->VBICibe_Vbei); Ibex_Vbex = *(ckt->CKTstate0 + here->VBICibex_Vbex); Iciei_Vbei = *(ckt->CKTstate0 + here->VBICiciei_Vbei); Iciei_Vbci = *(ckt->CKTstate0 + here->VBICiciei_Vbci); + Iciei_Vrth = *(ckt->CKTstate0 + here->VBICiciei_Vrth); Iciei_Vxf2 = *(ckt->CKTstate0 + here->VBICiciei_Vxf2); Ibc_Vbci = *(ckt->CKTstate0 + here->VBICibc_Vbci); Ibc_Vbei = *(ckt->CKTstate0 + here->VBICibc_Vbei); @@ -128,7 +129,7 @@ c Stamp element: Iciei *(here->VBICemitEIEmitEIPtr) += Iciei_Vbei; *(here->VBICemitEIBaseBIPtr) += -Iciei_Vbci; *(here->VBICemitEICollCIPtr) += Iciei_Vbci; - if (here->VBIC_excessPhase) { + if (here->VBIC_excessPhase) { *(here->VBICcollCIXf2Ptr) += Iciei_Vxf2; *(here->VBICemitEIXf2Ptr) += -Iciei_Vxf2; } @@ -250,7 +251,6 @@ c Stamp element: Rs Ibe_Vrth = here->VBICibe_Vrth; Ibex_Vrth = here->VBICibex_Vrth; - Iciei_Vrth = here->VBICiciei_Vrth; Ibc_Vrth = here->VBICibc_Vrth; Ibep_Vrth = here->VBICibep_Vrth; Ircx_Vrth = here->VBICircx_Vrth; @@ -294,7 +294,7 @@ c Stamp element: Ibex c Stamp element: Iciei */ *(here->VBICcollCItempPtr) += Iciei_Vrth; - *(here->VBICemitEItempPtr) += -Iciei_Vrth; + *(here->VBICemitEItempPtr) += -Iciei_Vrth; /* c Stamp element: Ibc */ @@ -573,10 +573,10 @@ c Stamp element: Qbco *(here->VBICsubsSItempPtr + 1) += XQbcp_Vrth * (s->imag); *(here->VBICbaseBPtempPtr ) += -XQbcp_Vrth * (s->real); *(here->VBICbaseBPtempPtr + 1) += -XQbcp_Vrth * (s->imag); - if (here->VBIC_excessPhase) { -// Stamp element: Ixf1 f_xf1 = + + if (here->VBIC_excessPhase) { +// Stamp element: Ixf1 f_xf1 = + *(here->VBICxf1TempPtr) += Ixf1_Vrth; -// Stamp element: Ixf2 f_xf2 = + +// Stamp element: Ixf2 f_xf2 = + *(here->VBICxf2TempPtr) += Ixf2_Vrth; } }