diff --git a/src/spicelib/devices/nbjt2/Makefile.am b/src/spicelib/devices/nbjt2/Makefile.am index 08ed45a07..9386b53e0 100644 --- a/src/spicelib/devices/nbjt2/Makefile.am +++ b/src/spicelib/devices/nbjt2/Makefile.am @@ -24,6 +24,17 @@ libnbjt2_la_SOURCES = \ nbt2trun.c +if KLU_WANTED +libnbjt2_la_SOURCES += nbjt2bindCSC.c +endif + +if SuperLU_WANTED +libnbjt2_la_SOURCES += nbjt2bindCSC.c +endif + +if UMFPACK_WANTED +libnbjt2_la_SOURCES += nbjt2bindCSC.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/nbjt2/nbjt2bindCSC.c b/src/spicelib/devices/nbjt2/nbjt2bindCSC.c new file mode 100644 index 000000000..0b635ed67 --- /dev/null +++ b/src/spicelib/devices/nbjt2/nbjt2bindCSC.c @@ -0,0 +1,211 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "nbjt2def.h" +#include "ngspice/sperror.h" + +#include + +static +int +BindCompare (const void *a, const void *b) +{ + BindElement *A, *B ; + A = (BindElement *)a ; + B = (BindElement *)b ; + + return ((int)(A->Sparse - B->Sparse)) ; +} + +int +NBJT2bindCSC (GENmodel *inModel, CKTcircuit *ckt) +{ + NBJT2model *model = (NBJT2model *)inModel ; + NBJT2instance *here ; + double *i ; + BindElement *matched, *BindStruct ; + size_t nz ; + + BindStruct = ckt->CKTmatrix->CKTbindStruct ; + nz = (size_t)ckt->CKTmatrix->CKTklunz ; + + /* loop through all the NBJT2 models */ + for ( ; model != NULL ; model = model->NBJT2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->NBJT2instances ; here != NULL ; here = here->NBJT2nextInstance) + { + if ((here-> NBJT2colNode != 0) && (here-> NBJT2colNode != 0)) + { + i = here->NBJT2colColPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->NBJT2colColStructPtr = matched ; + here->NBJT2colColPtr = matched->CSC ; + } + + if ((here-> NBJT2colNode != 0) && (here-> NBJT2baseNode != 0)) + { + i = here->NBJT2colBasePtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->NBJT2colBaseStructPtr = matched ; + here->NBJT2colBasePtr = matched->CSC ; + } + + if ((here-> NBJT2colNode != 0) && (here-> NBJT2emitNode != 0)) + { + i = here->NBJT2colEmitPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->NBJT2colEmitStructPtr = matched ; + here->NBJT2colEmitPtr = matched->CSC ; + } + + if ((here-> NBJT2baseNode != 0) && (here-> NBJT2colNode != 0)) + { + i = here->NBJT2baseColPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->NBJT2baseColStructPtr = matched ; + here->NBJT2baseColPtr = matched->CSC ; + } + + if ((here-> NBJT2baseNode != 0) && (here-> NBJT2baseNode != 0)) + { + i = here->NBJT2baseBasePtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->NBJT2baseBaseStructPtr = matched ; + here->NBJT2baseBasePtr = matched->CSC ; + } + + if ((here-> NBJT2baseNode != 0) && (here-> NBJT2emitNode != 0)) + { + i = here->NBJT2baseEmitPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->NBJT2baseEmitStructPtr = matched ; + here->NBJT2baseEmitPtr = matched->CSC ; + } + + if ((here-> NBJT2emitNode != 0) && (here-> NBJT2colNode != 0)) + { + i = here->NBJT2emitColPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->NBJT2emitColStructPtr = matched ; + here->NBJT2emitColPtr = matched->CSC ; + } + + if ((here-> NBJT2emitNode != 0) && (here-> NBJT2baseNode != 0)) + { + i = here->NBJT2emitBasePtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->NBJT2emitBaseStructPtr = matched ; + here->NBJT2emitBasePtr = matched->CSC ; + } + + if ((here-> NBJT2emitNode != 0) && (here-> NBJT2emitNode != 0)) + { + i = here->NBJT2emitEmitPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->NBJT2emitEmitStructPtr = matched ; + here->NBJT2emitEmitPtr = matched->CSC ; + } + + } + } + + return (OK) ; +} + +int +NBJT2bindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) +{ + NBJT2model *model = (NBJT2model *)inModel ; + NBJT2instance *here ; + + NG_IGNORE (ckt) ; + + /* loop through all the NBJT2 models */ + for ( ; model != NULL ; model = model->NBJT2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->NBJT2instances ; here != NULL ; here = here->NBJT2nextInstance) + { + if ((here-> NBJT2colNode != 0) && (here-> NBJT2colNode != 0)) + here->NBJT2colColPtr = here->NBJT2colColStructPtr->CSC_Complex ; + + if ((here-> NBJT2colNode != 0) && (here-> NBJT2baseNode != 0)) + here->NBJT2colBasePtr = here->NBJT2colBaseStructPtr->CSC_Complex ; + + if ((here-> NBJT2colNode != 0) && (here-> NBJT2emitNode != 0)) + here->NBJT2colEmitPtr = here->NBJT2colEmitStructPtr->CSC_Complex ; + + if ((here-> NBJT2baseNode != 0) && (here-> NBJT2colNode != 0)) + here->NBJT2baseColPtr = here->NBJT2baseColStructPtr->CSC_Complex ; + + if ((here-> NBJT2baseNode != 0) && (here-> NBJT2baseNode != 0)) + here->NBJT2baseBasePtr = here->NBJT2baseBaseStructPtr->CSC_Complex ; + + if ((here-> NBJT2baseNode != 0) && (here-> NBJT2emitNode != 0)) + here->NBJT2baseEmitPtr = here->NBJT2baseEmitStructPtr->CSC_Complex ; + + if ((here-> NBJT2emitNode != 0) && (here-> NBJT2colNode != 0)) + here->NBJT2emitColPtr = here->NBJT2emitColStructPtr->CSC_Complex ; + + if ((here-> NBJT2emitNode != 0) && (here-> NBJT2baseNode != 0)) + here->NBJT2emitBasePtr = here->NBJT2emitBaseStructPtr->CSC_Complex ; + + if ((here-> NBJT2emitNode != 0) && (here-> NBJT2emitNode != 0)) + here->NBJT2emitEmitPtr = here->NBJT2emitEmitStructPtr->CSC_Complex ; + + } + } + + return (OK) ; +} + +int +NBJT2bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + NBJT2model *model = (NBJT2model *)inModel ; + NBJT2instance *here ; + + NG_IGNORE (ckt) ; + + /* loop through all the NBJT2 models */ + for ( ; model != NULL ; model = model->NBJT2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->NBJT2instances ; here != NULL ; here = here->NBJT2nextInstance) + { + if ((here-> NBJT2colNode != 0) && (here-> NBJT2colNode != 0)) + here->NBJT2colColPtr = here->NBJT2colColStructPtr->CSC ; + + if ((here-> NBJT2colNode != 0) && (here-> NBJT2baseNode != 0)) + here->NBJT2colBasePtr = here->NBJT2colBaseStructPtr->CSC ; + + if ((here-> NBJT2colNode != 0) && (here-> NBJT2emitNode != 0)) + here->NBJT2colEmitPtr = here->NBJT2colEmitStructPtr->CSC ; + + if ((here-> NBJT2baseNode != 0) && (here-> NBJT2colNode != 0)) + here->NBJT2baseColPtr = here->NBJT2baseColStructPtr->CSC ; + + if ((here-> NBJT2baseNode != 0) && (here-> NBJT2baseNode != 0)) + here->NBJT2baseBasePtr = here->NBJT2baseBaseStructPtr->CSC ; + + if ((here-> NBJT2baseNode != 0) && (here-> NBJT2emitNode != 0)) + here->NBJT2baseEmitPtr = here->NBJT2baseEmitStructPtr->CSC ; + + if ((here-> NBJT2emitNode != 0) && (here-> NBJT2colNode != 0)) + here->NBJT2emitColPtr = here->NBJT2emitColStructPtr->CSC ; + + if ((here-> NBJT2emitNode != 0) && (here-> NBJT2baseNode != 0)) + here->NBJT2emitBasePtr = here->NBJT2emitBaseStructPtr->CSC ; + + if ((here-> NBJT2emitNode != 0) && (here-> NBJT2emitNode != 0)) + here->NBJT2emitEmitPtr = here->NBJT2emitEmitStructPtr->CSC ; + + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/nbjt2/nbjt2def.h b/src/spicelib/devices/nbjt2/nbjt2def.h index 1ca3ee70c..e8c0d7c99 100644 --- a/src/spicelib/devices/nbjt2/nbjt2def.h +++ b/src/spicelib/devices/nbjt2/nbjt2def.h @@ -85,6 +85,19 @@ typedef struct sNBJT2instance { unsigned NBJT2icFileGiven:1; /* flag to indicate init. cond. file given */ unsigned NBJT2printGiven:1; /* flag to indicate print given */ unsigned NBJT2tempGiven:1; /* flag to indicate temp given */ + +#ifdef KLU + BindElement *NBJT2colColStructPtr ; + BindElement *NBJT2colBaseStructPtr ; + BindElement *NBJT2colEmitStructPtr ; + BindElement *NBJT2baseColStructPtr ; + BindElement *NBJT2baseBaseStructPtr ; + BindElement *NBJT2baseEmitStructPtr ; + BindElement *NBJT2emitColStructPtr ; + BindElement *NBJT2emitBaseStructPtr ; + BindElement *NBJT2emitEmitStructPtr ; +#endif + } NBJT2instance; /* per model data */