Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Modified: September 2003 Paolo Nenzi
**********/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "capdefs.h"
#include "ngspice/trandefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int
CAPload(GENmodel *inModel, CKTcircuit *ckt)
* sparse matrix previously provided
*/
{
CAPmodel *model = (CAPmodel*)inModel;
CAPinstance *here;
int cond1;
double vcap;
double geq;
double ceq;
int error;
double m;
if(ckt->CKTmode & (MODETRAN|MODEAC|MODETRANOP) ) {
cond1=
( ( (ckt->CKTmode & MODEDC) &&
(ckt->CKTmode & MODEINITJCT) )
|| ( ( ckt->CKTmode & MODEUIC) &&
( ckt->CKTmode & MODEINITTRAN) ) ) ;
for( ; model != NULL; model = CAPnextModel(model)) {
for (here = CAPinstances(model); here != NULL ;
here=CAPnextInstance(here)) {
m = here->CAPm;
if(cond1) {
vcap = here->CAPinitCond;
} else {
vcap = *(ckt->CKTrhsOld+here->CAPposNode) -
*(ckt->CKTrhsOld+here->CAPnegNode) ;
}
if(ckt->CKTmode & (MODETRAN | MODEAC)) {
#ifndef PREDICTOR
if(ckt->CKTmode & MODEINITPRED) {
*(ckt->CKTstate0+here->CAPqcap) =
*(ckt->CKTstate1+here->CAPqcap);
} else {
#endif
*(ckt->CKTstate0+here->CAPqcap) = here->CAPcapac * vcap;
if((ckt->CKTmode & MODEINITTRAN)) {
*(ckt->CKTstate1+here->CAPqcap) =
*(ckt->CKTstate0+here->CAPqcap);
}
#ifndef PREDICTOR
}
#endif
error = NIintegrate(ckt,&geq,&ceq,here->CAPcapac,
here->CAPqcap);
if(error) return(error);
if(ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1+here->CAPccap) =
*(ckt->CKTstate0+here->CAPccap);
}
*(here->CAPposPosPtr) += m * geq;
*(here->CAPnegNegPtr) += m * geq;
*(here->CAPposNegPtr) -= m * geq;
*(here->CAPnegPosPtr) -= m * geq;
*(ckt->CKTrhs+here->CAPposNode) -= m * ceq;
*(ckt->CKTrhs+here->CAPnegNode) += m * ceq;
} else
*(ckt->CKTstate0+here->CAPqcap) = here->CAPcapac * vcap;
}
}
}
return(OK);
}