Add optional series resistance or junction capacitance, if non

is defined in the .model statement. This may help achieving
convergence if subcircut models of opamps etc use simple diodes
as voltage limiters. Example call:
.options diode_cj0=20p diode_rser=20m
This commit is contained in:
Holger Vogt 2024-09-23 12:34:17 +02:00
parent b14420803a
commit 6ec6e1c723
1 changed files with 19 additions and 4 deletions

View File

@ -79,7 +79,20 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
model->DIOtranTimeTemp2 = 0.0;
}
if(!model->DIOjunctionCapGiven) {
model->DIOjunctionCap = 0;
if (newcompat.ps || newcompat.lt) {
double cdiode = 0.;
/* to improve convergence (sometimes) */
if (cp_getvar("diode_cj0", CP_REAL, &cdiode, 0) && cdiode > 0) {
model->DIOjunctionCap = cdiode;
if (ft_ngdebug)
fprintf(stderr, "Diode junction capacitance in model %s set to %e F\n", model->gen.GENmodName, cdiode);
}
else
model->DIOjunctionCap = 0.0;
}
else {
model->DIOjunctionCap = 0.0;
}
}
if(!model->DIOjunctionSWCapGiven) {
model->DIOjunctionSWCap = 0;
@ -210,10 +223,12 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if((!model->DIOresistGiven) || (model->DIOresist==0)) {
if (newcompat.ps || newcompat.lt) {
double rsdiode = 0.;
if (cp_getvar("rsdiode", CP_REAL, &rsdiode, 0) && rsdiode > 0) {
model->DIOconductance = 1./rsdiode; /* sometimes improves convergence */
/* to improve convergence (sometimes) */
if (cp_getvar("diode_rser", CP_REAL, &rsdiode, 0) && rsdiode > 0) {
model->DIOconductance = 1./rsdiode;
model->DIOresist = rsdiode;
if (ft_ngdebug)
fprintf(stderr, "Diode series resistance in model %s set to 100 microOhm\n", model->gen.GENmodName);
fprintf(stderr, "Diode series resistance in model %s set to %e Ohm\n", model->gen.GENmodName, rsdiode);
}
else
model->DIOconductance = 0.0;