171 lines
6.2 KiB
C
171 lines
6.2 KiB
C
/**********
|
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
|
Author: 1985 Thomas L. Quarles
|
|
|
|
This function is obsolete (was used by an old sensitivity analysis)
|
|
**********/
|
|
|
|
/* actually load the current ac sensitivity
|
|
* information into the array previously provided
|
|
*/
|
|
|
|
#include "ngspice/ngspice.h"
|
|
#include "ngspice/smpdefs.h"
|
|
#include "ngspice/cktdefs.h"
|
|
#include "inddefs.h"
|
|
#include "ngspice/sperror.h"
|
|
#include "ngspice/suffix.h"
|
|
|
|
int
|
|
INDsAcLoad(GENmodel *inModel, CKTcircuit *ckt)
|
|
{
|
|
INDmodel *model = (INDmodel*)inModel;
|
|
INDinstance *here;
|
|
double cind,icind,val,ival;
|
|
#ifdef MUTUAL
|
|
MUTinstance *muthere;
|
|
MUTmodel *mutmodel;
|
|
double cind1;
|
|
double icind1;
|
|
double cind2;
|
|
double icind2;
|
|
double val11;
|
|
double ival11;
|
|
double val12;
|
|
double ival12;
|
|
double val13;
|
|
double ival13;
|
|
double val21;
|
|
double ival21;
|
|
double val22;
|
|
double ival22;
|
|
double val23;
|
|
double ival23;
|
|
double rootl1;
|
|
double rootl2;
|
|
double w;
|
|
double k1;
|
|
double k2;
|
|
int ktype;
|
|
int itype;
|
|
#endif
|
|
SENstruct *info;
|
|
|
|
info = ckt->CKTsenInfo;
|
|
/* loop through all the inductor models */
|
|
for( ; model != NULL; model = model->INDnextModel ) {
|
|
|
|
/* loop through all the instances of the model */
|
|
for (here = model->INDinstances; here != NULL ;
|
|
here=here->INDnextInstance) {
|
|
|
|
#ifdef MUTUAL
|
|
}
|
|
}
|
|
ktype = CKTtypelook("mutual");
|
|
mutmodel = (MUTmodel *)(ckt->CKThead[ktype]);
|
|
/* loop through all the mutual inductor models */
|
|
for( ; mutmodel != NULL; mutmodel = mutmodel->MUTnextModel ) {
|
|
|
|
/* loop through all the instances of the model */
|
|
for (muthere = mutmodel->MUTinstances; muthere != NULL ;
|
|
muthere=muthere->MUTnextInstance) {
|
|
|
|
if(muthere->MUTsenParmNo ||
|
|
muthere->MUTind1->INDsenParmNo ||
|
|
muthere->MUTind2->INDsenParmNo){
|
|
|
|
cind1 = *(ckt->CKTrhsOld + muthere->MUTind1->INDbrEq);
|
|
icind1 = *(ckt->CKTirhsOld + muthere->MUTind1->INDbrEq);
|
|
cind2 = *(ckt->CKTrhsOld + muthere->MUTind2->INDbrEq);
|
|
icind2 = *(ckt->CKTirhsOld + muthere->MUTind2->INDbrEq);
|
|
rootl1 = sqrt(muthere->MUTind1->INDinduct) ;
|
|
rootl2 = sqrt(muthere->MUTind2->INDinduct) ;
|
|
k1 = 0.5 * muthere->MUTcoupling * rootl2 / rootl1 ;
|
|
k2 = 0.5 * muthere->MUTcoupling * rootl1 / rootl2 ;
|
|
w = ckt->CKTomega ;
|
|
|
|
/* load the RHS matrix */
|
|
|
|
if(muthere->MUTind1->INDsenParmNo){
|
|
val11 = - (w * (k1 * icind2));
|
|
ival11 = w * (k1 * cind2);
|
|
val21 = - ( w * k1 * icind1) ;
|
|
ival21 = w * k1 * cind1 ;
|
|
*(info->SEN_RHS[muthere->MUTind1->INDbrEq] +
|
|
muthere->MUTind1->INDsenParmNo) += val11;
|
|
*(info->SEN_iRHS[muthere->MUTind1->INDbrEq] +
|
|
muthere->MUTind1->INDsenParmNo) += ival11;
|
|
*(info->SEN_RHS[muthere->MUTind2->INDbrEq] +
|
|
muthere->MUTind1->INDsenParmNo) += val21;
|
|
*(info->SEN_iRHS[muthere->MUTind2->INDbrEq] +
|
|
muthere->MUTind1->INDsenParmNo) += ival21;
|
|
}
|
|
|
|
if(muthere->MUTind2->INDsenParmNo){
|
|
val12 = -( w * k2 * icind2) ;
|
|
ival12 = w * k2 * cind2 ;
|
|
val22 = - (w * ( k2 * icind1));
|
|
ival22 = w * ( k2 * cind1);
|
|
*(info->SEN_RHS[muthere->MUTind1->INDbrEq] +
|
|
muthere->MUTind2->INDsenParmNo) += val12;
|
|
*(info->SEN_iRHS[muthere->MUTind1->INDbrEq] +
|
|
muthere->MUTind2->INDsenParmNo) += ival12;
|
|
*(info->SEN_RHS[muthere->MUTind2->INDbrEq] +
|
|
muthere->MUTind2->INDsenParmNo) += val22;
|
|
*(info->SEN_iRHS[muthere->MUTind2->INDbrEq] +
|
|
muthere->MUTind2->INDsenParmNo) += ival22;
|
|
}
|
|
|
|
if(muthere->MUTsenParmNo){
|
|
val13 = - w * rootl1 * rootl2 * icind2;
|
|
ival13 = w * rootl1 * rootl2 * cind2;
|
|
val23 = - (w * rootl1 * rootl2 * icind1);
|
|
ival23 = w * rootl1 * rootl2 * cind1;
|
|
*(info->SEN_RHS[muthere->MUTind1->INDbrEq] +
|
|
muthere->MUTsenParmNo) += val13;
|
|
*(info->SEN_iRHS[muthere->MUTind1->INDbrEq] +
|
|
muthere->MUTsenParmNo) += ival13;
|
|
*(info->SEN_RHS[muthere->MUTind2->INDbrEq] +
|
|
muthere->MUTsenParmNo) += val23;
|
|
*(info->SEN_iRHS[muthere->MUTind2->INDbrEq] +
|
|
muthere->MUTsenParmNo) += ival23;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
itype = CKTtypelook("Inductor");
|
|
model = (INDmodel *)(ckt->CKThead[itype]);
|
|
/* loop through all the inductor models */
|
|
for( ; model != NULL; model = model->INDnextModel ) {
|
|
|
|
/* loop through all the instances of the model */
|
|
for (here = model->INDinstances; here != NULL ;
|
|
here=here->INDnextInstance) {
|
|
#endif /* MUTUAL */
|
|
if(here->INDsenParmNo){
|
|
cind = *(ckt->CKTrhsOld + here->INDbrEq);
|
|
icind = *(ckt->CKTirhsOld + here->INDbrEq);
|
|
val = icind * ckt->CKTomega ;
|
|
ival = cind * ckt->CKTomega ;
|
|
|
|
#ifdef SENSDEBUG
|
|
fprintf(stdout,"cind = %.5e,icind = %.5e\n",cind,icind);
|
|
fprintf(stdout,"val = %.5e,ival = %.5e\n",val,ival);
|
|
fprintf(stdout,"brEq = %.5e,senparmno = %.5e\n",
|
|
here->INDbrEq,here->INDsenParmNo);
|
|
#endif /* SENSDEBUG */
|
|
|
|
/* load the RHS matrix */
|
|
|
|
*(info->SEN_RHS[here->INDbrEq] + here->INDsenParmNo)
|
|
-= val;
|
|
*(info->SEN_iRHS[here->INDbrEq] + here->INDsenParmNo)
|
|
+= ival;
|
|
}
|
|
}
|
|
}
|
|
return(OK);
|
|
}
|
|
|