From 05ee2e0182e47bed9cc4b2ab7b9f491484d36ae3 Mon Sep 17 00:00:00 2001 From: rlar Date: Mon, 2 Jan 2017 19:42:07 +0100 Subject: [PATCH] check for missing and duplicate K instances --- src/spicelib/devices/ind/muttemp.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/ind/muttemp.c b/src/spicelib/devices/ind/muttemp.c index c78f57e04..abe92a2c0 100644 --- a/src/spicelib/devices/ind/muttemp.c +++ b/src/spicelib/devices/ind/muttemp.c @@ -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;) {