fix nqs transient

This commit is contained in:
Markus Mueller 2020-09-08 15:43:18 +02:00
parent fa7f96b4af
commit a52274ba7d
6 changed files with 127 additions and 109 deletions

View File

@ -26,6 +26,7 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
double Ibpei_Vrth;
double Ibiei_Vbiei;
double Ibiei_Vxf;
double Ibiei_Vbici;
double Ibiei_Vrth;
@ -157,6 +158,7 @@ HICUMacLoad(GENmodel *inModel, CKTcircuit *ckt)
}
Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei);
Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf);
Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici);
Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth);

View File

@ -97,6 +97,7 @@ HICUMconvTest(GENmodel *inModel, CKTcircuit *ckt)
delvbbp = Vbbp - *(ckt->CKTstate0 + here->HICUMvbbp);
delveie = Veie - *(ckt->CKTstate0 + here->HICUMveie);
//todo: maybe add ibiei_Vxf
ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) +
*(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei +
*(ckt->CKTstate0 + here->HICUMibiei_Vrth)*delvrth +

View File

@ -386,127 +386,128 @@ typedef struct sHICUMinstance {
#define HICUMibiei HICUMstate+13
#define HICUMibiei_Vbiei HICUMstate+14
#define HICUMibiei_Vbici HICUMstate+15
#define HICUMibiei_Vrth HICUMstate+16
#define HICUMibiei_Vxf HICUMstate+15
#define HICUMibiei_Vbici HICUMstate+16
#define HICUMibiei_Vrth HICUMstate+17
#define HICUMibpei HICUMstate+17
#define HICUMibpei_Vbpei HICUMstate+18
#define HICUMibpei_Vrth HICUMstate+19
#define HICUMibpei HICUMstate+18
#define HICUMibpei_Vbpei HICUMstate+19
#define HICUMibpei_Vrth HICUMstate+20
#define HICUMiciei HICUMstate+20
#define HICUMiciei_Vbiei HICUMstate+21
#define HICUMiciei_Vbici HICUMstate+22
#define HICUMiciei_Vxf2 HICUMstate+23
#define HICUMiciei_Vrth HICUMstate+24
#define HICUMiciei HICUMstate+21
#define HICUMiciei_Vbiei HICUMstate+22
#define HICUMiciei_Vbici HICUMstate+23
#define HICUMiciei_Vxf2 HICUMstate+24
#define HICUMiciei_Vrth HICUMstate+25
#define HICUMibici HICUMstate+25
#define HICUMibici_Vbici HICUMstate+26
#define HICUMibici_Vbiei HICUMstate+27
#define HICUMibici_Vrth HICUMstate+28
#define HICUMibici HICUMstate+26
#define HICUMibici_Vbici HICUMstate+27
#define HICUMibici_Vbiei HICUMstate+28
#define HICUMibici_Vrth HICUMstate+29
#define HICUMibpbi HICUMstate+29
#define HICUMibpbi_Vbpbi HICUMstate+30
#define HICUMibpbi_Vbiei HICUMstate+31
#define HICUMibpbi_Vbici HICUMstate+32
#define HICUMibpbi_Vrth HICUMstate+33
#define HICUMibpbi HICUMstate+30
#define HICUMibpbi_Vbpbi HICUMstate+31
#define HICUMibpbi_Vbiei HICUMstate+32
#define HICUMibpbi_Vbici HICUMstate+33
#define HICUMibpbi_Vrth HICUMstate+34
#define HICUMibpci HICUMstate+34
#define HICUMibpci_Vbpci HICUMstate+35
#define HICUMibpci_Vrth HICUMstate+36
#define HICUMibpci HICUMstate+35
#define HICUMibpci_Vbpci HICUMstate+36
#define HICUMibpci_Vrth HICUMstate+37
#define HICUMisici HICUMstate+37
#define HICUMisici_Vsici HICUMstate+38
#define HICUMisici_Vrth HICUMstate+39
#define HICUMisici HICUMstate+38
#define HICUMisici_Vsici HICUMstate+39
#define HICUMisici_Vrth HICUMstate+40
#define HICUMibpsi HICUMstate+40
#define HICUMibpsi_Vbpci HICUMstate+41
#define HICUMibpsi_Vsici HICUMstate+42
#define HICUMibpsi_Vrth HICUMstate+43
#define HICUMibpsi HICUMstate+41
#define HICUMibpsi_Vbpci HICUMstate+42
#define HICUMibpsi_Vsici HICUMstate+43
#define HICUMibpsi_Vrth HICUMstate+44
#define HICUMisis_Vsis HICUMstate+44
#define HICUMisis_Vsis HICUMstate+45
#define HICUMieie HICUMstate+45 // needed for re-flicker noise
#define HICUMieie_Vrth HICUMstate+46
#define HICUMieie HICUMstate+46 // needed for re-flicker noise
#define HICUMieie_Vrth HICUMstate+47
#define HICUMqrbi HICUMstate+47
#define HICUMcqrbi HICUMstate+48
#define HICUMqrbi HICUMstate+48
#define HICUMcqrbi HICUMstate+49
#define HICUMqjei HICUMstate+49
#define HICUMcqjei HICUMstate+50
#define HICUMqjei HICUMstate+50
#define HICUMcqjei HICUMstate+51
#define HICUMqf HICUMstate+51
#define HICUMcqf HICUMstate+52
#define HICUMqf HICUMstate+52
#define HICUMcqf HICUMstate+53
#define HICUMqr HICUMstate+53
#define HICUMcqr HICUMstate+54
#define HICUMqr HICUMstate+54
#define HICUMcqr HICUMstate+55
#define HICUMqjci HICUMstate+55
#define HICUMcqjci HICUMstate+56
#define HICUMqjci HICUMstate+56
#define HICUMcqjci HICUMstate+57
#define HICUMqjep HICUMstate+57
#define HICUMcqjep HICUMstate+58
#define HICUMqjep HICUMstate+58
#define HICUMcqjep HICUMstate+59
#define HICUMqjcx0_i HICUMstate+59
#define HICUMcqcx0_t_i HICUMstate+60
#define HICUMqjcx0_i HICUMstate+60
#define HICUMcqcx0_t_i HICUMstate+61
#define HICUMqjcx0_ii HICUMstate+61
#define HICUMcqcx0_t_ii HICUMstate+62
#define HICUMqjcx0_ii HICUMstate+62
#define HICUMcqcx0_t_ii HICUMstate+63
#define HICUMqdsu HICUMstate+63
#define HICUMcqdsu HICUMstate+64
#define HICUMqdsu HICUMstate+64
#define HICUMcqdsu HICUMstate+65
#define HICUMqjs HICUMstate+65
#define HICUMcqjs HICUMstate+66
#define HICUMqjs HICUMstate+66
#define HICUMcqjs HICUMstate+67
#define HICUMqscp HICUMstate+67
#define HICUMcqscp HICUMstate+68
#define HICUMqscp HICUMstate+68
#define HICUMcqscp HICUMstate+69
#define HICUMqbepar1 HICUMstate+69
#define HICUMcqbepar1 HICUMstate+70
#define HICUMgqbepar1 HICUMstate+71
#define HICUMqbepar1 HICUMstate+70
#define HICUMcqbepar1 HICUMstate+71
#define HICUMgqbepar1 HICUMstate+72
#define HICUMqbepar2 HICUMstate+72
#define HICUMcqbepar2 HICUMstate+73
#define HICUMgqbepar2 HICUMstate+74
#define HICUMqbepar2 HICUMstate+73
#define HICUMcqbepar2 HICUMstate+74
#define HICUMgqbepar2 HICUMstate+75
#define HICUMqbcpar1 HICUMstate+75
#define HICUMcqbcpar1 HICUMstate+76
#define HICUMgqbcpar1 HICUMstate+77
#define HICUMqbcpar1 HICUMstate+76
#define HICUMcqbcpar1 HICUMstate+77
#define HICUMgqbcpar1 HICUMstate+78
#define HICUMqbcpar2 HICUMstate+78
#define HICUMcqbcpar2 HICUMstate+79
#define HICUMgqbcpar2 HICUMstate+80
#define HICUMqbcpar2 HICUMstate+79
#define HICUMcqbcpar2 HICUMstate+80
#define HICUMgqbcpar2 HICUMstate+81
#define HICUMqsu HICUMstate+81
#define HICUMcqsu HICUMstate+82
#define HICUMgqsu HICUMstate+83
#define HICUMqsu HICUMstate+82
#define HICUMcqsu HICUMstate+83
#define HICUMgqsu HICUMstate+84
#define HICUMqcth HICUMstate+84
#define HICUMcqcth HICUMstate+85
#define HICUMqcth HICUMstate+85
#define HICUMcqcth HICUMstate+86
#define HICUMqxf HICUMstate+86
#define HICUMcqxf HICUMstate+87
#define HICUMgqxf HICUMstate+88
#define HICUMixf HICUMstate+89
#define HICUMixf_Vbiei HICUMstate+90
#define HICUMixf_Vbici HICUMstate+91
#define HICUMixf_Vxf HICUMstate+92
#define HICUMixf_Vrth HICUMstate+93
#define HICUMqxf HICUMstate+87
#define HICUMcqxf HICUMstate+88
#define HICUMgqxf HICUMstate+89
#define HICUMixf HICUMstate+90
#define HICUMixf_Vbiei HICUMstate+91
#define HICUMixf_Vbici HICUMstate+92
#define HICUMixf_Vxf HICUMstate+93
#define HICUMixf_Vrth HICUMstate+94
#define HICUMqxf1 HICUMstate+94
#define HICUMcqxf1 HICUMstate+95
#define HICUMgqxf1 HICUMstate+96
#define HICUMixf1 HICUMstate+97
#define HICUMixf1_Vbiei HICUMstate+98
#define HICUMixf1_Vbici HICUMstate+99
#define HICUMixf1_Vxf2 HICUMstate+100
#define HICUMixf1_Vxf1 HICUMstate+101
#define HICUMixf1_Vrth HICUMstate+102
#define HICUMqxf1 HICUMstate+95
#define HICUMcqxf1 HICUMstate+96
#define HICUMgqxf1 HICUMstate+97
#define HICUMixf1 HICUMstate+98
#define HICUMixf1_Vbiei HICUMstate+99
#define HICUMixf1_Vbici HICUMstate+100
#define HICUMixf1_Vxf2 HICUMstate+101
#define HICUMixf1_Vxf1 HICUMstate+102
#define HICUMixf1_Vrth HICUMstate+103
#define HICUMqxf2 HICUMstate+103
#define HICUMcqxf2 HICUMstate+104
#define HICUMgqxf2 HICUMstate+105
#define HICUMixf2 HICUMstate+106
#define HICUMqxf2 HICUMstate+104
#define HICUMcqxf2 HICUMstate+105
#define HICUMgqxf2 HICUMstate+106
#define HICUMixf2 HICUMstate+107
#define HICUMixf2_Vbiei HICUMstate+108
#define HICUMixf2_Vbici HICUMstate+109
#define HICUMixf2_Vxf1 HICUMstate+110

View File

@ -155,11 +155,9 @@ HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
//Series resistances
case HICUM_MOD_RBI0:
value->rValue = model->HICUMrbi0;
if (model->HICUMrbi0 < MIN_R) model->HICUMrbi0 = MIN_R;
return(OK);
case HICUM_MOD_RBX:
value->rValue = model->HICUMrbx;
if (model->HICUMrbx < MIN_R) model->HICUMrbx = MIN_R;
return(OK);
case HICUM_MOD_FGEO:
value->rValue = model->HICUMfgeo;
@ -175,11 +173,9 @@ HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
return(OK);
case HICUM_MOD_RE:
value->rValue = model->HICUMre;
if (model->HICUMre < MIN_R) model->HICUMre = MIN_R;
return(OK);
case HICUM_MOD_RCX:
value->rValue = model->HICUMrcx;
if (model->HICUMrcx < MIN_R) model->HICUMrcx = MIN_R;
return(OK);
//Substrate transistor
@ -202,7 +198,6 @@ HICUMmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
//Intra-device substrate coupling
case HICUM_MOD_RSU:
value->rValue = model->HICUMrsu;
if (model->HICUMrsu < MIN_R) model->HICUMrsu = MIN_R;
return(OK);
case HICUM_MOD_CSU:

View File

@ -26,6 +26,7 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
double Ibpei_Vrth;
double Ibiei_Vbiei;
double Ibiei_Vxf;
double Ibiei_Vbici;
double Ibiei_Vrth;
@ -157,6 +158,7 @@ HICUMpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
}
Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei);
Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf);
Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici);
Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth);

View File

@ -437,7 +437,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
int error;
double Vbe, Vcic, Vbbp, Veie, Vsis, Vbpe;
double Ibiei, Ibiei_Vbiei, Ibiei_Vbici;
double Ibiei, Ibiei_Vbiei, Ibiei_Vxf, Ibiei_Vbici;
double Ibici, Ibici_Vbici, Ibici_Vbiei;
double Ibpei, Ibpei_Vbpei;
double Ibpci, Ibpci_Vbpci;
@ -1349,6 +1349,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0+here->HICUMveie)=*(ckt->CKTstate1+here->HICUMveie);
*(ckt->CKTstate0+here->HICUMibiei)=*(ckt->CKTstate1+here->HICUMibiei);
*(ckt->CKTstate0+here->HICUMibiei_Vbiei)=*(ckt->CKTstate1+here->HICUMibiei_Vbiei);
*(ckt->CKTstate0+here->HICUMibiei_Vxf)=*(ckt->CKTstate1+here->HICUMibiei_Vxf);
*(ckt->CKTstate0+here->HICUMibiei_Vbici)=*(ckt->CKTstate1+here->HICUMibiei_Vbici);
*(ckt->CKTstate0+here->HICUMibiei_Vrth)=*(ckt->CKTstate1+here->HICUMibiei_Vrth);
*(ckt->CKTstate0+here->HICUMibpei)=*(ckt->CKTstate1+here->HICUMibpei);
@ -1558,6 +1559,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
if (selfheat) {
Vrth = *(ckt->CKTrhsOld + here->HICUMtempNode);
}
//todo: maybe add ibiei_Vxf
ibieihat = *(ckt->CKTstate0 + here->HICUMibiei) +
*(ckt->CKTstate0 + here->HICUMibiei_Vbiei)*delvbiei+
*(ckt->CKTstate0 + here->HICUMibiei_Vrth)*delvrth+
@ -1689,6 +1691,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
Ibiei = *(ckt->CKTstate0 + here->HICUMibiei);
Ibiei_Vbiei = *(ckt->CKTstate0 + here->HICUMibiei_Vbiei);
Ibiei_Vxf = *(ckt->CKTstate0 + here->HICUMibiei_Vxf);
Ibiei_Vbici = *(ckt->CKTstate0 + here->HICUMibiei_Vbici);
Ibiei_Vrth = *(ckt->CKTstate0 + here->HICUMibiei_Vrth);
@ -2203,6 +2206,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
Qxf = model->HICUMalqf*model->HICUMt0*Vxf; //for RC nw
Qxf_Vxf = model->HICUMalqf*model->HICUMt0; //for RC nw
//convergency killer
Qdeix = Vxf; //for RC nw
Qdeix_Vxf = 1.0;
Qdeix_Vbiei = 0;
@ -2642,10 +2646,18 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
Ibiei_Vbiei += geq;
Ibiei += *(ckt->CKTstate0 + here->HICUMcqjei);
//Qdeix
error = NIintegrate(ckt,&geq,&ceq,Qdeix_Vbiei,here->HICUMqf);
if(error) return(error);
Ibiei_Vbiei += geq;
Ibiei += *(ckt->CKTstate0 + here->HICUMcqf);
if (!nqs) {
error = NIintegrate(ckt,&geq,&ceq,Qdeix_Vbiei,here->HICUMqf);
if(error) return(error);
Ibiei_Vbiei += geq;
Ibiei_Vxf = 0;
Ibiei += *(ckt->CKTstate0 + here->HICUMcqf);
} else { //Qdeix is now a function of Vxf(t)
error = NIintegrate(ckt,&geq,&ceq,Qdeix_Vxf,here->HICUMqf);
if(error) return(error);
Ibiei_Vxf = geq;
Ibiei += *(ckt->CKTstate0 + here->HICUMcqf);
}
//Qr
error = NIintegrate(ckt,&geq,&ceq,Qr_Vbici,here->HICUMqr);
if(error) return(error);
@ -2687,21 +2699,21 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
Isc_Vsc = geq;
Isc = *(ckt->CKTstate0 + here->HICUMcqscp);
if (nqs) {
//Qxf
error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->HICUMqxf);
//Qxf1
error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->HICUMqxf1);
if(error) return(error);
Ixf1_Vxf1 += geq;
Ixf1 += *(ckt->CKTstate0 + here->HICUMcqxf);
Ixf1 += *(ckt->CKTstate0 + here->HICUMcqxf1);
//Qxf2
error = NIintegrate(ckt,&geq,&ceq,Qxf2_Vxf2,here->HICUMqxf2);
if(error) return(error);
Ixf2_Vxf2 += geq;
Ixf2 += *(ckt->CKTstate0 + here->HICUMcqxf2);
//Qxf
error = NIintegrate(ckt,&geq,&ceq,Qxf_Vxf,here->HICUMqxf1);
error = NIintegrate(ckt,&geq,&ceq,Qxf_Vxf,here->HICUMqxf);
if(error) return(error);
Ixf_Vxf += geq;
Ixf += *(ckt->CKTstate0 + here->HICUMcqxf1);
Ixf += *(ckt->CKTstate0 + here->HICUMcqxf);
}
if (selfheat)
@ -2809,6 +2821,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate0 + here->HICUMibiei) = Ibiei;
*(ckt->CKTstate0 + here->HICUMibiei_Vbiei) = Ibiei_Vbiei;
*(ckt->CKTstate0 + here->HICUMibiei_Vxf) = Ibiei_Vxf;
*(ckt->CKTstate0 + here->HICUMibiei_Vbici) = Ibiei_Vbici;
*(ckt->CKTstate0 + here->HICUMibiei_Vrth) = Ibiei_Vrth;
@ -2981,7 +2994,7 @@ load:
// finish
// Branch: biei, Stamp element: Ibiei = Ibei + Irei ( was Ijbei )
rhs_current = model->HICUMtype * (Ibiei - Ibiei_Vbiei*Vbiei - Ibiei_Vbici*Vbici);
rhs_current = model->HICUMtype * (Ibiei - Ibiei_Vbiei*Vbiei - Ibiei_Vxf*Vxf - Ibiei_Vbici*Vbici);
*(ckt->CKTrhs + here->HICUMbaseBINode) += -rhs_current;
*(ckt->CKTrhs + here->HICUMemitEINode) += rhs_current;
// with respect to Vbiei
@ -2994,6 +3007,10 @@ load:
*(here->HICUMemitEICollCIPtr) += Ibiei_Vbici;
*(here->HICUMbaseBICollCIPtr) += -Ibiei_Vbici;
*(here->HICUMemitEIBaseBIPtr) += -Ibiei_Vbici;
if (nqs) {
*(here->HICUMbaseBIXfPtr) += Ibiei_Vxf;
*(here->HICUMemitEIXfPtr) += -Ibiei_Vxf;
}
// finish
// Branch: bpei, Stamp element: Ibpei = Ibep + Irep ( was Ijbep )
@ -3162,7 +3179,7 @@ load:
// Branch: xf-ground, Stamp element: Ixf f_xf=+
rhs_current = Ixf - Ixf_Vbici*Vbici - Ixf_Vbiei*Vbiei - Ixf_Vxf*Vxf;
*(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // rhs_current; // into xf2 node
*(ckt->CKTrhs + here->HICUMxfNode) += -rhs_current; // rhs_current; // into xf node
*(here->HICUMxfBaseBIPtr) += +Ixf_Vbiei;
*(here->HICUMxfEmitEIPtr) += -Ixf_Vbiei;
*(here->HICUMxfBaseBIPtr) += +Ixf_Vbici;