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.
 
 
 
 
 
 

139 lines
4.7 KiB

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1987 Thomas L. Quarles
**********/
/*
* This routine gives access to the internal device parameters
* of Current Controlled Voltage Source
*/
#include "ngspice.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "ifsim.h"
#include "ccvsdefs.h"
#include "sperror.h"
#include "suffix.h"
/* ARGSUSED */
int
CCVSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
{
CCVSinstance *here = (CCVSinstance*)inst;
double vr;
double vi;
double sr;
double si;
double vm;
static char *msg = "Current and power not available for ac analysis";
switch(which) {
case CCVS_TRANS:
value->rValue = here->CCVScoeff;
return (OK);
case CCVS_CONTROL:
value->uValue = here->CCVScontName;
return (OK);
case CCVS_POS_NODE:
value->iValue = here->CCVSposNode;
return (OK);
case CCVS_NEG_NODE:
value->iValue = here->CCVSnegNode;
return (OK);
case CCVS_BR:
value->iValue = here->CCVSbranch;
return (OK);
case CCVS_CONT_BR:
value->iValue = here->CCVScontBranch;
return (OK);
case CCVS_CURRENT :
if (ckt->CKTcurrentAnalysis & DOING_AC) {
errMsg = MALLOC(strlen(msg)+1);
errRtn = "CCVSask";
strcpy(errMsg,msg);
return(E_ASKCURRENT);
} else {
value->rValue = *(ckt->CKTrhsOld+here->CCVSbranch);
}
return(OK);
case CCVS_VOLTS :
value->rValue = (*(ckt->CKTrhsOld + here->CCVSposNode) -
*(ckt->CKTrhsOld + here->CCVSnegNode));
return(OK);
case CCVS_POWER :
if (ckt->CKTcurrentAnalysis & DOING_AC) {
errMsg = MALLOC(strlen(msg)+1);
errRtn = "CCVSask";
strcpy(errMsg,msg);
return(E_ASKPOWER);
} else {
value->rValue = *(ckt->CKTrhsOld + here->CCVSbranch)
* (*(ckt->CKTrhsOld + here->CCVSposNode) -
*(ckt->CKTrhsOld + here->CCVSnegNode));
}
return(OK);
case CCVS_QUEST_SENS_DC:
if(ckt->CKTsenInfo){
value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+
here->CCVSsenParmNo);
}
return(OK);
case CCVS_QUEST_SENS_REAL:
if(ckt->CKTsenInfo){
value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->CCVSsenParmNo);
}
return(OK);
case CCVS_QUEST_SENS_IMAG:
if(ckt->CKTsenInfo){
value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->CCVSsenParmNo);
}
return(OK);
case CCVS_QUEST_SENS_MAG:
if(ckt->CKTsenInfo){
vr = *(ckt->CKTrhsOld + select->iValue + 1);
vi = *(ckt->CKTirhsOld + select->iValue + 1);
vm = sqrt(vr*vr + vi*vi);
if(vm == 0){
value->rValue = 0;
return(OK);
}
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->CCVSsenParmNo);
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->CCVSsenParmNo);
value->rValue = (vr * sr + vi * si)/vm;
}
return(OK);
case CCVS_QUEST_SENS_PH:
if(ckt->CKTsenInfo){
vr = *(ckt->CKTrhsOld + select->iValue + 1);
vi = *(ckt->CKTirhsOld + select->iValue + 1);
vm = vr*vr + vi*vi;
if(vm == 0){
value->rValue = 0;
return(OK);
}
sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->CCVSsenParmNo);
si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->CCVSsenParmNo);
value->rValue = (vr * si - vi * sr)/vm;
}
return(OK);
case CCVS_QUEST_SENS_CPLX:
if(ckt->CKTsenInfo){
value->cValue.real=
*(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+
here->CCVSsenParmNo);
value->cValue.imag=
*(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+
here->CCVSsenParmNo);
}
return(OK);
default:
return (E_BADPARM);
}
/* NOTREACHED */
}