check for missing and duplicate K instances

This commit is contained in:
rlar 2017-01-02 19:42:07 +01:00
parent 13decee3ed
commit 05ee2e0182
1 changed files with 20 additions and 2 deletions

View File

@ -125,6 +125,7 @@ MUTtemp(GENmodel *inModel, CKTcircuit *ckt)
if (sz < system->size)
sz = system->size;
char *pop = TMALLOC(char, sz * sz);
double *INDmatrix = TMALLOC(double, sz * sz);
for (system = first_system; system; system = system->next_system) {
@ -135,6 +136,7 @@ MUTtemp(GENmodel *inModel, CKTcircuit *ckt)
sz = system->size;
memset(pop, 0, (size_t)(sz*sz));
memset(INDmatrix, 0, (size_t)(sz*sz) * sizeof(double));
INDinstance *ind = system->first_ind;
@ -144,9 +146,19 @@ MUTtemp(GENmodel *inModel, CKTcircuit *ckt)
}
MUTinstance *mut = system->first_mut;
int expect = (sz*sz - sz) / 2;
int repetitions = 0;
for (; mut; mut = mut->system_next_mut) {
int j = mut->MUTind1->system_idx;
int k = mut->MUTind2->system_idx;
if (j < k)
SWAP(int, j, k);
if (pop[j*sz + k]) {
repetitions ++;
} else {
pop[j*sz + k] = 1;
expect --;
}
INDmatrix [j * sz + k] = INDmatrix [k * sz + j] = mut->MUTfactor;
}
@ -167,7 +179,7 @@ MUTtemp(GENmodel *inModel, CKTcircuit *ckt)
}
}
if (!positive) {
if (!positive || repetitions || expect) {
fprintf(stderr, "The Inductive System consisting of\n");
for (ind = system->first_ind; ind; ind = ind->system_next_ind)
fprintf(stderr, " %s", ind->INDname);
@ -175,17 +187,23 @@ MUTtemp(GENmodel *inModel, CKTcircuit *ckt)
for (mut = system->first_mut; mut; mut = mut->system_next_mut)
fprintf(stderr, " %s", mut->MUTname);
fprintf(stderr, "\n");
fprintf(stderr, "is not positive definite\n");
if (!positive)
fprintf(stderr, "is not positive definite\n");
for (mut = system->first_mut; mut; mut = mut->system_next_mut)
if (fabs(mut->MUTcoupling) > 1.0)
fprintf(stderr, " |%s| > 1\n", mut->MUTname);
for (ind = system->first_ind; ind; ind = ind->system_next_ind)
if (ind->INDinduct < 0)
fprintf(stderr, " %s < 0\n", ind->INDname);
if (repetitions)
fprintf(stderr, "has dupplicate K instances\n");
if (expect)
fprintf(stderr, "has an incomplete set of K couplings, (missing ones are implicitly 0)\n");
fprintf(stderr, "\n");
}
}
tfree(pop);
tfree(INDmatrix);
for (system = first_system; system;) {