derivatives rbi

This commit is contained in:
Markus Mueller 2020-04-20 19:00:16 +02:00
parent 330d009fa6
commit 0dbf31bc73
1 changed files with 48 additions and 46 deletions

View File

@ -591,7 +591,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
double itf,itr,Tf,Tr,VT_f,i_0f,i_0r,a_bpt,Q_0,Q_p,Q_bpt;
double Orci0_t,b_q,I_Tf1,T_f0,Q_fT,T_fT,Q_bf;
double a_h,Q_pT,d_Q;
double Qf,Cdei,Qr,Cdci;
double Qf,Qf_Vbiei,Qf_Vbici,Qf_dT,Cdei,Qr,Cdci;
double ick, ick_Vciei, ick_dT,vc,cjcx01,cjcx02;
int l_it;
@ -648,7 +648,7 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
double Ibci, Ibci_Vbci, Ibci_dT;
double hjei_vbe_Vbiei, hjei_vbe_dT, ibet_Vbpei=0.0, ibet_dT=0, ibet_Vbiei=0.0, ibh_rec_Vbiei;
double irei_Vbiei, irei_dT;
double irep_Vbpei, iavl_Vbici, rbi_Vbiei, rbi_Vbici;
double irep_Vbpei, iavl_Vbici, rbi_dT, rbi_dQjei, rbi_dCjci, rbi_dQf, rbi_Vbiei, rbi_Vbici;
double ibei_Vbiei, ibei_dT;
double Q_0_Vbiei, Q_0_Vbici, Q_0_hjei_vbe, Q_0_Qjci, Q_0_Qjei, Q_0_dT;
@ -847,6 +847,38 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
return iavl;
};
std::function<duals::duald (duals::duald, duals::duald, duals::duald, duals::duald)> calc_rbi = [&](duals::duald T, duals::duald Qjei, duals::duald Cjci, duals::duald Qf){
//Internal base resistance
duals::duald vt,rbi;
vt = CONSTboltz * T / CHARGE;
if(here->HICUMrbi0_t > 0.0){ //: HICRBI
duals::duald Qz_nom,f_QR,ETA,Qz0,fQz;
// Consideration of conductivity modulation
// To avoid convergence problem hyperbolic smoothing used
f_QR = (1+model->HICUMfdqr0)*here->HICUMqp0_t;
Qz0 = Qjei+Qjci+Qf;
Qz_nom = 1+Qz0/f_QR;
fQz = 0.5*(Qz_nom+sqrt(Qz_nom*Qz_nom+0.01));
rbi = here->HICUMrbi0_t/fQz;
// Consideration of emitter current crowding
if( ibei > 0.0) {
ETA = rbi*ibei*model->HICUMfgeo/vt;
if(ETA < 1.0e-6) {
rbi = rbi*(1.0-0.5*ETA);
} else {
rbi = rbi*log(1.0+ETA)/ETA;
}
}
// Consideration of peripheral charge
if(Qf > 0.0) {
rbi = rbi*(Qjei+Qf*model->HICUMfqi)/(Qjei+Qf);
}
} else {
rbi = 0.0;
}
return rbi;
};
/* loop through all the models */
for (; model != NULL; model = HICUMnextModel(model)) {
@ -1573,50 +1605,20 @@ HICUMload(GENmodel *inModel, CKTcircuit *ckt)
//todo: Q_bf derivatives to Vbiei
ibh_rec_Vbiei = 0.0;
//todo: Qf derivatives to Vbiei, Vbici
//Internal base resistance = f(Vbiei, Vbici)
if(here->HICUMrbi0_t > 0.0) { // HICRBI
double Qz_nom,f_QR,ETA,Qz0,fQz,ETA_Vbiei,ETA_Vbici,fQz_Vbiei,fQz_Vbici,Qz_nom_Vbiei,Qz_nom_Vbici,d1;
// Consideration of conductivity modulation
// To avoid convergence problem hyperbolic smoothing used
f_QR = (1+model->HICUMfdqr0)*here->HICUMqp0_t;
Qz0 = Qjei+Qjci+Qf;
Qz_nom = 1+Qz0/f_QR;
Qz_nom_Vbiei=Cjei/f_QR;
Qz_nom_Vbici=Cjci/f_QR;
d1 = sqrt(Qz_nom*Qz_nom+0.01);
fQz = 0.5*(Qz_nom+d1);
fQz_Vbiei=0.5*(Qz_nom*Qz_nom_Vbiei/d1+Qz_nom_Vbiei);
fQz_Vbici=0.5*(Qz_nom*Qz_nom_Vbici/d1+Qz_nom_Vbici);
rbi = here->HICUMrbi0_t/fQz;
rbi_Vbiei=-here->HICUMrbi0_t*fQz_Vbiei/(fQz*fQz);
rbi_Vbici=-here->HICUMrbi0_t*fQz_Vbici/(fQz*fQz);
// Consideration of emitter current crowding
if( ibei > 0.0) {
ETA = rbi*ibei*model->HICUMfgeo/here->HICUMvt;
ETA_Vbiei = (rbi*Ibiei_Vbiei+rbi_Vbiei*ibei)*model->HICUMfgeo/here->HICUMvt;
ETA_Vbici = rbi_Vbici*ibei*model->HICUMfgeo/here->HICUMvt;
if(ETA < 1.0e-6) {
rbi = rbi*(1.0-0.5*ETA);
rbi_Vbiei = rbi_Vbiei-0.5*(rbi*ETA_Vbiei+rbi_Vbiei*ETA);
rbi_Vbici = rbi_Vbici-0.5*(rbi*ETA_Vbici+rbi_Vbici*ETA);
} else {
rbi = rbi*log(1.0+ETA)/ETA;
rbi_Vbiei=log(ETA+1)*rbi_Vbiei/ETA - rbi*ETA_Vbiei*log(ETA+1)/ETA/ETA + rbi*ETA_Vbiei/(ETA*(ETA+1));
rbi_Vbici=log(ETA+1)*rbi_Vbici/ETA - rbi*ETA_Vbici*log(ETA+1)/ETA/ETA + rbi*ETA_Vbici/(ETA*(ETA+1));
}
}
// Consideration of peripheral charge
if(Qf > 0.0) {
rbi = rbi*(Qjei+Qf*model->HICUMfqi)/(Qjei+Qf);
rbi_Vbiei = (Qjei+Qf*model->HICUMfqi)*rbi_Vbiei/(Qjei+Qf) + rbi*Cjei/(Qjei+Qf) - (Qjei+Qf*model->HICUMfqi)*rbi*Cjei/(Qjei+Qf)/(Qjei+Qf);
rbi_Vbici = rbi_Vbici*(Qjei+Qf*model->HICUMfqi)/(Qjei+Qf);
}
} else {
rbi = 0.0;
rbi_Vbiei = 0.0;
rbi_Vbici = 0.0;
}
//internal base resistance
result = calc_rbi(here->HICUMtemp+1_e, Qjei , Cjci , Qf );
rbi = result.rpart();
rbi_dT = result.dpart();
result = calc_rbi(here->HICUMtemp , Qjei+1_e, Cjci , Qf );
rbi_dQjei = result.dpart();
result = calc_rbi(here->HICUMtemp , Qjei , Cjci+1_e, Qf );
rbi_dCjci = result.dpart();
result = calc_rbi(here->HICUMtemp , Qjei , Cjci , Qf+1_e);
rbi_dQf = result.dpart();
rbi_Vbiei = rbi_dQjei* Qjei_Vbiei + rbi_dQf * Qf_Vbiei ;
rbi_Vbici = rbi_dQf * Qf_Vbici + rbi_dCjci*Cjci_Vbici;
rbi_dT += rbi_dQjei*Qjei_dT + rbi_dCjci*Cjci_dT + rbi_dQf*Qf_dT;
//Base currents across peripheral b-e junction
//TODO