29 #include "component.h"
38 eqndefined::eqndefined () :
circuit () {
40 setVariableSized (
true);
53 if (veqn) free (veqn);
54 if (ieqn) free (ieqn);
55 if (geqn) free (geqn);
56 if (qeqn) free (qeqn);
57 if (ceqn) free (ceqn);
58 if (_jstat) free (_jstat);
59 if (_jdyna) free (_jdyna);
60 if (_charges) free (_charges);
66 if (ieqn == NULL) initModel ();
71 #define A(a) ((assignment *) (a))
72 #define C(c) ((constant *) (c))
73 #define BP(n) real (getV (n * 2 + 0) - getV (n * 2 + 1))
76 char * eqndefined::createVariable (
const char * base,
int n,
bool pfx) {
82 char * txt = (
char *) malloc (strlen (str) + strlen (base) + 3);
84 sprintf (txt,
"%s.%s%d", str, base, n);
86 sprintf (txt,
"%s%d", base, n);
91 char * eqndefined::createVariable (
const char * base,
int r,
int c,
bool pfx) {
97 char * txt = (
char *) malloc (strlen (str) + strlen (base) + 4);
99 sprintf (txt,
"%s.%s%d%d", str, base, r, c);
101 sprintf (txt,
"%s%d%d", base, r, c);
106 void eqndefined::setResult (
void *
eqn, nr_double_t val) {
108 constant * c =
A(eqn)->getResult ();
113 nr_double_t eqndefined::getResult (
void * eqn) {
115 return A(eqn)->getResultDouble ();
119 void eqndefined::initModel (
void) {
120 int i, j, k, branches =
getSize () / 2;
121 char * in, * qn, * vn, * gn, * cn, * vnold, * inold;
125 veqn = (
void **) malloc (
sizeof (assignment *) * branches);
126 ieqn = (
void **) malloc (
sizeof (assignment *) * branches);
127 geqn = (
void **) malloc (
sizeof (assignment *) * branches * branches);
128 qeqn = (
void **) malloc (
sizeof (assignment *) * branches);
129 ceqn = (
void **) malloc (
sizeof (assignment *) * branches * branches);
132 _jstat = (nr_double_t *) malloc (
sizeof (nr_double_t) * branches * branches);
133 _jdyna = (nr_double_t *) malloc (
sizeof (nr_double_t) * branches * branches);
134 _charges = (nr_double_t *) malloc (
sizeof (nr_double_t) * branches);
137 for (i = 0; i < branches; i++) {
138 vn = createVariable (
"V", i + 1);
139 if ((veqn[i] =
getEnv()->getChecker()->findEquation (vn)) == NULL) {
141 A(veqn[i])->evalType ();
142 A(veqn[i])->skip = 1;
148 for (i = 0; i < branches; i++) {
151 in = createVariable (
"I", i + 1);
157 qn = createVariable (
"Q", i + 1);
167 for (j = 0; j < branches; j++) {
168 in = createVariable (
"I", j + 1);
169 inold = createVariable (
"I", j + 1,
false);
170 vn = createVariable (
"V", j + 1);
171 vnold = createVariable (
"V", j + 1,
false);
180 free (vnold); free (vn);
181 free (inold); free (in);
190 for (i = 0; i < branches; i++) {
191 if (ieqn[i]) {
A(ieqn[i])->evalType ();
A(ieqn[i])->skip = 1; }
192 if (qeqn[i]) {
A(qeqn[i])->evalType ();
A(qeqn[i])->skip = 1; }
196 for (k = 0, i = 0; i < branches; i++) {
200 for (j = 0; j < branches; j++, k++) {
201 vn = createVariable (
"V", j + 1);
205 gn = createVariable (
"G", i + 1, j + 1);
206 if ((geqn[k] =
getEnv()->getChecker()->findEquation (gn)) == NULL) {
212 A(diff)->rename (gn);
226 for (k = 0, i = 0; i < branches; i++) {
230 for (j = 0; j < branches; j++, k++) {
231 vn = createVariable (
"V", j + 1);
235 cn = createVariable (
"C", i + 1, j + 1);
236 if ((ceqn[k] =
getEnv()->getChecker()->findEquation (cn)) == NULL) {
241 A(diff)->rename (cn);
244 for (
int l = 0; l < branches; l++) {
245 in = createVariable (
"I", l + 1);
247 A(diff)->mul (
A(geqn[l * branches + j]));
248 A(ceqn[k])->add (
A(diff));
252 A(ceqn[k])->evalType ();
253 A(ceqn[k])->skip = 1;
268 void eqndefined::updateLocals (
void) {
272 for (i = 0; i < branches; i++) {
273 setResult (veqn[i],
BP (i));
282 int i, j, k, branches =
getSize () / 2;
288 for (i = 0; i < branches; i++) {
289 nr_double_t c = getResult (ieqn[i]);
290 setI (i * 2 + 0, -c);
291 setI (i * 2 + 1, +c);
295 for (k = 0, i = 0; i < branches; i++) {
298 for (j = 0; j < branches; j++, k++) {
299 nr_double_t g = getResult (geqn[k]);
300 setY (i * 2 + 0, j * 2 + 0, +g);
301 setY (i * 2 + 1, j * 2 + 1, +g);
302 setY (i * 2 + 0, j * 2 + 1, -g);
303 setY (i * 2 + 1, j * 2 + 0, -g);
308 setGV (i * 2 + 0, +gv);
309 setGV (i * 2 + 1, -gv);
313 addI (i * 2 + 0, +gv);
314 addI (i * 2 + 1, -gv);
320 void eqndefined::evalOperatingPoints (
void) {
321 int i, j, k, branches =
getSize () / 2;
324 for (k = 0, i = 0; i < branches; i++) {
325 nr_double_t q = getResult (qeqn[i]);
327 for (j = 0; j < branches; j++, k++) {
328 nr_double_t g = getResult (geqn[k]);
330 nr_double_t c = getResult (ceqn[k]);
343 evalOperatingPoints ();
358 matrix eqndefined::calcMatrixY (nr_double_t frequency) {
359 int i, j, k, branches =
getSize () / 2;
361 nr_double_t o = 2 *
M_PI * frequency;
364 for (k = 0, i = 0; i < branches; i++) {
365 for (j = 0; j < branches; j++, k++) {
369 y (r + 0, c + 0) = +val;
370 y (r + 1, c + 1) = +val;
371 y (r + 0, c + 1) = -val;
372 y (r + 1, c + 0) = -val;
388 int state,
i, j, k, branches =
getSize () / 2;
394 evalOperatingPoints ();
397 for (i = 0; i < branches; i++) {
404 for (k = 0, i = 0; i < branches; i++) {
405 for (j = 0; j < branches; j++, k++) {
408 nr_double_t v =
BP (j);
428 if (ieqn == NULL) initModel ();
434 int i, j, k, branches =
getSize () / 2;
440 evalOperatingPoints ();
443 for (i = 0; i < branches; i++) {
444 setQ (i * 2 + 0, -_charges[i]);
445 setQ (i * 2 + 1, +_charges[i]);
449 for (k = 0, i = 0; i < branches; i++) {
451 for (j = 0; j < branches; j++, k++) {
454 nr_double_t val = _jdyna[k];
455 setQV (r + 0, c + 0, +val);
456 setQV (r + 1, c + 1, +val);
457 setQV (r + 0, c + 1, -val);
458 setQV (r + 1, c + 0, -val);
461 setCV (i * 2 + 0, +cv);
462 setCV (i * 2 + 1, -cv);