ngspice/src/spicelib/devices/cap/capsupd.c

87 lines
2.4 KiB
C

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Modified: September 2003 Paolo Nenzi
**********/
/*
*/
/* update the charge sensitivities and their derivatives */
#include "ngspice.h"
#include "cktdefs.h"
#include "capdefs.h"
#include "trandefs.h"
#include "sperror.h"
#include "suffix.h"
int
CAPsUpdate(GENmodel *inModel, CKTcircuit *ckt)
{
CAPmodel *model = (CAPmodel*)inModel;
CAPinstance *here;
int iparmno;
double s1;
double s2;
double sxp;
double vcap;
double dummy1;
double dummy2;
SENstruct *info;
info = ckt->CKTsenInfo;
if((info->SENmode == TRANSEN) && (ckt->CKTmode & MODEINITTRAN))
return(OK);
#ifdef SENSDEBUG
printf("CAPsenUpdate\n");
printf("CKTtime = %.5e\n",ckt->CKTtime);
#endif /* SENSDEBUG */
/* loop through all the capacitor models */
for( ; model != NULL; model = model->CAPnextModel ) {
/* loop through all the instances of the model */
for (here = model->CAPinstances; here != NULL ;
here=here->CAPnextInstance) {
if (here->CAPowner != ARCHme) continue;
vcap = *(ckt->CKTrhsOld+here->CAPposNode) -
*(ckt->CKTrhsOld+here->CAPnegNode) ;
for(iparmno=1;iparmno<=info->SENparms;iparmno++){
s1 = *(info->SEN_Sap[here->CAPposNode] + iparmno);
s2 = *(info->SEN_Sap[here->CAPnegNode] + iparmno);
sxp = here->CAPcapac * (s1 - s2);
if(iparmno == here->CAPsenParmNo) sxp += vcap;
*(ckt->CKTstate0 + here->CAPsensxp + 2*(iparmno - 1)) = sxp;
if(ckt->CKTtime == 0){
*(ckt->CKTstate0 + here->CAPsensxp + 2*(iparmno - 1) + 1)=0;
}
else{
NIintegrate(ckt,&dummy1,&dummy2,here->CAPcapac,
(here->CAPsensxp + 2 * (iparmno -1 )));
}
#ifdef SENSDEBUG
printf("after loading\n");
printf("iparmno = %d\n",iparmno);
printf("s1 = %.7e,s2 = %.7e\n",s1,s2);
printf("sxp = %.7e,sdotxp = %.7e\n",
sxp,*(ckt->CKTstate0 + here->CAPsensxp +
2*(iparmno - 1) + 1));
printf("\n");
#endif /* SENSDEBUG */
}
}
}
return(OK);
}