1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
/*$Id: e_elem3.cc,v 11.28 96/03/03 23:07:38 al Exp $ -*- C++ -*-
* top level device functions that call the specific one and
* standard device functions to be used where nothing else is needed
*/
#include "ap.h"
#include "m_matrix.h"
#include "e_elemnt.h"
#include "e_aux.h"
#include "u_xprobe.h"
#include "s__.h"
/*--------------------------------------------------------------------------*/
// double ELEMENT::tr_amps()const;
// double ELEMENT::tr_outvolts()const;
// double ELEMENT::tr_involts()const;
// COMPLEX ELEMENT::ac_outvolts()const;
// COMPLEX ELEMENT::ac_involts()const;
// double ELEMENT::probe_tr_num(const char*)const;
// xprobe_t ELEMENT::probe_ac_ext(const char*)const;
/*--------------------------------------------------------------------------*/
double ELEMENT::tr_amps()const
{
return loss * tr_outvolts() + m0.f1 * tr_involts() + m0.c0;
}
/*--------------------------------------------------------------------------*/
double ELEMENT::tr_outvolts()const
{
return n[OUT1].v0() - n[OUT2].v0();
}
/*--------------------------------------------------------------------------*/
double ELEMENT::tr_involts()const
{
if (is2port()){
return n[IN1].v0() - n[IN2].v0();
}else if (is1port()){
return tr_outvolts();
}else if (issource()){
return 0.;
}else{
assert(0);
return 0.;
}
}
/*--------------------------------------------------------------------------*/
COMPLEX ELEMENT::ac_outvolts()const
{
return n[OUT1].vac() - n[OUT2].vac();
}
/*--------------------------------------------------------------------------*/
COMPLEX ELEMENT::ac_involts()const
{
if (is2port()){
return n[IN1].vac() - n[IN2].vac();
}else if (is1port()){
return ac_outvolts();
}else if (issource()){
return 1.;
}else{
assert(0);
return 1.;
}
}
/*--------------------------------------------------------------------------*/
double ELEMENT::probe_tr_num(const char *what)const
{
CS cmd(what);
if (cmd.pmatch("Vo")){
return tr_outvolts();
}else if (cmd.pmatch("VI")){
return tr_involts();
}else if (cmd.pmatch("I")){
return tr_amps();
}else if (cmd.pmatch("P")){
return tr_amps() * tr_outvolts();
}else if (cmd.pmatch("PD")){
double p = tr_amps() * tr_outvolts();
return (p > 0.) ? p : 0.;
}else if (cmd.pmatch("PS")){
double p = tr_amps() * tr_outvolts();
return (p < 0.) ? -p : 0.;
}else if (cmd.pmatch("INput")){
return y0.x;
}else if (cmd.pmatch("F")){
assert(y0.f0 != LINEAR);
return y0.f0;
}else if (cmd.pmatch("NV")){
return val;
}else if (cmd.pmatch("EV")){
return y0.f1;
}else if (cmd.pmatch("Y")){
return m0.f1;
}else if (cmd.pmatch("EIV")){
return m0.x;
}else if (cmd.pmatch("IOFfset")){
return m0.c0;
}else if (cmd.pmatch("IPassive")){
return m0.f1 * tr_involts();
}else if (cmd.pmatch("ILoss")){
return loss * tr_outvolts();
// }else if (cmd.pmatch("DIdt")){
// double i0 = (m0.f1 * m0.x + m0.c0);
// double it1 = (mt1.f1 * mt1.x + mt1.c0);
// return (i0 - it1) / (time0 - time1);
// }else if (cmd.pmatch("DTNew")){
// return timef - time0;
// }else if (cmd.pmatch("DTOld")){
// return time0 - time1;
// }else if (cmd.pmatch("TIMEF")){
// return timef;
// }else if (cmd.pmatch("TIME")){
// return time0;
// }else if (cmd.pmatch("TIMEO")){
// return time1;
}else if (cmd.pmatch("R")){
return (m0.f1!=0.) ? 1/m0.f1 : DBL_MAX;
}else if (cmd.pmatch("Z")){
double parallel = m0.f1; /* hide Borland 3.1 bug */
return port_impedance(n[OUT1], n[OUT2], lu, parallel);
}else if (cmd.pmatch("ZRAW")){
return port_impedance(n[OUT1], n[OUT2], lu, 0.);
}else{
return NOT_VALID;
}
}
/*--------------------------------------------------------------------------*/
xprobe_t ELEMENT::probe_ac_ext(const char *what)const
{
CS cmd(what);
xprobe_t result(0., mtMAG, 20., true);
COMPLEX admittance;
COMPLEX source;
if (issource()){
source = acg;
admittance = 0.;
}else{
source = 0.;
admittance = acg;
}
if (cmd.pmatch("V")){ /* volts */
result.value = ac_outvolts();
}else if (cmd.pmatch("I")){ /* amps */
result.value = ac_involts() * admittance + source + ac_outvolts() * loss;
}else if (cmd.pmatch("P")){ /* complex "power" */
COMPLEX i = ac_involts() * admittance + source + ac_outvolts() * loss;
result.value = ac_outvolts() * conj(i);
result.dbscale = 10.;
result.modifier = mtREAL;
}else if (cmd.pmatch("NV")){ /* nominal value */
result.value = val;
}else if (cmd.pmatch("EV")){ /* effective value */
result.value = ev;
}else if (cmd.pmatch("Y")){ /* admittance */
result.value = admittance;
result.modifier = mtREAL;
}else if (cmd.pmatch("R")){ /* complex "resistance" */
if (admittance == 0.){
result.value = DBL_MAX;
}else{
result.value = 1. / admittance;
}
}else if (cmd.pmatch("Z")){ /* port impedance */
result.value = port_impedance(n[OUT1], n[OUT2], acx, admittance);
}else if (cmd.pmatch("ZRAW")){ /* port impedance, raw */
result.value = port_impedance(n[OUT1], n[OUT2], acx, COMPLEX(0.));
}else{ /* bad parameter */
result.value = COMPLEX(NOT_VALID, NOT_VALID);
result.ok = false;
}
return result;
}
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
|