reduce state vector and some cleanings

This commit is contained in:
dwarning 2026-03-14 11:15:44 +01:00
parent 2fae71033a
commit 08947ea00a
3 changed files with 14 additions and 22 deletions

View File

@ -92,10 +92,9 @@ DIOacLoad(GENmodel *inModel, CKTcircuit *ckt)
}
}
if ((here->DIOqpNode > 0) && (model->DIOsoftRevRecParam!=0) && (here->DIOtTransitTime!=0)) {
double gdres = *(ckt->CKTstate0 + here->DIOresConduct);
/* QP subcircuit */
double fac = here->DIOtTransitTime / model->DIOsoftRevRecParam;
double dcrrdvd = fac*gdres;
double dcrrdvd = fac * here->DIOgdres;
*(here->DIOqpQpPtr) += 1/model->DIOsoftRevRecParam;
*(here->DIOqpQpPtr + 1) += here->DIOtTransitTime * ckt->CKTomega;
*(here->DIOqpPosPrimePtr) += -dcrrdvd;

View File

@ -94,7 +94,9 @@ typedef struct sDIOinstance {
double DIOcap; /* stores the diode capacitance */
double DIOcapSW; /* stores the diode Sw capacitance */
/* rev-rec */
double DIOqpGain;/* converts iterated diffcharge current */
double DIOgdres; /* dc part of diode conductance for soft recovery model */
double *DIOsens; /* stores the perturbed values of geq and ceq in ac
sensitivity analyis */
@ -280,15 +282,13 @@ typedef struct sDIOinstance {
#define DIOsrcapCharge DIOstate+15
#define DIOsrcapCurrent DIOstate+16
#define DIOqp DIOstate+17
#define DIOresCurrent DIOstate+18
#define DIOresConduct DIOstate+19
#define DIOcqcsr DIOstate+20
#define DIOgqcsr DIOstate+21
#define DIOcqcsr DIOstate+18
#define DIOgqcsr DIOstate+19
#define DIOnumStates 22
#define DIOnumStates 20
#define DIOsensxp DIOstate+21 /* charge sensitivities and their derivatives.
* +22 for the derivatives - pointer to the
#define DIOsensxp DIOstate+20 /* charge sensitivities and their derivatives.
* +21 for the derivatives - pointer to the
* beginning of the array */
#define DIOnumSenStates 2

View File

@ -26,7 +26,6 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt)
double argsw;
double capd, capdsw=0.0;
double cd, cdb, cdsw, cdb_dT, cdsw_dT;
double cdres, gdres;
double cdeq;
double cdhat, cdhatsw=0.0;
double ceq;
@ -44,7 +43,6 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt)
double evd;
double evrev;
double gd, gdb, gdsw, gen_fac, gen_fac_vd;
double capsr, gqcsr, cqcsr;
double t1, evd_rec, cdb_rec, gdb_rec, cdb_rec_dT;
double geq;
double gspr; /* area-scaled conductance */
@ -54,7 +52,6 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt)
double tol; /* temporary for tolerence calculations */
#endif
double vd, vdsw=0.0; /* current diode voltage */
double vqp;
double vdtemp;
double vt; /* K t / Q */
double vte, vtesw, vtetun, vtebrk, vterec;
@ -68,6 +65,10 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt)
double dIdio_dT, dIth_dVdio=0.0, dIrs_dT=0.0, dIth_dVrs=0.0, dIth_dT=0.0;
double dIdioSw_dT=0.0, dIth_dVdioSw=0.0, dIth_dVrssw=0.0, dIrssw_dT=0.0;
double argsw_dT, csat_dT, csatsw_dT;
/* rev-rec */
double cdres;
double vqp;
double capsr, gqcsr, cqcsr;
/* loop through all the diode models */
for( ; model != NULL; model = DIOnextModel(model)) {
@ -262,8 +263,6 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt)
dIdioSw_dT= *(ckt->CKTstate0 + here->DIOdIdioSW_dT);
}
vqp= *(ckt->CKTstate0 + here->DIOqp);
cdres= *(ckt->CKTstate0 + here->DIOresCurrent);
gdres= *(ckt->CKTstate0 + here->DIOresConduct);
cqcsr= *(ckt->CKTstate0 + here->DIOcqcsr);
gqcsr= *(ckt->CKTstate0 + here->DIOgqcsr);
goto load;
@ -521,7 +520,7 @@ next1:
}
cdres = cd;
gdres = gd;
here->DIOgdres = gd;
cqcsr = 0;
gqcsr = 0;
@ -573,7 +572,6 @@ next1:
/*
DIOcap is now equal only to depletion capacitance + overlap capacitance.
Diffusion capacitance is modelled via Qp so there is no clear way to define it.
Situation is similar to the one when we have an NQS model for the charge.
*/
/* Now prepare the charge for the capacitor connected to the QP node */
@ -621,8 +619,6 @@ next1:
*(ckt->CKTstate0 + here->DIOconductSW) = gdsw;
*(ckt->CKTstate0 + here->DIOdIdioSW_dT) = dIdioSw_dT;
}
*(ckt->CKTstate0 + here->DIOresCurrent) = cdres;
*(ckt->CKTstate0 + here->DIOresConduct) = gdres;
*(ckt->CKTstate0 + here->DIOcqcsr) = cqcsr;
*(ckt->CKTstate0 + here->DIOgqcsr) = gqcsr;
#ifdef SENSDEBUG
@ -641,7 +637,6 @@ next1:
*(ckt->CKTstate0 + here->DIOcurrent) = cd;
if (model->DIOresistSWGiven)
*(ckt->CKTstate0 + here->DIOcurrentSW) = cdsw;
*(ckt->CKTstate0 + here->DIOresCurrent) = cdres;
#ifdef SENSDEBUG
printf("storing parameters for transient sensitivity\n"
);
@ -732,8 +727,6 @@ next2: *(ckt->CKTstate0 + here->DIOvoltage) = vd;
*(ckt->CKTstate0 + here->DIOdIdioSW_dT) = dIdioSw_dT;
}
*(ckt->CKTstate0 + here->DIOqp) = vqp;
*(ckt->CKTstate0 + here->DIOresCurrent) = cdres;
*(ckt->CKTstate0 + here->DIOresConduct) = gdres;
*(ckt->CKTstate0 + here->DIOcqcsr) = cqcsr;
*(ckt->CKTstate0 + here->DIOgqcsr) = gqcsr;
if(SenCond) continue;
@ -842,7 +835,7 @@ next2: *(ckt->CKTstate0 + here->DIOvoltage) = vd;
double ceqrrd, geqrrd;
/* QP subcircuit */
fac = here->DIOtTransitTime / model->DIOsoftRevRecParam;
dcrrdvd = fac*gdres;
dcrrdvd = fac*here->DIOgdres;
ceqrr = -fac*cdres + cqcsr + dcrrdvd*vd - gqcsr*vqp;
grr = 1/model->DIOsoftRevRecParam;
*(ckt->CKTrhs + here->DIOqpNode) -= ceqrr;