Merge branch 'markus_dev' of ssh://git.code.sf.net/p/ngspice/ngspice into markus_dev

This commit is contained in:
dwarning 2020-06-01 10:57:42 +02:00
commit dcf4a44871
1 changed files with 211 additions and 187 deletions

View File

@ -2354,48 +2354,49 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
if(model->HICUMflsh == 0 || model->HICUMrth < MIN_R) { if(model->HICUMflsh == 0 || model->HICUMrth < MIN_R) {
Ith = 0.0; Ith = 0.0;
} else { } else {
Irth_dT = -Vrth*here->HICUMrth_t.dpart/(here->HICUMrth_t.rpart*here->HICUMrth_t.rpart);
Ith = -Vrth/here->HICUMrth_t.rpart+pterm; //Current from gnd to T Ith = -Vrth/here->HICUMrth_t.rpart+pterm; //Current from gnd to T
Ith_dT = (here->HICUMrth_t.rpart - Vrth*here->HICUMrth_t.dpart)/(here->HICUMrth_t.rpart*here->HICUMrth_t.rpart)-pterm_dT; // TODO Ith derivative for temp
if (model->HICUMflsh == 1 && model->HICUMrth >= MIN_R) {
//Branch Iciei
//Iciei(Vbiei,Vbici)*Vciei
Ith_Vciei += Iciei;
Ith_Vbiei += Iciei_Vbiei*Vciei;
Ith_Vbici += Iciei_Vbici*Vciei;
Ith_Vbici += -iavl_Vbici*Vbici;//(here->HICUMvdci_t.rpart-Vbici)*iavl
} else if (model->HICUMflsh == 2 && model->HICUMrth >= MIN_R) {
//Branch Iciei
//Iciei(Vbiei,Vbici)*Vciei
Ith_Vciei += Iciei;
Ith_Vbiei += Iciei_Vbiei*Vciei;
Ith_Vbici += Iciei_Vbici*Vciei;
//Branch biei Ith_dT = pterm_dT;
Ith_dT += -1/here->HICUMrth_t.rpart;
Ith_dT += +Vrth/here->HICUMrth_t.rpart/here->HICUMrth_t.rpart * here->HICUMrth_t.dpart; //Mario check this please
if (model->HICUMflsh == 1 && model->HICUMrth >= MIN_R) {
//Iciei(Vbiei,Vbici)*Vciei
Ith_Vciei += Iciei;
Ith_Vbiei += Iciei_Vbiei*Vciei;
Ith_Vbici += Iciei_Vbici*Vciei;
//avalanche current
//(here->HICUMvdci_t.rpart-Vbici)*iavl
Ith_Vbici += (here->HICUMvdci_t.rpart-Vbici)*iavl_Vbici - iavl
} else if (model->HICUMflsh == 2 && model->HICUMrth >= MIN_R) {
//Iciei(Vbiei,Vbici)*Vciei
Ith_Vciei += Iciei;
Ith_Vbiei += Iciei_Vbiei*Vciei;
Ith_Vbici += Iciei_Vbici*Vciei;
//Vbiei*Ibiei(Vbiei)
Ith_Vbiei += Ibiei + Ibiei_Vbiei*Vbiei; Ith_Vbiei += Ibiei + Ibiei_Vbiei*Vbiei;
//Branch bici //Vbici*Ibici(Vbici)
Ith_Vbici += Ibici+Ibici_Vbici+Vbici; Ith_Vbici += Ibici + Ibici_Vbici+Vbici;
//Branch bpei //Vbpei*Ibpei(Vbpei)
Ith_Vbpei += Ibpei + Ibpei_Vbpei*Vbpei; Ith_Vbpei += Ibpei + Ibpei_Vbpei*Vbpei;
//Branch bpci //Vpbci*Ibpci(Vbpci)
Ith_Vbpci += Ibpci + Ibpci_Vbpci*Vbpci; Ith_Vbpci += Ibpci + Ibpci_Vbpci*Vbpci;
//Branch sici //Vsici*Isici(Vsici)
Ith_Vsici += Isici + Isici_Vsici*Vsici; Ith_Vsici += Isici + Isici_Vsici*Vsici;
if (rbi >= MIN_R) { if (rbi >= MIN_R) {
//Branch bpbi //Vbpbi*Ibpbi(Vbpbi,Vbiei,Vbici)
Ith_Vbpbi += Ibpbi + Ibpbi_Vbpbi; Ith_Vbpbi += Ibpbi + Ibpbi_Vbpbi;
Ith_Vbiei += Ibpbi_Vbiei*Vbiei; Ith_Vbiei += Ibpbi_Vbiei*Vbpbi;
Ith_Vbici += Ibpbi_Vbici*Vbiei; Ith_Vbici += Ibpbi_Vbici*Vbpbi;
} }
if (here->HICUMre_t.rpart >= MIN_R) { if (here->HICUMre_t.rpart >= MIN_R) {
Ith_Veie = Veie*Veie/here->HICUMre_t.rpart + 2*Veie/here->HICUMre_t.rpart; //Veie*Ieie(Veiei) = Veie**2 /re_t
Ith_Veie = 2*Veie/here->HICUMre_t.rpart;
} }
if (here->HICUMrcx_t.rpart >= MIN_R) { if (here->HICUMrcx_t.rpart >= MIN_R) {
Ith_Vcic = Vcic*Vcic/here->HICUMrcx_t.rpart + 2*Vcic/here->HICUMrcx_t.rpart; Ith_Vcic = 2*Vcic/here->HICUMrcx_t.rpart;
} }
if (here->HICUMrbx_t.rpart >= MIN_R) { if (here->HICUMrbx_t.rpart >= MIN_R) {
Ith_Vbbp = Vbbp*Vbbp/here->HICUMrbx_t.rpart + 2*Vbbp/here->HICUMrbx_t.rpart; Ith_Vbbp = 2*Vbbp/here->HICUMrbx_t.rpart;
} }
} }
} }
@ -2747,8 +2748,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
} }
} }
// Write DC Currents and their derivatives on the correct variables of the HiCUM equivalent circuit // Write to state vector
*(ckt->CKTstate0 + here->HICUMvbiei) = Vbiei; *(ckt->CKTstate0 + here->HICUMvbiei) = Vbiei;
*(ckt->CKTstate0 + here->HICUMvbici) = Vbici; *(ckt->CKTstate0 + here->HICUMvbici) = Vbici;
*(ckt->CKTstate0 + here->HICUMvbpei) = Vbpei; *(ckt->CKTstate0 + here->HICUMvbpei) = Vbpei;
@ -2800,218 +2800,230 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0 + here->HICUMgqsu) = gqsu; *(ckt->CKTstate0 + here->HICUMgqsu) = gqsu;
load: load:
/* // #############################################################
* load current excitation vector and matrix // ############### STAMPS NO SH ##############################
*/ // #############################################################
// Markus: As far as I understand this: Derivative of Kirchhoff Current law for every node
/* // Branch: be, Stamp element: Cbepar1
c Branch: be, Stamp element: Cbepar1
*/
rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbepar1) - Vbe * gqbepar1); rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbepar1) - Vbe * gqbepar1);
*(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMemitNode) += rhs_current;
// with respect to Vbe
*(here->HICUMbaseBasePtr) += gqbepar1; *(here->HICUMbaseBasePtr) += gqbepar1;
*(here->HICUMemitEmitPtr) += gqbepar1; *(here->HICUMemitEmitPtr) += gqbepar1;
*(ckt->CKTrhs + here->HICUMemitNode) += rhs_current;
*(here->HICUMbaseEmitPtr) += -gqbepar1; *(here->HICUMbaseEmitPtr) += -gqbepar1;
*(here->HICUMemitBasePtr) += -gqbepar1; *(here->HICUMemitBasePtr) += -gqbepar1;
/* // finish
c Branch: bpe, Stamp element: Cbepar2
*/ // Branch: bpe, Stamp element: Cbepar2
rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbepar2) - Vbpe * gqbepar2); rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbepar2) - Vbpe * gqbepar2);
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(here->HICUMbaseBPBaseBPPtr) += gqbepar2;
*(here->HICUMbaseBPEmitPtr) += gqbepar2;
*(ckt->CKTrhs + here->HICUMemitNode) += rhs_current; *(ckt->CKTrhs + here->HICUMemitNode) += rhs_current;
// with respect to Vbpe
*(here->HICUMbaseBPBaseBPPtr) += gqbepar2;
*(here->HICUMemitEmitPtr) += gqbepar2;
*(here->HICUMbaseBPEmitPtr) += -gqbepar2;
*(here->HICUMemitBaseBPPtr) += -gqbepar2; *(here->HICUMemitBaseBPPtr) += -gqbepar2;
*(here->HICUMemitEmitPtr) += -gqbepar2; // finish
/*
c Branch: bci, Stamp element: Cbcpar1 // Branch: bci, Stamp element: Cbcpar1
*/
rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbcpar1) - Vbci * gqbcpar1); rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbcpar1) - Vbci * gqbcpar1);
*(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
// with respect to Vbci
*(here->HICUMbaseBasePtr) += gqbcpar1; *(here->HICUMbaseBasePtr) += gqbcpar1;
*(here->HICUMcollCICollCIPtr) += gqbcpar1; *(here->HICUMcollCICollCIPtr) += gqbcpar1;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
*(here->HICUMbaseCollCIPtr) += -gqbcpar1; *(here->HICUMbaseCollCIPtr) += -gqbcpar1;
*(here->HICUMcollCIBasePtr) += -gqbcpar1; *(here->HICUMcollCIBasePtr) += -gqbcpar1;
/* // finish
c Branch: bpci, Stamp element: Cbcpar2
*/ // Branch: bpci, Stamp element: Cbcpar2
rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbcpar2) - Vbpci * gqbcpar2); rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqbcpar2) - Vbpci * gqbcpar2);
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
*(ckt->CKTrhs + here->HICUMsubsSINode) += rhs_current;
// with respect to Vbpci
*(here->HICUMbaseBPBaseBPPtr) += gqbcpar2; *(here->HICUMbaseBPBaseBPPtr) += gqbcpar2;
*(here->HICUMcollCICollCIPtr) += gqbcpar2; *(here->HICUMcollCICollCIPtr) += gqbcpar2;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
*(here->HICUMbaseBPCollCIPtr) += -gqbcpar2; *(here->HICUMbaseBPCollCIPtr) += -gqbcpar2;
*(here->HICUMcollCIBaseBPPtr) += -gqbcpar2; *(here->HICUMcollCIBaseBPPtr) += -gqbcpar2;
/* // finish
c Branch: ssi, Stamp element: Csu
*/ // Branch: ssi, Stamp element: Csu //Markus: I think rhs sign is wrong here
rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqsu) - Vsis * gqsu); rhs_current = model->HICUMtype * (*(ckt->CKTstate0 + here->HICUMcqsu) - Vsis * gqsu);
*(ckt->CKTrhs + here->HICUMsubsNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMsubsNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMsubsSINode) += rhs_current;
// with respect to Vsis
*(here->HICUMsubsSubsPtr) += gqsu; *(here->HICUMsubsSubsPtr) += gqsu;
*(here->HICUMsubsSISubsSIPtr) += gqsu; *(here->HICUMsubsSISubsSIPtr) += gqsu;
*(ckt->CKTrhs + here->HICUMsubsSINode) += rhs_current;
*(here->HICUMsubsSubsSIPtr) += -gqsu; *(here->HICUMsubsSubsSIPtr) += -gqsu;
*(here->HICUMsubsSISubsPtr) += -gqsu; *(here->HICUMsubsSISubsPtr) += -gqsu;
/* // finish
c Branch: biei, Stamp element: Ibiei = Ibei + Irei ( was Ijbei )
*/ // Branch: biei, Stamp element: Ibiei = Ibei + Irei ( was Ijbei )
rhs_current = model->HICUMtype * (Ibiei - Ibiei_Vbiei*Vbiei); rhs_current = model->HICUMtype * (Ibiei - Ibiei_Vbiei*Vbiei);
*(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
// with respect to Vbiei
*(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbiei; *(here->HICUMbaseBIBaseBIPtr) += Ibiei_Vbiei;
*(here->HICUMemitEIEmitEIPtr) += Ibiei_Vbiei; *(here->HICUMemitEIEmitEIPtr) += Ibiei_Vbiei;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
*(here->HICUMbaseBIEmitEIPtr) += -Ibiei_Vbiei; *(here->HICUMbaseBIEmitEIPtr) += -Ibiei_Vbiei;
*(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbiei; *(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbiei;
// finish
/* // Branch: bpei, Stamp element: Ibpei = Ibep + Irep ( was Ijbep )
c Branch: bpei, Stamp element: Ibpei = Ibep + Irep ( was Ijbep )
*/
rhs_current = model->HICUMtype * (Ibpei - Ibpei_Vbpei*Vbpei); rhs_current = model->HICUMtype * (Ibpei - Ibpei_Vbpei*Vbpei);
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
// with respect to Vbpei
*(here->HICUMbaseBPBaseBPPtr) += Ibpei_Vbpei; *(here->HICUMbaseBPBaseBPPtr) += Ibpei_Vbpei;
*(here->HICUMemitEIEmitEIPtr) += Ibpei_Vbpei; *(here->HICUMemitEIEmitEIPtr) += Ibpei_Vbpei;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpei_Vbpei; *(here->HICUMbaseBPEmitEIPtr) += -Ibpei_Vbpei;
*(here->HICUMemitEIBaseBPPtr) += -Ibpei_Vbpei; *(here->HICUMemitEIBaseBPPtr) += -Ibpei_Vbpei;
// finish
/* // Branch: bici, Stamp element: Ibici ( was Ijbci )
c Branch: bici, Stamp element: Ibici ( was Ijbci )
*/
rhs_current = model->HICUMtype * (Ibici - Ibici_Vbici*Vbici); rhs_current = model->HICUMtype * (Ibici - Ibici_Vbici*Vbici);
*(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
// with respect to Vbici
*(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbici; *(here->HICUMbaseBIBaseBIPtr) += Ibici_Vbici;
*(here->HICUMcollCICollCIPtr) += Ibici_Vbici; *(here->HICUMcollCICollCIPtr) += Ibici_Vbici;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
*(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbici; *(here->HICUMcollCIBaseBIPtr) += -Ibici_Vbici;
*(here->HICUMbaseBICollCIPtr) += -Ibici_Vbici; *(here->HICUMbaseBICollCIPtr) += -Ibici_Vbici;
/* // finish
c Branch: ciei, Stamp element: It
*/ // 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);
*(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
// with respect to Vbiei f_CI = + f_EI = -
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbiei; *(here->HICUMcollCIBaseBIPtr) += Iciei_Vbiei;
*(here->HICUMemitEIEmitEIPtr) += Iciei_Vbiei; *(here->HICUMemitEIEmitEIPtr) += Iciei_Vbiei;
*(here->HICUMcollCIEmitEIPtr) += -Iciei_Vbiei; *(here->HICUMcollCIEmitEIPtr) += -Iciei_Vbiei;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbiei; *(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbiei;
// with respect to Vbici
*(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici; *(here->HICUMcollCIBaseBIPtr) += Iciei_Vbici;
*(here->HICUMemitEICollCIPtr) += Iciei_Vbici; *(here->HICUMemitEICollCIPtr) += Iciei_Vbici;
*(here->HICUMcollCICollCIPtr) += -Iciei_Vbici; *(here->HICUMcollCICollCIPtr) += -Iciei_Vbici;
*(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici; *(here->HICUMemitEIBaseBIPtr) += -Iciei_Vbici;
/* // finish
c Branch: bci, Stamp element: Qbcx
*/ // Branch: bci, Stamp element: Qbcx
// rhs_current = model->HICUMtype * (Ibci - Ibci_Vbci*Vbci); // rhs_current = model->HICUMtype * (Ibci - Ibci_Vbci*Vbci);
// *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; // *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current;
// *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; // *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
// with respect to Vbci
// *(here->HICUMbaseBasePtr) += Ibci_Vbci; // *(here->HICUMbaseBasePtr) += Ibci_Vbci;
// *(here->HICUMcollCICollCIPtr) += Ibci_Vbci; // *(here->HICUMcollCICollCIPtr) += Ibci_Vbci;
// *(here->HICUMbaseCollCIPtr) += -Ibci_Vbci; // *(here->HICUMbaseCollCIPtr) += -Ibci_Vbci;
// *(here->HICUMcollCIBasePtr) += -Ibci_Vbci; // *(here->HICUMcollCIBasePtr) += -Ibci_Vbci;
/* // finish
c Branch: bpci, Stamp element: Ibpci ( was Ijbcx )
*/ // Branch: bpci, Stamp element: Ibpci ( was Ijbcx )
rhs_current = model->HICUMtype * (Ibpci - Ibpci_Vbpci*Vbpci); rhs_current = model->HICUMtype * (Ibpci - Ibpci_Vbpci*Vbpci);
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
// with respect to Vbpci
*(here->HICUMbaseBPBaseBPPtr) += Ibpci_Vbpci; *(here->HICUMbaseBPBaseBPPtr) += Ibpci_Vbpci;
*(here->HICUMcollCICollCIPtr) += Ibpci_Vbpci; *(here->HICUMcollCICollCIPtr) += Ibpci_Vbpci;
*(here->HICUMbaseBPCollCIPtr) += -Ibpci_Vbpci; *(here->HICUMbaseBPCollCIPtr) += -Ibpci_Vbpci;
*(here->HICUMcollCIBaseBPPtr) += -Ibpci_Vbpci; *(here->HICUMcollCIBaseBPPtr) += -Ibpci_Vbpci;
/* // finish
c Branch: cic, Stamp element: Rcx
*/ // Branch: cic, Stamp element: Rcx
// with respect to Vcic
*(here->HICUMcollCollPtr) += Icic_Vcic; *(here->HICUMcollCollPtr) += Icic_Vcic;
*(here->HICUMcollCICollCIPtr) += Icic_Vcic; *(here->HICUMcollCICollCIPtr) += Icic_Vcic;
*(here->HICUMcollCICollPtr) += -Icic_Vcic; *(here->HICUMcollCICollPtr) += -Icic_Vcic;
*(here->HICUMcollCollCIPtr) += -Icic_Vcic; *(here->HICUMcollCollCIPtr) += -Icic_Vcic;
// finish
/* // Branch: bbp, Stamp element: Rbx
c Branch: bbp, Stamp element: Rbx // with respect to Vbbp
*/
*(here->HICUMbaseBasePtr) += Ibbp_Vbbp; *(here->HICUMbaseBasePtr) += Ibbp_Vbbp;
*(here->HICUMbaseBPBaseBPPtr) += Ibbp_Vbbp; *(here->HICUMbaseBPBaseBPPtr) += Ibbp_Vbbp;
*(here->HICUMbaseBPBasePtr) += -Ibbp_Vbbp; *(here->HICUMbaseBPBasePtr) += -Ibbp_Vbbp;
*(here->HICUMbaseBaseBPPtr) += -Ibbp_Vbbp; *(here->HICUMbaseBaseBPPtr) += -Ibbp_Vbbp;
/* // finish
c Branch: eie, Stamp element: Re
*/ // Branch: eie, Stamp element: Re
// with respect to Veie
*(here->HICUMemitEmitPtr) += Ieie_Veie; *(here->HICUMemitEmitPtr) += Ieie_Veie;
*(here->HICUMemitEIEmitEIPtr) += Ieie_Veie; *(here->HICUMemitEIEmitEIPtr) += Ieie_Veie;
*(here->HICUMemitEIEmitPtr) += -Ieie_Veie; *(here->HICUMemitEIEmitPtr) += -Ieie_Veie;
*(here->HICUMemitEmitEIPtr) += -Ieie_Veie; *(here->HICUMemitEmitEIPtr) += -Ieie_Veie;
/* // finish
c Branch: bpbi, Stamp element: Rbi, Crbi
*/ // Branch: bpbi, Stamp element: Rbi, Crbi
rhs_current = model->HICUMtype * (Ibpbi - Ibpbi_Vbpbi*Vbpbi - Ibpbi_Vbiei*Vbiei - Ibpbi_Vbici*Vbici); rhs_current = model->HICUMtype * (Ibpbi - Ibpbi_Vbpbi*Vbpbi - Ibpbi_Vbiei*Vbiei - Ibpbi_Vbici*Vbici);
//printf("Ibpbi_Vbpbi: %g Vbpbi: %f Ibpbi_Vbiei: %g Vbiei: %f Ibpbi_Vbici: %g Vbici: %f\n", Ibpbi_Vbpbi, Vbpbi, Ibpbi_Vbiei, Vbiei, Ibpbi_Vbici, Vbici);
//printf("Ibpbi: %g RHS: %g\n", Ibpbi, rhs_current);
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current;
//f_Bp = + f_Bi = -
// with respect to Vbpbi
*(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi; *(here->HICUMbaseBPBaseBPPtr) += Ibpbi_Vbpbi;
*(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi; *(here->HICUMbaseBIBaseBIPtr) += Ibpbi_Vbpbi;
*(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi; *(here->HICUMbaseBPBaseBIPtr) += -Ibpbi_Vbpbi;
*(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi; *(here->HICUMbaseBIBaseBPPtr) += -Ibpbi_Vbpbi;
// with respect to Vbiei
*(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei; //f_Bp = +Ibpbi *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbiei;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei;
*(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei; //f_Bi = - Ibpi
*(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei; *(here->HICUMbaseBIEmitEIPtr) += Ibpbi_Vbiei;
*(here->HICUMbaseBPEmitEIPtr) += -Ibpbi_Vbiei;
*(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbiei;
// with respect to Vbici
*(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici; *(here->HICUMbaseBPBaseBIPtr) += Ibpbi_Vbici;
*(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici;
*(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici; *(here->HICUMbaseBPCollCIPtr) += -Ibpbi_Vbici;
*(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici; *(here->HICUMbaseBIBaseBIPtr) += -Ibpbi_Vbici;
*(here->HICUMbaseBICollCIPtr) += Ibpbi_Vbici; // finish
/*
c Branch: sc, Stamp element: Cscp //@NOCHMAL CHECKEN // Branch: sc, Stamp element: Cscp
*/
rhs_current = model->HICUMtype * (Isc - Isc_Vsc*Vsc); rhs_current = model->HICUMtype * (Isc - Isc_Vsc*Vsc);
*(ckt->CKTrhs + here->HICUMsubsNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMsubsNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMcollNode) += rhs_current; *(ckt->CKTrhs + here->HICUMcollNode) += rhs_current;
// with respect to Vsc
*(here->HICUMsubsSubsPtr) += Isc_Vsc; *(here->HICUMsubsSubsPtr) += Isc_Vsc;
*(here->HICUMsubsCollPtr) += Isc_Vsc; *(here->HICUMsubsCollPtr) += Isc_Vsc;
*(here->HICUMcollSubsPtr) += -Isc_Vsc; *(here->HICUMcollSubsPtr) += -Isc_Vsc;
*(here->HICUMcollCollPtr) += -Isc_Vsc; *(here->HICUMcollCollPtr) += -Isc_Vsc;
/* // finish
c Branch: sici, Stamp element: Ijsc
*/ // Branch: sici, Stamp element: Ijsc
rhs_current = model->HICUMtype * (Isici - Isici_Vsici*Vsici); rhs_current = model->HICUMtype * (Isici - Isici_Vsici*Vsici);
*(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
// with respect to Vsici
*(here->HICUMsubsSISubsSIPtr) += Isici_Vsici; *(here->HICUMsubsSISubsSIPtr) += Isici_Vsici;
*(here->HICUMcollCICollCIPtr) += Isici_Vsici; *(here->HICUMcollCICollCIPtr) += Isici_Vsici;
*(here->HICUMsubsSICollCIPtr) += -Isici_Vsici; *(here->HICUMsubsSICollCIPtr) += -Isici_Vsici;
*(here->HICUMcollCISubsSIPtr) += -Isici_Vsici; *(here->HICUMcollCISubsSIPtr) += -Isici_Vsici;
/* // finish
c Branch: bpsi, Stamp element: Its
*/ // Branch: bpsi, Stamp element: Its
rhs_current = model->HICUMtype * (Ibpsi - Ibpsi_Vbpci*Vbpci - Ibpsi_Vsici*Vsici); rhs_current = model->HICUMtype * (Ibpsi - Ibpsi_Vbpci*Vbpci - Ibpsi_Vsici*Vsici);
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMsubsSINode) += rhs_current; *(ckt->CKTrhs + here->HICUMsubsSINode) += rhs_current;
// Its flow from Bp to Si f_Bp = +Ibpsi f_Si = -Ibpsi // f_Bp = + f_Si = -
// with respect to Vsici
*(here->HICUMbaseBPSubsSIPtr) += Ibpsi_Vsici; *(here->HICUMbaseBPSubsSIPtr) += Ibpsi_Vsici;
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vsici;
*(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vsici; *(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vsici;
*(here->HICUMsubsSISubsSIPtr) += -Ibpsi_Vsici; *(here->HICUMsubsSISubsSIPtr) += -Ibpsi_Vsici;
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vsici; // with respect to Vbpci
*(here->HICUMbaseBPBaseBPPtr) += Ibpsi_Vbpci; *(here->HICUMbaseBPBaseBPPtr) += Ibpsi_Vbpci;
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vbpci;
*(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vbpci; *(here->HICUMbaseBPCollCIPtr) += -Ibpsi_Vbpci;
*(here->HICUMsubsSIBaseBPPtr) += -Ibpsi_Vbpci; *(here->HICUMsubsSIBaseBPPtr) += -Ibpsi_Vbpci;
*(here->HICUMsubsSICollCIPtr) += Ibpsi_Vbpci; // finish
/* // Branch: sis, Stamp element: Rsu
c Branch: sis, Stamp element: Rsu // with respect to Vsis
*/
*(here->HICUMsubsSubsPtr) += Isis_Vsis; *(here->HICUMsubsSubsPtr) += Isis_Vsis;
*(here->HICUMsubsSISubsSIPtr) += Isis_Vsis; *(here->HICUMsubsSISubsSIPtr) += Isis_Vsis;
*(here->HICUMsubsSISubsPtr) += -Isis_Vsis; *(here->HICUMsubsSISubsPtr) += -Isis_Vsis;
*(here->HICUMsubsSubsSIPtr) += -Isis_Vsis; *(here->HICUMsubsSubsSIPtr) += -Isis_Vsis;
// finish
//NQS //NQS
/* /*
c Branch: xf1-ground, Stamp element: Ixf1 c Branch: xf1-ground, Stamp element: Ixf1
@ -3078,115 +3090,126 @@ c Branch: xf-ground, Stamp element: Rxf
*/ */
// *(here->HICUMxfXfPtr) += 1; // current Ixf is normalized to Tf // *(here->HICUMxfXfPtr) += 1; // current Ixf is normalized to Tf
if (model->HICUMflsh) { // #############################################################
/* // ############### FINISH STAMPS NO SH #########################
c Stamp element: Ibiei f_Bi = + f_Ei = - // #############################################################
*/
if (model->HICUMflsh && model->HICUMrth >= MIN_R) {
// #############################################################
// ############### STAMP WITH SH ADDITIONS #####################
// #############################################################
// Stamp element: Ibiei f_Bi = + f_Ei = -
rhs_current = -Ibiei_dT*Vrth; rhs_current = -Ibiei_dT*Vrth;
*(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current;
*(here->HICUMbaseBItempPtr) += Ibiei_dT;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMbaseBItempPtr) += Ibiei_dT;
*(here->HICUMemitEItempPtr) += -Ibiei_dT; *(here->HICUMemitEItempPtr) += -Ibiei_dT;
/* // finish
c Stamp element: Ibici
*/ // Stamp element: Ibici f_Bi = + f_Ci = -
rhs_current = -Ibici_dT*Vrth; rhs_current = -Ibici_dT*Vrth;
*(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current;
*(here->HICUMbaseBItempPtr) += Ibici_dT;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMbaseBItempPtr) += Ibici_dT;
*(here->HICUMcollCItempPtr) += -Ibici_dT; *(here->HICUMcollCItempPtr) += -Ibici_dT;
/* // finish
c Stamp element: Iciei
*/ // Stamp element: Iciei f_Ci = + f_Ei = -
rhs_current = -Iciei_dT*Vrth; rhs_current = -Iciei_dT*Vrth;
*(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current;
*(here->HICUMcollCItempPtr) += Iciei_dT;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMcollCItempPtr) += Iciei_dT;
*(here->HICUMemitEItempPtr) += -Iciei_dT; *(here->HICUMemitEItempPtr) += -Iciei_dT;
/* // finish
c Stamp element: Ibpei
*/ // Stamp element: Ibpei f_Bp = + f_Ei = -
rhs_current = -Ibpei_dT*Vrth; rhs_current = -Ibpei_dT*Vrth;
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(here->HICUMbaseBPtempPtr) += Ibpei_dT;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMbaseBPtempPtr) += Ibpei_dT;
*(here->HICUMemitEItempPtr) += -Ibpei_dT; *(here->HICUMemitEItempPtr) += -Ibpei_dT;
/* // finish
c Stamp element: Ibpci
*/ // Stamp element: Ibpci f_Bp = + f_Ci = -
rhs_current = -Ibpci_dT*Vrth; rhs_current = -Ibpci_dT*Vrth;
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(here->HICUMbaseBPtempPtr) += Ibpci_dT;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMbaseBPtempPtr) += Ibpci_dT;
*(here->HICUMcollCItempPtr) += -Ibpci_dT; *(here->HICUMcollCItempPtr) += -Ibpci_dT;
/* // finish
c Stamp element: Isici
*/ // Stamp element: Isici f_Si = + f_Ci = -
rhs_current = -Isici_dT*Vrth; rhs_current = -Isici_dT*Vrth;
*(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current;
*(here->HICUMsubsSItempPtr) += Isici_dT;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMsubsSItempPtr) += Isici_dT;
*(here->HICUMcollCItempPtr) += -Isici_dT; *(here->HICUMcollCItempPtr) += -Isici_dT;
/* // finish
c Stamp element: Rbi
*/ // Stamp element: Rbi f_Bp = + f_Bi = -
rhs_current = -Ibpbi_dT*Vrth; rhs_current = -Ibpbi_dT*Vrth;
*(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += -rhs_current;
*(here->HICUMbaseBPtempPtr) += Ibpbi_dT;
*(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current; *(ckt->CKTrhs + here->HICUMbaseBINode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMbaseBPtempPtr) += Ibpbi_dT;
*(here->HICUMbaseBItempPtr) += -Ibpbi_dT; *(here->HICUMbaseBItempPtr) += -Ibpbi_dT;
/* // finish
c Stamp element: Isici
*/ // Stamp element: Isici f_Si = + f_Ci = -
rhs_current = -Isici_dT*Vrth; rhs_current = -Isici_dT*Vrth;
*(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMsubsSINode) += -rhs_current;
*(here->HICUMsubsSItempPtr) += Isici_dT;
*(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMsubsSItempPtr) += Isici_dT;
*(here->HICUMcollCItempPtr) += -Isici_dT; *(here->HICUMcollCItempPtr) += -Isici_dT;
/* // finish
c Stamp element: Rcx
*/ // Stamp element: Rcx f_Ci = + f_C = -
rhs_current = -Icic_dT*Vrth; rhs_current = -Icic_dT*Vrth;
*(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMcollCINode) += -rhs_current;
*(here->HICUMcollCItempPtr) += Icic_dT;
*(ckt->CKTrhs + here->HICUMcollNode) += rhs_current; *(ckt->CKTrhs + here->HICUMcollNode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMcollCItempPtr) += Icic_dT;
*(here->HICUMcollTempPtr) += -Icic_dT; *(here->HICUMcollTempPtr) += -Icic_dT;
/* // finish
c Stamp element: Rbx
*/ // Stamp element: Rbx f_B = + f_Bp = -
rhs_current = -Ibbp_dT*Vrth; rhs_current = -Ibbp_dT*Vrth;
*(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMbaseNode) += -rhs_current;
*(here->HICUMbaseTempPtr) += Ibbp_dT;
*(ckt->CKTrhs + here->HICUMbaseBPNode) += rhs_current; *(ckt->CKTrhs + here->HICUMbaseBPNode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMbaseTempPtr) += Ibbp_dT;
*(here->HICUMbaseBPtempPtr) += -Ibbp_dT; *(here->HICUMbaseBPtempPtr) += -Ibbp_dT;
/* // finish
c Stamp element: Re
*/ // Stamp element: Re f_Ei = + f_E = -
rhs_current = -Ieie_dT*Vrth; rhs_current = -Ieie_dT*Vrth;
*(ckt->CKTrhs + here->HICUMemitEINode) += -rhs_current; *(ckt->CKTrhs + here->HICUMemitEINode) += -rhs_current;
*(here->HICUMemitEItempPtr) += Ieie_dT;
*(ckt->CKTrhs + here->HICUMemitNode) += rhs_current; *(ckt->CKTrhs + here->HICUMemitNode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMemitTempPtr) += -Ieie_dT; *(here->HICUMemitTempPtr) += -Ieie_dT;
/* *(here->HICUMemitEItempPtr) += Ieie_dT;
c Stamp element: Rth -> Non-linear component here as Rth=f(T) // finish
*/
// Stamp element: Rth -> Non-linear component here as Rth=f(T) f_Vrth = +
rhs_current = -Irth_dT*Vrth; rhs_current = -Irth_dT*Vrth;
*(ckt->CKTrhs + here->HICUMtempNode) += -rhs_current; *(ckt->CKTrhs + here->HICUMtempNode) += -rhs_current;
// with respect to Potential Vrth
*(here->HICUMtempTempPtr) += Irth_dT; *(here->HICUMtempTempPtr) += Irth_dT;
/* // finish
c Stamp element: Cth
*/ // Stamp element: Cth //rhs missing?
*(here->HICUMtempTempPtr) += Icth_dT; *(here->HICUMtempTempPtr) += Icth_dT;
/* // finish
c Stamp element: Ith
*/ // Stamp element: Ith f_T = - Ith
//before
// rhs_current = Ith + Icth - Icth_dT*Vrth
// + Ith_Vbiei*Vbiei + Ith_Vbici*Vbici + Ith_Vciei*Vciei
// + Ith_Vbpei*Vbpei + Ith_Vbpci*Vbpci + Ith_Vsici*Vsici
// + Ith_Vbpbi*Vbpbi
// + Ith_Vcic*Vcic + Ith_Vbbp*Vbbp + Ith_Veie*Veie;
//Markus suggestion, f_T = - Ith
rhs_current = Ith + Icth - Icth_dT*Vrth rhs_current = Ith + Icth - Icth_dT*Vrth
- Ith_Vbiei*Vbiei - Ith_Vbici*Vbici - Ith_Vciei*Vciei - Ith_Vbiei*Vbiei - Ith_Vbici*Vbici - Ith_Vciei*Vciei
- Ith_Vbpei*Vbpei - Ith_Vbpci*Vbpci - Ith_Vsici*Vsici - Ith_Vbpei*Vbpei - Ith_Vbpci*Vbpci - Ith_Vsici*Vsici
@ -3195,38 +3218,39 @@ c Stamp element: Ith
- Ith_dT*Vrth; - Ith_dT*Vrth;
*(ckt->CKTrhs + here->HICUMtempNode) += rhs_current; *(ckt->CKTrhs + here->HICUMtempNode) += rhs_current;
// with respect to Potential Vrth
*(here->HICUMtempTempPtr) += -Ith_dT; *(here->HICUMtempTempPtr) += -Ith_dT;
// with respect to Potential Vbiei
*(here->HICUMtempBaseBIPtr) += -Ith_Vbiei; *(here->HICUMtempBaseBIPtr) += -Ith_Vbiei;
*(here->HICUMtempEmitEIPtr) += +Ith_Vbiei; *(here->HICUMtempEmitEIPtr) += +Ith_Vbiei;
// with respect to Potential Vbici
*(here->HICUMtempBaseBIPtr) += -Ith_Vbici; *(here->HICUMtempBaseBIPtr) += -Ith_Vbici;
*(here->HICUMtempCollCIPtr) += +Ith_Vbici; *(here->HICUMtempCollCIPtr) += +Ith_Vbici;
// with respect to Potential Vciei
*(here->HICUMtempCollCIPtr) += -Ith_Vciei; *(here->HICUMtempCollCIPtr) += -Ith_Vciei;
*(here->HICUMtempEmitEIPtr) += +Ith_Vciei; *(here->HICUMtempEmitEIPtr) += +Ith_Vciei;
// with respect to Potential Vbpei
*(here->HICUMtempBaseBPPtr) += -Ith_Vbpei; *(here->HICUMtempBaseBPPtr) += -Ith_Vbpei;
*(here->HICUMtempEmitEIPtr) += +Ith_Vbpei; *(here->HICUMtempEmitEIPtr) += +Ith_Vbpei;
// with respect to Potential Vbpci
*(here->HICUMtempBaseBPPtr) += -Ith_Vbpci; *(here->HICUMtempBaseBPPtr) += -Ith_Vbpci;
*(here->HICUMtempCollCIPtr) += +Ith_Vbpci; *(here->HICUMtempCollCIPtr) += +Ith_Vbpci;
// with respect to Potential Vsici
*(here->HICUMtempSubsSIPtr) += -Ith_Vsici; *(here->HICUMtempSubsSIPtr) += -Ith_Vsici;
*(here->HICUMtempCollCIPtr) += +Ith_Vsici; *(here->HICUMtempCollCIPtr) += +Ith_Vsici;
// with respect to Potential Vbpbi
*(here->HICUMtempBaseBPPtr) += -Ith_Vbpbi; *(here->HICUMtempBaseBPPtr) += -Ith_Vbpbi;
*(here->HICUMtempBaseBIPtr) += +Ith_Vbpbi; *(here->HICUMtempBaseBIPtr) += +Ith_Vbpbi;
// with respect to Potential Vcic
*(here->HICUMtempCollCIPtr) += +Ith_Vcic; *(here->HICUMtempCollCIPtr) += -Ith_Vcic;
*(here->HICUMtempCollPtr) += -Ith_Vcic; *(here->HICUMtempCollPtr) += +Ith_Vcic;
// with respect to Potential Vbbp
*(here->HICUMtempBaseBPPtr) += +Ith_Vbbp;
*(here->HICUMtempBasePtr) += -Ith_Vbbp; *(here->HICUMtempBasePtr) += -Ith_Vbbp;
*(here->HICUMtempBaseBPPtr) += +Ith_Vbbp;
*(here->HICUMtempEmitEIPtr) += +Ith_Veie; // with respect to Potential Veie
*(here->HICUMtempEmitPtr) += -Ith_Veie; *(here->HICUMtempEmitEIPtr) += -Ith_Veie;
*(here->HICUMtempEmitPtr) += +Ith_Veie;
// finish
} }
} }