You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

113 lines
3.3 KiB

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1987 Kanwar Jit Singh
**********/
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "asrcdefs.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"
int asrc_nvals = 0;
double *asrc_vals = NULL;
double *asrc_derivs = NULL;
/* actually load the current voltage value into the
* sparse matrix previously provided
* Evaluate the B-source parse tree (example: exp function):
* ASRCload asrcload.c
* IFeval ifeval.c
* PTeval ifeval.c
* PTexp ptfuncs.c
*/
int
ASRCload(GENmodel *inModel, CKTcircuit *ckt)
{
ASRCmodel *model = (ASRCmodel*) inModel;
ASRCinstance *here;
int i, j;
double rhs;
double difference;
double factor;
for (; model; model = ASRCnextModel(model)) {
for (here = ASRCinstances(model); here; here=ASRCnextInstance(here)) {
difference = (here->ASRCtemp + here->ASRCdtemp) - 300.15;
factor = 1.0
+ here->ASRCtc1 * difference
+ here->ASRCtc2 * difference * difference;
if (here->ASRCreciproctc == 1)
factor = 1 / factor;
/*
* Get the function and its derivatives evaluated
*/
i = here->ASRCtree->numVars;
if (asrc_nvals < i) {
asrc_nvals = i;
asrc_vals = TREALLOC(double, asrc_vals, i);
asrc_derivs = TREALLOC(double, asrc_derivs, i);
}
j = 0;
/*
* Fill the vector of values from the previous solution
*/
for (i = 0; i < here->ASRCtree->numVars; i++)
asrc_vals[i] = ckt->CKTrhsOld[here->ASRCvars[i]];
if (here->ASRCtree->IFeval(here->ASRCtree, ckt->CKTgmin, &rhs, asrc_vals, asrc_derivs) != OK)
return(E_BADPARM);
/* The convergence test */
here->ASRCprev_value = rhs;
/* The ac load precomputation and storage */
if (ckt->CKTmode & MODEINITSMSIG)
for (i = 0; i < here->ASRCtree->numVars; i++)
here->ASRCacValues[i] = asrc_derivs[i];
if (here->ASRCtype == ASRC_VOLTAGE) {
*(here->ASRCposPtr[j++]) += 1.0;
*(here->ASRCposPtr[j++]) -= 1.0;
*(here->ASRCposPtr[j++]) -= 1.0;
*(here->ASRCposPtr[j++]) += 1.0;
for (i = 0; i < here->ASRCtree->numVars; i++) {
rhs -= (asrc_vals[i] * asrc_derivs[i]);
*(here->ASRCposPtr[j++]) -= asrc_derivs[i] * factor;
}
ckt->CKTrhs[here->ASRCbranch] += factor * rhs;
} else {
for (i = 0; i < here->ASRCtree->numVars; i++) {
rhs -= (asrc_vals[i] * asrc_derivs[i]);
*(here->ASRCposPtr[j++]) += asrc_derivs[i] * factor;
*(here->ASRCposPtr[j++]) -= asrc_derivs[i] * factor;
}
ckt->CKTrhs[here->ASRCposNode] -= factor * rhs;
ckt->CKTrhs[here->ASRCnegNode] += factor * rhs;
}
/* Store the rhs for small signal analysis */
if (ckt->CKTmode & MODEINITSMSIG)
here->ASRCacValues[here->ASRCtree->numVars] = factor * rhs;
}
}
return(OK);
}