ngspice/src/spicelib/analysis/psssetp.c

84 lines
2.1 KiB
C

/**********
Author: 2010-05 Stefano Perticaroli ``spertica''
**********/
#include "ngspice/ngspice.h"
#include "ngspice/ifsim.h"
#include "ngspice/iferrmsg.h"
#include "ngspice/cktdefs.h"
#include "ngspice/pssdefs.h"
#include "analysis.h"
/* ARGSUSED */
int
PSSsetParm(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value)
{
PSSan *job = (PSSan *) anal;
NG_IGNORE(ckt);
switch(which) {
case GUESSED_FREQ:
job->PSSguessedFreq = value->rValue;
break;
case OSC_NODE:
job->PSSoscNode = value->nValue;
break;
case STAB_TIME:
job->PSSstabTime = value->rValue;
break;
case PSS_POINTS:
job->PSSpoints = value->iValue;
break;
case PSS_HARMS:
job->PSSharms = value->iValue;
break;
case PSS_UIC:
if(value->iValue) {
job->PSSmode |= MODEUIC;
}
break;
case SC_ITER:
job->sc_iter = value->iValue;
break;
case STEADY_COEFF:
job->steady_coeff = value->rValue;
break;
default:
return(E_BADPARM);
}
return(OK);
}
static IFparm PSSparms[] = {
{ "fguess", GUESSED_FREQ, IF_SET|IF_REAL, "guessed frequency" },
{ "oscnode", OSC_NODE, IF_SET|IF_STRING, "oscillation node" },
{ "stabtime", STAB_TIME, IF_SET|IF_REAL, "stabilization time" },
{ "points", PSS_POINTS, IF_SET|IF_INTEGER, "pick equispaced number of time points in PSS" },
{ "harmonics", PSS_HARMS, IF_SET|IF_INTEGER, "consider only given number of harmonics in PSS from DC" },
{ "uic", PSS_UIC, IF_SET|IF_INTEGER, "use initial conditions (1 true - 0 false)" },
{ "sc_iter", SC_ITER, IF_SET|IF_INTEGER, "maxmimum number of shooting cycle iterations" },
{ "steady_coeff", STEADY_COEFF, IF_SET|IF_INTEGER, "set steady coefficient for convergence test" }
};
SPICEanalysis PSSinfo = {
{
"PSS",
"Periodic Steady State analysis",
sizeof(PSSparms)/sizeof(IFparm),
PSSparms
},
sizeof(PSSan),
TIMEDOMAIN,
1,
PSSsetParm,
PSSaskQuest,
PSSinit,
DCpss
};