diff --git a/configure.ac b/configure.ac index 7f159419d..cc3fbc1ec 100644 --- a/configure.ac +++ b/configure.ac @@ -1071,9 +1071,23 @@ if test "x$enable_pss" = "xyes"; then AC_MSG_RESULT([WARNING: PSS analysis enabled]) fi +# --enable-klu: Use KLU linear systems solver +AC_ARG_ENABLE(klu, + AS_HELP_STRING([--enable-klu],[Use KLU linear systems solver])) + +# Add KLU solver to ngspice +if test "$enable_klu" = "yes"; then + AC_DEFINE(KLU,[],[Define if we want KLU linear systems solver]) + AC_MSG_RESULT(WARNING: KLU solver enabled) +fi +AM_CONDITIONAL([KLU_WANTED], [test "$enable_klu" = "yes"]) + # Output Files # ------------ +AM_COND_IF([KLU_WANTED], + [AC_CONFIG_FILES([src/maths/KLU/Makefile])]) + AC_CONFIG_FILES([Makefile man/Makefile man/man1/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 1a61492a5..7d78cb72d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -168,7 +168,13 @@ ngspice_LDADD += \ maths/misc/libmathmisc.la \ maths/fft/libmathfft.la \ maths/poly/libpoly.la \ - maths/ni/libni.la \ + maths/ni/libni.la + +if KLU_WANTED +ngspice_LDADD += maths/KLU/libKLU.la +endif + +ngspice_LDADD += \ maths/sparse/libsparse.la \ misc/libmisc.la @@ -270,6 +276,9 @@ ngmultidec_LDADD = \ maths/sparse/libsparse.la \ misc/libmisc.la +if KLU_WANTED +ngmultidec_LDADD += maths/KLU/libKLU.la +endif ## ngmakeidx: @@ -402,6 +411,10 @@ libspice_la_LIBADD += \ ciderlib/support/libcidersuprt.la endif +if KLU_WANTED +libspice_la_LIBADD += maths/KLU/libKLU.la +endif + libspice_la_LIBADD += \ maths/deriv/libderiv.la \ maths/cmaths/libcmaths.la \ diff --git a/src/include/ngspice/Makefile.am b/src/include/ngspice/Makefile.am index 4d609bb7d..232b95c9f 100644 --- a/src/include/ngspice/Makefile.am +++ b/src/include/ngspice/Makefile.am @@ -64,6 +64,11 @@ include_HEADERS = \ ipcproto.h \ ipctiein.h \ jobdefs.h \ + amd.h \ + btf.h \ + colamd.h \ + klu.h \ + UFconfig.h \ lsort.h \ macros.h \ material.h \ diff --git a/src/include/ngspice/devdefs.h b/src/include/ngspice/devdefs.h index c91598f54..63137c403 100644 --- a/src/include/ngspice/devdefs.h +++ b/src/include/ngspice/devdefs.h @@ -101,6 +101,11 @@ typedef struct SPICEdev { int *DEVinstSize; /* size of an instance */ int *DEVmodSize; /* size of a model */ +#ifdef KLU + int (*DEVbindklu)(GENmodel*, CKTcircuit*); + int (*DEVbindkluComplex)(GENmodel*, CKTcircuit*); +#endif + } SPICEdev; /* instance of structure for each possible type of device */ diff --git a/src/include/ngspice/smpdefs.h b/src/include/ngspice/smpdefs.h index bae1ad37a..3d7e141da 100644 --- a/src/include/ngspice/smpdefs.h +++ b/src/include/ngspice/smpdefs.h @@ -1,7 +1,11 @@ #ifndef ngspice_SMPDEFS_H #define ngspice_SMPDEFS_H +/* Typedef removed by Francesco Lannutti (2012-02) to create the new SMPmatrix structure */ +/* typedef struct MatrixFrame SMPmatrix; +*/ +typedef struct MatrixFrame MatrixFrame; typedef struct MatrixElement *SMPelement; /********** @@ -14,6 +18,43 @@ Modified: 2000 AlansFixes #include #include "ngspice/complex.h" +#ifdef KLU +#include "ngspice/klu.h" +#endif + +struct SMPmatrix { + MatrixFrame *SPmatrix ; /* pointer to sparse matrix */ + +#ifdef KLU + klu_common *CKTkluCommon ; /* KLU common object */ + klu_symbolic *CKTkluSymbolic ; /* KLU symbolic object */ + klu_numeric *CKTkluNumeric ; /* KLU numeric object */ + int *CKTkluAp ; /* KLU column pointer */ + int *CKTkluAi ; /* KLU row pointer */ + double *CKTkluAx ; /* KLU element */ + double *CKTkluIntermediate ; /* KLU RHS Intermediate for Solve Real Step */ + double *CKTkluIntermediate_Complex ; /* KLU iRHS Intermediate for Solve Complex Step */ + double **CKTkluBind_Sparse ; /* KLU - Sparse original element position */ + double **CKTkluBind_KLU ; /* KLU - KLU new element position */ + double **CKTkluBind_KLU_Complex ; /* KLU - KLU new element position in Complex analysis */ + double **CKTkluDiag ; /* KLU pointer to diagonal element to perform Gmin */ + int CKTkluN ; /* KLU N, copied */ + int CKTklunz ; /* KLU nz, copied for AC Analysis */ + int CKTkluMODE ; /* KLU MODE parameter to enable KLU or not from the heuristic */ + #define CKTkluON 1 /* KLU MODE ON definition */ + #define CKTkluOFF 0 /* KLU MODE OFF definition */ +#endif + +}; + +/* SMPmatrix structure alias - Francesco Lannutti (2012-02) */ +typedef struct SMPmatrix SMPmatrix ; + + +#ifdef KLU +void SMPmatrix_CSC ( SMPmatrix * ) ; +void SMPnnz ( SMPmatrix * ) ; +#endif int SMPaddElt( SMPmatrix *, int , int , double ); double * SMPmakeElt( SMPmatrix * , int , int ); void SMPcClear( SMPmatrix *); @@ -27,7 +68,7 @@ void SMPcaSolve(SMPmatrix *Matrix, double RHS[], double iRHS[], void SMPcSolve( SMPmatrix *, double [], double [], double [], double []); void SMPsolve( SMPmatrix *, double [], double []); int SMPmatSize( SMPmatrix *); -int SMPnewMatrix( SMPmatrix ** ); +int SMPnewMatrix( SMPmatrix * ); void SMPdestroy( SMPmatrix *); int SMPpreOrder( SMPmatrix *); void SMPprint( SMPmatrix * , char *); diff --git a/src/include/ngspice/spmatrix.h b/src/include/ngspice/spmatrix.h index 4900a22e0..68e0890ec 100644 --- a/src/include/ngspice/spmatrix.h +++ b/src/include/ngspice/spmatrix.h @@ -294,4 +294,10 @@ extern void spMultTransposed(MatrixPtr,spREAL*,spREAL*,spREAL*,spREAL*); extern void spSolve( MatrixPtr, spREAL*, spREAL*, spREAL*, spREAL* ); extern void spSolveTransposed(MatrixPtr,spREAL*,spREAL*,spREAL*,spREAL*); +extern int WriteCol_original(MatrixPtr, int, spREAL *, int *, spREAL **, spREAL **, spREAL **); +extern int WriteCol_original_dump(MatrixPtr, int, spREAL *, int *); +extern void spMatrix_CSC(MatrixPtr, int *, int *, double *, int, double **, double **, double **); +extern void spMatrix_CSC_dump(MatrixPtr, char *); +extern void spRHS_CSC_dump(spREAL *, char *, MatrixPtr); + #endif /* spOKAY */ diff --git a/src/maths/KLU/Makefile.am b/src/maths/KLU/Makefile.am index fa43a33e9..5a2b1293a 100644 --- a/src/maths/KLU/Makefile.am +++ b/src/maths/KLU/Makefile.am @@ -84,7 +84,9 @@ libKLU_complex_la_SOURCES = \ libKLU_complex_la_CPPFLAGS = -I$(top_srcdir)/src/include -DCOMPLEX -libKLU_la_SOURCES = +libKLU_la_SOURCES = \ + klusmp.c + libKLU_la_LIBADD = \ libKLU_real.la \ libKLU_complex.la diff --git a/src/maths/Makefile.am b/src/maths/Makefile.am index 9bc84a2cf..5d170edba 100644 --- a/src/maths/Makefile.am +++ b/src/maths/Makefile.am @@ -3,4 +3,13 @@ SUBDIRS = cmaths ni sparse poly deriv misc fft DIST_SUBDIRS = cmaths ni sparse poly deriv misc fft -MAINTAINERCLEANFILES = Makefile.in +if KLU_WANTED +SUBDIRS += KLU +DIST_SUBDIRS += KLU +endif + +MAINTAINERCLEANFILES = Makefile.in KLU/Makefile.in + +if KLU_WANTED +MAINTAINERCLEANFILES -= KLU/Makefile.in +endif diff --git a/src/maths/ni/nidest.c b/src/maths/ni/nidest.c index 3258f3c89..c2ca02546 100644 --- a/src/maths/ni/nidest.c +++ b/src/maths/ni/nidest.c @@ -16,7 +16,7 @@ Author: 1985 Thomas L. Quarles void NIdestroy(CKTcircuit *ckt) { - if (ckt->CKTmatrix) + if (ckt->CKTmatrix->SPmatrix) SMPdestroy(ckt->CKTmatrix); ckt->CKTmatrix = NULL; if(ckt->CKTrhs) FREE(ckt->CKTrhs); diff --git a/src/maths/ni/niinit.c b/src/maths/ni/niinit.c index 481d40916..c4cba5b85 100644 --- a/src/maths/ni/niinit.c +++ b/src/maths/ni/niinit.c @@ -16,6 +16,9 @@ Author: 1985 Thomas L. Quarles #include "ngspice/sperror.h" #include "ngspice/smpdefs.h" +#ifdef KLU +#include "ngspice/klu.h" +#endif int NIinit(CKTcircuit *ckt) @@ -24,6 +27,30 @@ NIinit(CKTcircuit *ckt) /* a concession to Ken Kundert's sparse matrix package - SMP doesn't need this*/ int Error; #endif /* SPARSE */ + +/* Allocation of the new SMPmatrix structure - Francesco Lannuti (2012-02) */ + ckt->CKTmatrix = TMALLOC (SMPmatrix, 1) ; + +#ifdef KLU + ckt->CKTmatrix->CKTkluCommon = TMALLOC (klu_common, 1) ; + ckt->CKTmatrix->CKTkluSymbolic = NULL ; + ckt->CKTmatrix->CKTkluNumeric = NULL ; + ckt->CKTmatrix->CKTkluAp = NULL ; + ckt->CKTmatrix->CKTkluAi = NULL ; + ckt->CKTmatrix->CKTkluAx = NULL ; + ckt->CKTmatrix->CKTkluIntermediate = NULL ; + ckt->CKTmatrix->CKTkluIntermediate_Complex = NULL ; + ckt->CKTmatrix->CKTkluBind_Sparse = NULL ; + ckt->CKTmatrix->CKTkluBind_KLU = NULL ; + ckt->CKTmatrix->CKTkluBind_KLU_Complex = NULL ; + ckt->CKTmatrix->CKTkluDiag = NULL ; + ckt->CKTmatrix->CKTkluN = 0 ; + ckt->CKTmatrix->CKTklunz = 0 ; + ckt->CKTmatrix->CKTkluMODE = CKTkluON ; /* TO BE SUBSTITUTED WITH THE HEURISTICS */ + + klu_defaults (ckt->CKTmatrix->CKTkluCommon) ; +#endif + ckt->CKTniState = NIUNINITIALIZED; - return(SMPnewMatrix( &(ckt->CKTmatrix) ) ); + return (SMPnewMatrix (ckt->CKTmatrix)); } diff --git a/src/maths/sparse/Makefile.am b/src/maths/sparse/Makefile.am index ccbdcf969..9767c159c 100644 --- a/src/maths/sparse/Makefile.am +++ b/src/maths/sparse/Makefile.am @@ -10,11 +10,15 @@ libsparse_la_SOURCES = \ spextra.c \ spfactor.c \ spoutput.c \ - spsmp.c \ spsolve.c \ sputils.c +if KLU_WANTED +libsparse_la_SOURCES += spCSC.c +else +libsparse_la_SOURCES += spsmp.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include diff --git a/src/maths/sparse/spbuild.c b/src/maths/sparse/spbuild.c index c3601fc08..d1e19bda2 100644 --- a/src/maths/sparse/spbuild.c +++ b/src/maths/sparse/spbuild.c @@ -77,6 +77,25 @@ static void ExpandTranslationArrays( MatrixPtr, int ); +int WriteCol_original(MatrixPtr Matrix, int Col, spREAL *CSC_Element, int *CSC_Row, spREAL **bind_Sparse, spREAL **bind_KLU, spREAL **diag) { + + int i=0; + ElementPtr current=Matrix->FirstInCol[Col]; + while (current!=NULL) { +// spREAL element=current->Real; + bind_Sparse [i] = (double *)current ; +// CSC_Element[i]=element; + bind_KLU [i] = &(CSC_Element [i]) ; + CSC_Row[i]=(current->Row) - 1; + if (CSC_Row [i] == Col - 1) diag [0] = &(CSC_Element [i]) ; + i++; + current=current->NextInCol; + } + + return i; +} + + /* diff --git a/src/maths/sparse/spoutput.c b/src/maths/sparse/spoutput.c index 6464e4fa0..ee5b980c7 100644 --- a/src/maths/sparse/spoutput.c +++ b/src/maths/sparse/spoutput.c @@ -60,6 +60,210 @@ int Printer_Width = PRINTER_WIDTH; #include "ngspice/wstdio.h" #endif +void spMatrix_CSC(MatrixPtr Matrix, int *Ap, int *Ai, double *Ax, int n, double **bind_Sparse, double **bind_KLU, double **diag) { + + int offset, i ; +// int j, *temp_vector_Ap, *temp_vector_Ai, *Q, *Q_new, col; +// int pstart, pend, dim, k, max_index, max_Ai, temp_Ai; +// int *bind_KLU_P, *bind_KLU_Pinv, kbar ; +// spREAL temp_elem, *temp_vector_A ; +// Q=(int*)SP_MALLOC(int, n); +// temp_vector_Ap=(int*)SP_MALLOC(int, n+1); +// temp_vector_Ai=(int*)SP_MALLOC(int, nz); +// temp_vector_A=(spREAL*)SP_MALLOC(spREAL, nz); +// bind_KLU_P = (int *) SP_MALLOC (int, nz) ; +// bind_KLU_Pinv = (int *) SP_MALLOC (int, nz) ; + + offset=0; +// temp_vector_Ap[0]=offset; + Ap[0]=offset; + for (i=1;i<=n;i++) { +// offset+=WriteCol_original(Matrix, i, (spREAL*)((long)temp_vector_A+offset*sizeof(spREAL)), +// (int*)((long)temp_vector_Ai+offset*sizeof(int)), &col, +// (spREAL **)((long)bind_Sparse + offset * sizeof(spREAL *)), +// (spREAL **)((long)bind_KLU + offset * sizeof(spREAL *))); +// temp_vector_Ap[i]=offset; + offset+=WriteCol_original(Matrix, i, (spREAL*)((long)Ax+offset*sizeof(spREAL)), + (int*)((long)Ai+offset*sizeof(int)), + (spREAL **)((long)bind_Sparse + offset * sizeof(spREAL *)), + (spREAL **)((long)bind_KLU + offset * sizeof(spREAL *)), + (spREAL **)((long)diag + (i - 1) * sizeof(spREAL *))); + + Ap[i]=offset; +// Q[i-1]=col; + } + +/* for (i = 0 ; i < nz ; i++) { + bind_KLU_P [i] = i ; + bind_KLU_Pinv [i] = i ; + } + + for (i=0;iElements ; + Q=(int*)SP_MALLOC(int, n); + temp_vector_Ap=(int*)SP_MALLOC(int, n+1); + temp_vector_Ai=(int*)SP_MALLOC(int, nz); + temp_vector_A=(spREAL*)SP_MALLOC(spREAL, nz); + CSC_Ap=(int*)SP_MALLOC(int, n+1); + CSC_Ai=(int*)SP_MALLOC(int, nz); + CSC_A=(spREAL*)SP_MALLOC(spREAL, nz); + + offset=0; + temp_vector_Ap[0]=offset; + for (i=1;i<=n;i++) { + offset+=WriteCol_original(Matrix, i, (spREAL*)((long)temp_vector_A+offset*sizeof(spREAL)), (int*)((long)temp_vector_Ai+offset*sizeof(int)), (spREAL **)bind, (spREAL **)bind, (spREAL **)bind); //NON FUNZIONA PER ORA + temp_vector_Ap[i]=offset; + Q[i-1]=col; + } + + for (i=0;iSPmatrix, Row, Col ) = Value; + return spError( Matrix->SPmatrix ); } /* @@ -125,7 +124,7 @@ SMPaddElt(SMPmatrix *Matrix, int Row, int Col, double Value) double * SMPmakeElt(SMPmatrix *Matrix, int Row, int Col) { - return spGetElement( Matrix, Row, Col ); + return spGetElement( Matrix->SPmatrix, Row, Col ); } /* @@ -134,7 +133,7 @@ SMPmakeElt(SMPmatrix *Matrix, int Row, int Col) void SMPcClear(SMPmatrix *Matrix) { - spClear( Matrix ); + spClear( Matrix->SPmatrix ); } /* @@ -143,7 +142,7 @@ SMPcClear(SMPmatrix *Matrix) void SMPclear(SMPmatrix *Matrix) { - spClear( Matrix ); + spClear( Matrix->SPmatrix ); } #define NG_IGNORE(x) (void)x @@ -157,8 +156,8 @@ SMPcLUfac(SMPmatrix *Matrix, double PivTol) { NG_IGNORE(PivTol); - spSetComplex( Matrix ); - return spFactor( Matrix ); + spSetComplex( Matrix->SPmatrix ); + return spFactor( Matrix->SPmatrix ); } /* @@ -169,9 +168,9 @@ int SMPluFac(SMPmatrix *Matrix, double PivTol, double Gmin) { NG_IGNORE(PivTol); - spSetReal( Matrix ); + spSetReal( Matrix->SPmatrix ); LoadGmin( Matrix, Gmin ); - return spFactor( Matrix ); + return spFactor( Matrix->SPmatrix ); } /* @@ -182,8 +181,8 @@ SMPcReorder(SMPmatrix *Matrix, double PivTol, double PivRel, int *NumSwaps) { *NumSwaps = 1; - spSetComplex( Matrix ); - return spOrderAndFactor( Matrix, NULL, + spSetComplex( Matrix->SPmatrix ); + return spOrderAndFactor( Matrix->SPmatrix, NULL, (spREAL)PivRel, (spREAL)PivTol, YES ); } @@ -193,9 +192,9 @@ SMPcReorder(SMPmatrix *Matrix, double PivTol, double PivRel, int SMPreorder(SMPmatrix *Matrix, double PivTol, double PivRel, double Gmin) { - spSetReal( Matrix ); + spSetReal( Matrix->SPmatrix ); LoadGmin( Matrix, Gmin ); - return spOrderAndFactor( Matrix, NULL, + return spOrderAndFactor( Matrix->SPmatrix, NULL, (spREAL)PivRel, (spREAL)PivTol, YES ); } @@ -209,7 +208,7 @@ SMPcaSolve(SMPmatrix *Matrix, double RHS[], double iRHS[], NG_IGNORE(iSpare); NG_IGNORE(Spare); - spSolveTransposed( Matrix, RHS, RHS, iRHS, iRHS ); + spSolveTransposed( Matrix->SPmatrix, RHS, RHS, iRHS, iRHS ); } /* @@ -222,7 +221,7 @@ SMPcSolve(SMPmatrix *Matrix, double RHS[], double iRHS[], NG_IGNORE(iSpare); NG_IGNORE(Spare); - spSolve( Matrix, RHS, RHS, iRHS, iRHS ); + spSolve( Matrix->SPmatrix, RHS, RHS, iRHS, iRHS ); } /* @@ -233,7 +232,7 @@ SMPsolve(SMPmatrix *Matrix, double RHS[], double Spare[]) { NG_IGNORE(Spare); - spSolve( Matrix, RHS, RHS, NULL, NULL ); + spSolve( Matrix->SPmatrix, RHS, RHS, NULL, NULL ); } /* @@ -242,17 +241,17 @@ SMPsolve(SMPmatrix *Matrix, double RHS[], double Spare[]) int SMPmatSize(SMPmatrix *Matrix) { - return spGetSize( Matrix, 1 ); + return spGetSize( Matrix->SPmatrix, 1 ); } /* * SMPnewMatrix() */ int -SMPnewMatrix(SMPmatrix **pMatrix) +SMPnewMatrix(SMPmatrix *Matrix) { int Error; - *pMatrix = spCreate( 0, 1, &Error ); + Matrix->SPmatrix = spCreate( 0, 1, &Error ); return Error; } @@ -262,7 +261,7 @@ SMPnewMatrix(SMPmatrix **pMatrix) void SMPdestroy(SMPmatrix *Matrix) { - spDestroy( Matrix ); + spDestroy( Matrix->SPmatrix ); } /* @@ -271,8 +270,8 @@ SMPdestroy(SMPmatrix *Matrix) int SMPpreOrder(SMPmatrix *Matrix) { - spMNA_Preorder( Matrix ); - return spError( Matrix ); + spMNA_Preorder( Matrix->SPmatrix ); + return spError( Matrix->SPmatrix ); } /* @@ -282,7 +281,7 @@ SMPpreOrder(SMPmatrix *Matrix) void SMPprintRHS(SMPmatrix *Matrix, char *Filename, RealVector RHS, RealVector iRHS) { - spFileVector( Matrix, Filename, RHS, iRHS ); + spFileVector( Matrix->SPmatrix, Filename, RHS, iRHS ); } /* @@ -293,9 +292,9 @@ void SMPprint(SMPmatrix *Matrix, char *Filename) { if (Filename) - spFileMatrix(Matrix, Filename, "Circuit Matrix", 0, 1, 1 ); + spFileMatrix(Matrix->SPmatrix, Filename, "Circuit Matrix", 0, 1, 1 ); else - spPrint( Matrix, 0, 1, 1 ); + spPrint( Matrix->SPmatrix, 0, 1, 1 ); } /* @@ -304,7 +303,7 @@ SMPprint(SMPmatrix *Matrix, char *Filename) void SMPgetError(SMPmatrix *Matrix, int *Col, int *Row) { - spWhereSingular( Matrix, Row, Col ); + spWhereSingular( Matrix->SPmatrix, Row, Col ); } /* @@ -314,9 +313,9 @@ SMPgetError(SMPmatrix *Matrix, int *Col, int *Row) int SMPcProdDiag(SMPmatrix *Matrix, SPcomplex *pMantissa, int *pExponent) { - spDeterminant( Matrix, pExponent, &(pMantissa->real), + spDeterminant ( Matrix->SPmatrix, pExponent, &(pMantissa->real), &(pMantissa->imag) ); - return spError( Matrix ); + return spError( Matrix->SPmatrix ); } /* @@ -328,7 +327,7 @@ SMPcDProd(SMPmatrix *Matrix, SPcomplex *pMantissa, int *pExponent) double re, im, x, y, z; int p; - spDeterminant( Matrix, &p, &re, &im); + spDeterminant( Matrix->SPmatrix, &p, &re, &im); #ifndef M_LN2 #define M_LN2 0.69314718055994530942 @@ -398,7 +397,7 @@ SMPcDProd(SMPmatrix *Matrix, SPcomplex *pMantissa, int *pExponent) printf("Determinant 10->2: (%20g,%20g)^%d\n", pMantissa->real, pMantissa->imag, *pExponent); #endif - return spError( Matrix ); + return spError( Matrix->SPmatrix ); } @@ -422,7 +421,7 @@ SMPcDProd(SMPmatrix *Matrix, SPcomplex *pMantissa, int *pExponent) static void LoadGmin(SMPmatrix *eMatrix, double Gmin) { - MatrixPtr Matrix = eMatrix; + MatrixPtr Matrix = eMatrix->SPmatrix; int I; ArrayOfElementPtrs Diag; ElementPtr diag; @@ -455,7 +454,7 @@ LoadGmin(SMPmatrix *eMatrix, double Gmin) SMPelement * SMPfindElt(SMPmatrix *eMatrix, int Row, int Col, int CreateIfMissing) { - MatrixPtr Matrix = eMatrix; + MatrixPtr Matrix = eMatrix->SPmatrix; ElementPtr Element; /* Begin `SMPfindElt'. */ @@ -475,7 +474,7 @@ SMPfindElt(SMPmatrix *eMatrix, int Row, int Col, int CreateIfMissing) int SMPcZeroCol(SMPmatrix *eMatrix, int Col) { - MatrixPtr Matrix = eMatrix; + MatrixPtr Matrix = eMatrix->SPmatrix; ElementPtr Element; Col = Matrix->ExtToIntColMap[Col]; @@ -497,7 +496,7 @@ SMPcZeroCol(SMPmatrix *eMatrix, int Col) int SMPcAddCol(SMPmatrix *eMatrix, int Accum_Col, int Addend_Col) { - MatrixPtr Matrix = eMatrix; + MatrixPtr Matrix = eMatrix->SPmatrix; ElementPtr Accum, Addend, *Prev; Accum_Col = Matrix->ExtToIntColMap[Accum_Col]; @@ -529,7 +528,7 @@ SMPcAddCol(SMPmatrix *eMatrix, int Accum_Col, int Addend_Col) int SMPzeroRow(SMPmatrix *eMatrix, int Row) { - MatrixPtr Matrix = eMatrix; + MatrixPtr Matrix = eMatrix->SPmatrix; ElementPtr Element; Row = Matrix->ExtToIntColMap[Row]; diff --git a/src/spicelib/analysis/acan.c b/src/spicelib/analysis/acan.c index 2e0ad1e94..40147809e 100644 --- a/src/spicelib/analysis/acan.c +++ b/src/spicelib/analysis/acan.c @@ -242,6 +242,29 @@ ACan(CKTcircuit *ckt, int restart) ckt->CKTcurrentAnalysis = DOING_AC; +#ifdef KLU + if (ckt->CKTmatrix->CKTkluMODE) { + int i, m; + double *temp; + temp = TMALLOC (double, 2 * ckt->CKTmatrix->CKTklunz) ; + ckt->CKTmatrix->CKTkluBind_KLU_Complex = TMALLOC (double *, ckt->CKTmatrix->CKTklunz) ; + ckt->CKTmatrix->CKTkluIntermediate_Complex = TMALLOC (double, 2 * ckt->CKTmatrix->CKTkluN) ; + m = 0; + for (i = 0 ; i < ckt->CKTmatrix->CKTklunz ; i++) { + ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] = &(temp [m]) ; + m += 2; + } + + DEVices[13]->DEVbindkluComplex (ckt->CKThead[13], ckt) ; + DEVices[17]->DEVbindkluComplex (ckt->CKThead[17], ckt) ; + DEVices[40]->DEVbindkluComplex (ckt->CKThead[40], ckt) ; + DEVices[48]->DEVbindkluComplex (ckt->CKThead[48], ckt) ; + + free (ckt->CKTmatrix->CKTkluAx) ; + ckt->CKTmatrix->CKTkluAx = temp ; + } +#endif + /* main loop through all scheduled frequencies */ while (freq <= job->ACstopFreq + freqTol) { if(SPfrontEnd->IFpauseTest()) { diff --git a/src/spicelib/analysis/cktacct.c b/src/spicelib/analysis/cktacct.c index 63b0a1063..f7a5f1128 100644 --- a/src/spicelib/analysis/cktacct.c +++ b/src/spicelib/analysis/cktacct.c @@ -18,6 +18,9 @@ Author: 1985 Thomas L. Quarles #include "ngspice/cktdefs.h" #include "ngspice/spmatrix.h" +#ifdef KLU +#include "ngspice/klu.h" +#endif /* ARGSUSED */ @@ -32,22 +35,36 @@ CKTacct(CKTcircuit *ckt, JOB *anal, int which, IFvalue *val) val->iValue = ckt->CKTmaxEqNum; break; case OPT_ORIGNZ: - if ( ckt->CKTmatrix != NULL ) { - val->iValue = spOriginalCount(ckt->CKTmatrix); + if ( ckt->CKTmatrix->SPmatrix != NULL ) { + val->iValue = spOriginalCount(ckt->CKTmatrix->SPmatrix); } else { val->iValue = 0; } break; case OPT_FILLNZ: - if ( ckt->CKTmatrix != NULL ) { - val->iValue = spFillinCount(ckt->CKTmatrix); + if ( ckt->CKTmatrix->SPmatrix != NULL ) { +#ifdef KLU + if (ckt->CKTmatrix->CKTkluMODE) + val->iValue = ckt->CKTmatrix->CKTkluNumeric->lnz + ckt->CKTmatrix->CKTkluNumeric->unz - ckt->CKTmatrix->CKTklunz; + else + val->iValue = spFillinCount(ckt->CKTmatrix->SPmatrix); +#else + val->iValue = spFillinCount(ckt->CKTmatrix->SPmatrix); +#endif } else { val->iValue = 0; } break; case OPT_TOTALNZ: - if ( ckt->CKTmatrix != NULL ) { - val->iValue = spElementCount(ckt->CKTmatrix); + if ( ckt->CKTmatrix->SPmatrix != NULL ) { +#ifdef KLU + if (ckt->CKTmatrix->CKTkluMODE) + val->iValue = ckt->CKTmatrix->CKTkluNumeric->lnz + ckt->CKTmatrix->CKTkluNumeric->unz; + else + val->iValue = spElementCount(ckt->CKTmatrix->SPmatrix); +#else + val->iValue = spElementCount(ckt->CKTmatrix->SPmatrix); +#endif } else { val->iValue = 0; } diff --git a/src/spicelib/analysis/cktdest.c b/src/spicelib/analysis/cktdest.c index 4584f90c0..0792314aa 100644 --- a/src/spicelib/analysis/cktdest.c +++ b/src/spicelib/analysis/cktdest.c @@ -44,9 +44,9 @@ CKTdestroy(CKTcircuit *ckt) for(i=0;i<=ckt->CKTmaxOrder+1;i++){ FREE(ckt->CKTstates[i]); } - if(ckt->CKTmatrix) { + if(ckt->CKTmatrix->SPmatrix) { SMPdestroy(ckt->CKTmatrix); - ckt->CKTmatrix = NULL; + ckt->CKTmatrix->SPmatrix = NULL; } FREE(ckt->CKTbreaks); for(node = ckt->CKTnodes; node; ) { diff --git a/src/spicelib/analysis/cktop.c b/src/spicelib/analysis/cktop.c index 403b2c389..fd2409d7e 100644 --- a/src/spicelib/analysis/cktop.c +++ b/src/spicelib/analysis/cktop.c @@ -27,6 +27,31 @@ CKTop (CKTcircuit * ckt, long int firstmode, long int continuemode, #endif ckt->CKTmode = firstmode; +#ifdef KLU + if (ckt->CKTmatrix->CKTkluMODE) { + + int n = ckt->CKTmatrix->CKTkluN ; + int nz = ckt->CKTmatrix->CKTklunz ; + + ckt->CKTmatrix->CKTkluAp = TMALLOC (int, n + 1) ; + ckt->CKTmatrix->CKTkluAi = TMALLOC (int, nz) ; + ckt->CKTmatrix->CKTkluAx = TMALLOC (double, nz) ; + ckt->CKTmatrix->CKTkluIntermediate = TMALLOC (double, n ) ; + + ckt->CKTmatrix->CKTkluBind_Sparse = TMALLOC (double *, nz) ; + ckt->CKTmatrix->CKTkluBind_KLU = TMALLOC (double *, nz) ; + + ckt->CKTmatrix->CKTkluDiag = TMALLOC (double *, n) ; + + SMPmatrix_CSC (ckt->CKTmatrix) ; + + DEVices[13]->DEVbindklu (ckt->CKThead[13], ckt); + DEVices[17]->DEVbindklu (ckt->CKThead[17], ckt); + DEVices[40]->DEVbindklu (ckt->CKThead[40], ckt); + DEVices[48]->DEVbindklu (ckt->CKThead[48], ckt); + } +#endif + if (!ckt->CKTnoOpIter){ #ifdef XSPICE /* gtri - begin - wbk - add convergence problem reporting flags */ diff --git a/src/spicelib/analysis/cktsens.c b/src/spicelib/analysis/cktsens.c index 74760dbbf..66248d8ab 100644 --- a/src/spicelib/analysis/cktsens.c +++ b/src/spicelib/analysis/cktsens.c @@ -55,7 +55,7 @@ static double inc_freq(double freq, int type, double step_size); * For each element/parameter in the test list: * construct the perturbation matrix * Solve for the sensitivities: - * delta_E = Y^-1 (delta_Y E - delta_I) + * delta_E = Y^-1 (delta_Y->SPmatrix E - delta_I) * save results */ @@ -71,7 +71,8 @@ int sens_sens(CKTcircuit *ckt, int restart) static double freq; static int nfreqs; static int i; - static SMPmatrix *delta_Y = NULL, *Y; + static SMPmatrix *delta_Y = NULL; + static MatrixFrame *Y; static double step_size; double *E, *iE; IFvalue value, nvalue; @@ -89,7 +90,7 @@ int sens_sens(CKTcircuit *ckt, int restart) int type; double *saved_rhs = 0, *saved_irhs = 0; - SMPmatrix *saved_matrix = 0; + MatrixFrame *saved_matrix = 0; #ifndef notdef #ifdef notdef @@ -139,10 +140,10 @@ int sens_sens(CKTcircuit *ckt, int restart) if (error) return error; - size = spGetSize(ckt->CKTmatrix, 1); + size = spGetSize (ckt->CKTmatrix->SPmatrix, 1) ; /* Create the perturbation matrix */ - delta_Y = spCreate(size, 1, &error); + delta_Y->SPmatrix = spCreate(size, 1, &error); if (error) return error; @@ -236,12 +237,12 @@ int sens_sens(CKTcircuit *ckt, int restart) bypass = ckt->CKTbypass; ckt->CKTbypass = 0; - /* CKTop solves into CKTrhs and CKTmatrix, + /* CKTop solves into CKTrhs and CKTmatrix->SPmatrix, * CKTirhs is hopefully zero (fresh allocated ?) */ E = ckt->CKTrhs; iE = ckt->CKTirhs; - Y = ckt->CKTmatrix; + Y = ckt->CKTmatrix->SPmatrix; #ifdef ASDEBUG DEBUG(1) { @@ -284,7 +285,7 @@ int sens_sens(CKTcircuit *ckt, int restart) if (error) return error; - /* XXX ckt->CKTmatrix = Y; */ + /* XXX ckt->CKTmatrix->SPmatrix = Y; */ error = CKTsetup(ckt); if (error) @@ -313,17 +314,17 @@ int sens_sens(CKTcircuit *ckt, int restart) } #endif - /* NIacIter solves into CKTrhsOld, CKTirhsOld and CKTmatrix */ + /* NIacIter solves into CKTrhsOld, CKTirhsOld and CKTmatrix->SPmatrix */ E = ckt->CKTrhsOld; iE = ckt->CKTirhsOld; - Y = ckt->CKTmatrix; + Y = ckt->CKTmatrix->SPmatrix; } /* Use a different vector & matrix */ save_context(ckt->CKTrhs, saved_rhs); save_context(ckt->CKTirhs, saved_irhs); - save_context(ckt->CKTmatrix, saved_matrix); + save_context(ckt->CKTmatrix->SPmatrix, saved_matrix); ckt->CKTrhs = delta_I; ckt->CKTirhs = delta_iI; @@ -356,7 +357,7 @@ int sens_sens(CKTcircuit *ckt, int restart) } #endif - spClear(delta_Y); + spClear(delta_Y->SPmatrix); for (j = 0; j < size; j++) { delta_I[j] = 0.0; @@ -399,7 +400,7 @@ int sens_sens(CKTcircuit *ckt, int restart) #ifdef ASDEBUG DEBUG(2) { printf("Effect of device:\n"); - spPrint(delta_Y, 0, 1, 1); + spPrint(delta_Y->SPmatrix, 0, 1, 1); printf("LHS:\n"); for (j = 0; j < size; j++) printf("%d: %g, %g\n", j, @@ -423,7 +424,7 @@ int sens_sens(CKTcircuit *ckt, int restart) if (error && error != E_BADPARM) return error; - spConstMult(delta_Y, -1.0); + spConstMult(delta_Y->SPmatrix, -1.0); for (j = 0; j < size; j++) { delta_I[j] *= -1.0; delta_iI[j] *= -1.0; @@ -432,7 +433,7 @@ int sens_sens(CKTcircuit *ckt, int restart) #ifdef ASDEBUG DEBUG(2) { printf("Effect of negating matrix:\n"); - spPrint(delta_Y, 0, 1, 1); + spPrint(delta_Y->SPmatrix, 0, 1, 1); for (j = 0; j < size; j++) printf("%d: %g, %g\n", j, delta_I[j], delta_iI[j]); @@ -458,7 +459,7 @@ int sens_sens(CKTcircuit *ckt, int restart) #ifdef ASDEBUG DEBUG(2) { printf("Effect of changing the parameter:\n"); - spPrint(delta_Y, 0, 1, 1); + spPrint(delta_Y->SPmatrix, 0, 1, 1); for (j = 0; j < size; j++) printf("%d: %g, %g\n", j, delta_I[j], delta_iI[j]); @@ -482,17 +483,17 @@ int sens_sens(CKTcircuit *ckt, int restart) #endif /* delta_Y E */ - spMultiply(delta_Y, delta_I_delta_Y, E, + spMultiply(delta_Y->SPmatrix, delta_I_delta_Y, E, delta_iI_delta_Y, iE); #ifdef ASDEBUG DEBUG(2) for (j = 0; j < size; j++) - printf("delta_Y * E [%d] = %20.15g\n", + printf("delta_Y->SPmatrix * E [%d] = %20.15g\n", j, delta_I_delta_Y[j]); #endif - /* delta_I - delta_Y E */ + /* delta_I - delta_Y->SPmatrix E */ for (j = 0; j < size; j++) { delta_I[j] -= delta_I_delta_Y[j]; delta_iI[j] -= delta_iI_delta_Y[j]; @@ -577,7 +578,7 @@ int sens_sens(CKTcircuit *ckt, int restart) release_context(ckt->CKTrhs, saved_rhs); release_context(ckt->CKTirhs, saved_irhs); - release_context(ckt->CKTmatrix, saved_matrix); + release_context(ckt->CKTmatrix->SPmatrix, saved_matrix); if (is_dc) nvalue.v.vec.rVec = output_values; @@ -602,9 +603,9 @@ int sens_sens(CKTcircuit *ckt, int restart) release_context(ckt->CKTrhs, saved_rhs); release_context(ckt->CKTirhs, saved_irhs); - release_context(ckt->CKTmatrix, saved_matrix); + release_context(ckt->CKTmatrix->SPmatrix, saved_matrix); - spDestroy(delta_Y); + spDestroy(delta_Y->SPmatrix); FREE(delta_I); FREE(delta_iI); diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index 49a99d80d..5cabc6ba6 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -77,6 +77,12 @@ CKTsetup(CKTcircuit *ckt) if(error) return(error); } } + +#ifdef KLU + if (ckt->CKTmatrix->CKTkluMODE) + SMPnnz (ckt->CKTmatrix) ; +#endif + for(i=0;i<=MAX(2,ckt->CKTmaxOrder)+1;i++) { /* dctran needs 3 states as minimum */ CKALLOC(ckt->CKTstates[i],ckt->CKTnumStates,double); } @@ -161,7 +167,7 @@ CKTunsetup(CKTcircuit *ckt) NIdestroy(ckt); /* - if (ckt->CKTmatrix) + if (ckt->CKTmatrix->SPmatrix) SMPdestroy(ckt->CKTmatrix); ckt->CKTmatrix = NULL; */ diff --git a/src/spicelib/devices/bsim4v6/Makefile.am b/src/spicelib/devices/bsim4v6/Makefile.am index 0815d57eb..b8d3067cc 100644 --- a/src/spicelib/devices/bsim4v6/Makefile.am +++ b/src/spicelib/devices/bsim4v6/Makefile.am @@ -28,6 +28,9 @@ libbsim4v6_la_SOURCES = \ bsim4v6init.h \ bsim4v6itf.h +if KLU_WANTED +libbsim4v6_la_SOURCES += b4v6bindklu.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include diff --git a/src/spicelib/devices/bsim4v6/b4v6bindklu.c b/src/spicelib/devices/bsim4v6/b4v6bindklu.c index 18f1c6671..5a70a7b99 100644 --- a/src/spicelib/devices/bsim4v6/b4v6bindklu.c +++ b/src/spicelib/devices/bsim4v6/b4v6bindklu.c @@ -23,286 +23,286 @@ BSIM4v6bindklu(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6DPbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DPbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DPbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DPbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6GPbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GPbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GPbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GPbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6SPbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SPbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SPbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SPbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6BPdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BPdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BPdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BPdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6BPgpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BPgpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BPgpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BPgpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6BPspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BPspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BPspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BPspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6BPbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BPbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BPbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BPbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6dNode != 0)) { - while (here->BSIM4v6DdPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DdPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DdPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DdPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6GPgpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GPgpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GPgpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GPgpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6sNode != 0)) { - while (here->BSIM4v6SsPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SsPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SsPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SsPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6DPdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DPdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DPdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DPdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6SPspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SPspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SPspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SPspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6DdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6GPdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GPdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GPdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GPdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6GPspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GPspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GPspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GPspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6SspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6DPspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DPspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DPspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DPspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6dNode != 0)) { - while (here->BSIM4v6DPdPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DPdPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DPdPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DPdPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6DPgpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DPgpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DPgpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DPgpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6SPgpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SPgpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SPgpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SPgpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6sNode != 0)) { - while (here->BSIM4v6SPsPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SPsPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SPsPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SPsPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6SPdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SPdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SPdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SPdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6qNode != 0)) { - while (here->BSIM4v6QqPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6QqPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6QqPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6QqPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6QbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6QbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6QbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6QbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6QdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6QdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6QdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6QdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6QspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6QspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6QspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6QspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6QgpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6QgpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6QgpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6QgpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6qNode != 0)) { - while (here->BSIM4v6DPqPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DPqPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DPqPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DPqPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6qNode != 0)) { - while (here->BSIM4v6SPqPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SPqPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SPqPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SPqPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6qNode != 0)) { - while (here->BSIM4v6GPqPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GPqPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GPqPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GPqPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } if (here->BSIM4v6rgateMod != 0) { i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6gNodeExt != 0)) { - while (here->BSIM4v6GEgePtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GEgePtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GEgePtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GEgePtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6GEgpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GEgpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GEgpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GEgpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6gNodeExt != 0)) { - while (here->BSIM4v6GPgePtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GPgePtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GPgePtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GPgePtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6GEdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GEdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GEdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GEdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6GEspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GEspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GEspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GEspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6GEbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GEbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GEbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GEbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6GMdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GMdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GMdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GMdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6GMgpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GMgpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GMgpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GMgpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6GMgmPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GMgmPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GMgmPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GMgmPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6gNodeExt != 0)) { - while (here->BSIM4v6GMgePtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GMgePtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GMgePtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GMgePtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6GMspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GMspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GMspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GMspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6GMbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GMbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GMbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GMbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6DPgmPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DPgmPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DPgmPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DPgmPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6GPgmPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GPgmPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GPgmPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GPgmPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6GEgmPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6GEgmPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6GEgmPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6GEgmPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6SPgmPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SPgmPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SPgmPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SPgmPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6BPgmPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BPgmPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BPgmPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BPgmPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } } @@ -311,104 +311,104 @@ BSIM4v6bindklu(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6dbNode != 0)) { - while (here->BSIM4v6DPdbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DPdbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DPdbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DPdbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6sbNode != 0)) { - while (here->BSIM4v6SPsbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SPsbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SPsbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SPsbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6DBdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DBdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DBdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DBdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6dbNode != 0)) { - while (here->BSIM4v6DBdbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DBdbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DBdbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DBdbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6DBbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DBbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DBbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DBbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6bNode != 0)) { - while (here->BSIM4v6DBbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DBbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DBbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DBbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6dbNode != 0)) { - while (here->BSIM4v6BPdbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BPdbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BPdbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BPdbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6bNode != 0)) { - while (here->BSIM4v6BPbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BPbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BPbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BPbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6sbNode != 0)) { - while (here->BSIM4v6BPsbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BPsbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BPsbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BPsbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6SBspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SBspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SBspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SBspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6SBbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SBbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SBbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SBbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6bNode != 0)) { - while (here->BSIM4v6SBbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SBbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SBbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SBbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6sbNode != 0)) { - while (here->BSIM4v6SBsbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SBsbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SBsbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SBsbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6dbNode != 0)) { - while (here->BSIM4v6BdbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BdbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BdbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BdbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6BbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6sbNode != 0)) { - while (here->BSIM4v6BsbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BsbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BsbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BsbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6bNode != 0)) { - while (here->BSIM4v6BbPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6BbPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6BbPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6BbPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } } @@ -417,38 +417,38 @@ BSIM4v6bindklu(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6DgpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DgpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DgpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DgpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6DspPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DspPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DspPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DspPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6DbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6DbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6DbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6DbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6SdpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SdpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SdpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SdpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6SgpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SgpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SgpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SgpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6SbpPtr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->BSIM4v6SbpPtr = ckt->CKTkluBind_KLU [i] ; + while (here->BSIM4v6SbpPtr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->BSIM4v6SbpPtr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } } @@ -473,286 +473,286 @@ BSIM4v6bindkluComplex(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6DPbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DPbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DPbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DPbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6GPbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GPbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GPbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GPbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6SPbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SPbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SPbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SPbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6BPdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BPdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BPdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BPdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6BPgpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BPgpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BPgpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BPgpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6BPspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BPspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BPspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BPspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6BPbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BPbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BPbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BPbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6dNode != 0)) { - while (here->BSIM4v6DdPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DdPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DdPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DdPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6GPgpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GPgpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GPgpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GPgpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6sNode != 0)) { - while (here->BSIM4v6SsPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SsPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SsPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SsPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6DPdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DPdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DPdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DPdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6SPspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SPspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SPspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SPspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6DdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6GPdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GPdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GPdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GPdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6GPspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GPspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GPspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GPspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6SspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6DPspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DPspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DPspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DPspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6dNode != 0)) { - while (here->BSIM4v6DPdPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DPdPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DPdPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DPdPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6DPgpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DPgpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DPgpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DPgpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6SPgpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SPgpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SPgpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SPgpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6sNode != 0)) { - while (here->BSIM4v6SPsPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SPsPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SPsPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SPsPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6SPdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SPdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SPdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SPdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6qNode != 0)) { - while (here->BSIM4v6QqPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6QqPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6QqPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6QqPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6QbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6QbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6QbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6QbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6QdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6QdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6QdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6QdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6QspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6QspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6QspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6QspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6qNode != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6QgpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6QgpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6QgpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6QgpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6qNode != 0)) { - while (here->BSIM4v6DPqPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DPqPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DPqPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DPqPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6qNode != 0)) { - while (here->BSIM4v6SPqPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SPqPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SPqPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SPqPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6qNode != 0)) { - while (here->BSIM4v6GPqPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GPqPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GPqPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GPqPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } if (here->BSIM4v6rgateMod != 0) { i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6gNodeExt != 0)) { - while (here->BSIM4v6GEgePtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GEgePtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GEgePtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GEgePtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6GEgpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GEgpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GEgpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GEgpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6gNodeExt != 0)) { - while (here->BSIM4v6GPgePtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GPgePtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GPgePtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GPgePtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6GEdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GEdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GEdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GEdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6GEspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GEspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GEspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GEspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6GEbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GEbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GEbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GEbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6GMdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GMdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GMdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GMdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6GMgpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GMgpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GMgpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GMgpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6GMgmPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GMgmPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GMgmPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GMgmPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6gNodeExt != 0)) { - while (here->BSIM4v6GMgePtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GMgePtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GMgePtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GMgePtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6GMspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GMspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GMspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GMspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeMid != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6GMbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GMbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GMbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GMbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6DPgmPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DPgmPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DPgmPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DPgmPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6GPgmPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GPgmPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GPgmPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GPgmPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6gNodeExt != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6GEgmPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6GEgmPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6GEgmPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6GEgmPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6SPgmPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SPgmPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SPgmPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SPgmPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6gNodeMid != 0)) { - while (here->BSIM4v6BPgmPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BPgmPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BPgmPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BPgmPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } } @@ -761,104 +761,104 @@ BSIM4v6bindkluComplex(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->BSIM4v6dNodePrime != 0) && (here->BSIM4v6dbNode != 0)) { - while (here->BSIM4v6DPdbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DPdbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DPdbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DPdbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNodePrime != 0) && (here->BSIM4v6sbNode != 0)) { - while (here->BSIM4v6SPsbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SPsbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SPsbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SPsbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6DBdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DBdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DBdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DBdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6dbNode != 0)) { - while (here->BSIM4v6DBdbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DBdbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DBdbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DBdbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6DBbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DBbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DBbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DBbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dbNode != 0) && (here->BSIM4v6bNode != 0)) { - while (here->BSIM4v6DBbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DBbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DBbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DBbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6dbNode != 0)) { - while (here->BSIM4v6BPdbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BPdbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BPdbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BPdbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6bNode != 0)) { - while (here->BSIM4v6BPbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BPbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BPbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BPbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNodePrime != 0) && (here->BSIM4v6sbNode != 0)) { - while (here->BSIM4v6BPsbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BPsbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BPsbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BPsbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6SBspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SBspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SBspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SBspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6SBbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SBbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SBbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SBbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6bNode != 0)) { - while (here->BSIM4v6SBbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SBbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SBbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SBbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sbNode != 0) && (here->BSIM4v6sbNode != 0)) { - while (here->BSIM4v6SBsbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SBsbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SBsbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SBsbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6dbNode != 0)) { - while (here->BSIM4v6BdbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BdbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BdbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BdbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6BbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6sbNode != 0)) { - while (here->BSIM4v6BsbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BsbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BsbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BsbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6bNode != 0) && (here->BSIM4v6bNode != 0)) { - while (here->BSIM4v6BbPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6BbPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6BbPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6BbPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } } @@ -867,38 +867,38 @@ BSIM4v6bindkluComplex(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6DgpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DgpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DgpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DgpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6sNodePrime != 0)) { - while (here->BSIM4v6DspPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DspPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DspPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DspPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6dNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6DbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6DbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6DbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6DbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6dNodePrime != 0)) { - while (here->BSIM4v6SdpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SdpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SdpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SdpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6gNodePrime != 0)) { - while (here->BSIM4v6SgpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SgpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SgpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SgpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->BSIM4v6sNode != 0) && (here->BSIM4v6bNodePrime != 0)) { - while (here->BSIM4v6SbpPtr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->BSIM4v6SbpPtr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->BSIM4v6SbpPtr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->BSIM4v6SbpPtr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } } diff --git a/src/spicelib/devices/bsim4v6/bsim4v6ext.h b/src/spicelib/devices/bsim4v6/bsim4v6ext.h index c78426430..cb83a0887 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6ext.h +++ b/src/spicelib/devices/bsim4v6/bsim4v6ext.h @@ -28,3 +28,8 @@ extern int BSIM4v6temp(GENmodel*,CKTcircuit*); extern int BSIM4v6trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4v6noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v6unsetup(GENmodel*,CKTcircuit*); + +#ifdef KLU +extern int BSIM4v6bindklu(GENmodel*,CKTcircuit*); +extern int BSIM4v6bindkluComplex(GENmodel*,CKTcircuit*); +#endif diff --git a/src/spicelib/devices/bsim4v6/bsim4v6init.c b/src/spicelib/devices/bsim4v6/bsim4v6init.c index 96b027d7e..28473314f 100644 --- a/src/spicelib/devices/bsim4v6/bsim4v6init.c +++ b/src/spicelib/devices/bsim4v6/bsim4v6init.c @@ -72,7 +72,12 @@ SPICEdev BSIM4v6info = { NULL, /* DEVacct */ #endif &BSIM4v6iSize, /* DEVinstSize */ - &BSIM4v6mSize /* DEVmodSize */ + &BSIM4v6mSize, /* DEVmodSize */ +#ifdef KLU + BSIM4v6bindklu, /* DEVbindklu */ + BSIM4v6bindkluComplex, /* DEVbindkluComplex */ +#endif + }; diff --git a/src/spicelib/devices/cap/Makefile.am b/src/spicelib/devices/cap/Makefile.am index 78d8daaff..482c64809 100644 --- a/src/spicelib/devices/cap/Makefile.am +++ b/src/spicelib/devices/cap/Makefile.am @@ -29,6 +29,9 @@ libcap_la_SOURCES = \ captemp.c \ captrunc.c +if KLU_WANTED +libcap_la_SOURCES += capbindklu.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include diff --git a/src/spicelib/devices/cap/capbindklu.c b/src/spicelib/devices/cap/capbindklu.c index c78033429..f2365574b 100644 --- a/src/spicelib/devices/cap/capbindklu.c +++ b/src/spicelib/devices/cap/capbindklu.c @@ -23,26 +23,26 @@ CAPbindklu(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->CAPposNode != 0) && (here->CAPposNode != 0)) { - while (here->CAPposPosptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->CAPposPosptr = ckt->CKTkluBind_KLU [i] ; + while (here->CAPposPosptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->CAPposPosptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->CAPnegNode != 0) && (here->CAPnegNode != 0)) { - while (here->CAPnegNegptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->CAPnegNegptr = ckt->CKTkluBind_KLU [i] ; + while (here->CAPnegNegptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->CAPnegNegptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->CAPposNode != 0) && (here->CAPnegNode != 0)) { - while (here->CAPposNegptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->CAPposNegptr = ckt->CKTkluBind_KLU [i] ; + while (here->CAPposNegptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->CAPposNegptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->CAPnegNode != 0) && (here->CAPposNode != 0)) { - while (here->CAPnegPosptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->CAPnegPosptr = ckt->CKTkluBind_KLU [i] ; + while (here->CAPnegPosptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->CAPnegPosptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } } } @@ -65,26 +65,26 @@ CAPbindkluComplex(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->CAPposNode != 0) && (here->CAPposNode != 0)) { - while (here->CAPposPosptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->CAPposPosptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->CAPposPosptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->CAPposPosptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->CAPnegNode != 0) && (here->CAPnegNode != 0)) { - while (here->CAPnegNegptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->CAPnegNegptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->CAPnegNegptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->CAPnegNegptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->CAPposNode != 0) && (here->CAPnegNode != 0)) { - while (here->CAPposNegptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->CAPposNegptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->CAPposNegptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->CAPposNegptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->CAPnegNode != 0) && (here->CAPposNode != 0)) { - while (here->CAPnegPosptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->CAPnegPosptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->CAPnegPosptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->CAPnegPosptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } } } diff --git a/src/spicelib/devices/cap/capext.h b/src/spicelib/devices/cap/capext.h index 4fd5c6d0d..00a93fc55 100644 --- a/src/spicelib/devices/cap/capext.h +++ b/src/spicelib/devices/cap/capext.h @@ -23,3 +23,7 @@ extern int CAPsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int CAPtemp(GENmodel*,CKTcircuit*); extern int CAPtrunc(GENmodel*,CKTcircuit*,double*); +#ifdef KLU +extern int CAPbindklu(GENmodel*,CKTcircuit*); +extern int CAPbindkluComplex(GENmodel*,CKTcircuit*); +#endif diff --git a/src/spicelib/devices/cap/capinit.c b/src/spicelib/devices/cap/capinit.c index 5e0b14fc5..0429269f6 100644 --- a/src/spicelib/devices/cap/capinit.c +++ b/src/spicelib/devices/cap/capinit.c @@ -71,7 +71,12 @@ SPICEdev CAPinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &CAPiSize, - /* DEVmodSize */ &CAPmSize + /* DEVmodSize */ &CAPmSize, +#ifdef KLU + /* DEVbindklu */ CAPbindklu, + /* DEVbindkluComplex */ CAPbindkluComplex, +#endif + }; diff --git a/src/spicelib/devices/res/Makefile.am b/src/spicelib/devices/res/Makefile.am index c3d8f33ae..1eddfcbc9 100644 --- a/src/spicelib/devices/res/Makefile.am +++ b/src/spicelib/devices/res/Makefile.am @@ -26,6 +26,9 @@ libres_la_SOURCES = \ ressset.c \ restemp.c +if KLU_WANTED +libres_la_SOURCES += resbindklu.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include diff --git a/src/spicelib/devices/res/resbindklu.c b/src/spicelib/devices/res/resbindklu.c index 99fabf3a3..f4604447d 100644 --- a/src/spicelib/devices/res/resbindklu.c +++ b/src/spicelib/devices/res/resbindklu.c @@ -23,26 +23,26 @@ RESbindklu(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->RESposNode != 0) && (here->RESposNode != 0)) { - while (here->RESposPosptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->RESposPosptr = ckt->CKTkluBind_KLU [i] ; + while (here->RESposPosptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->RESposPosptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->RESnegNode != 0) && (here->RESnegNode != 0)) { - while (here->RESnegNegptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->RESnegNegptr = ckt->CKTkluBind_KLU [i] ; + while (here->RESnegNegptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->RESnegNegptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->RESposNode != 0) && (here->RESnegNode != 0)) { - while (here->RESposNegptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->RESposNegptr = ckt->CKTkluBind_KLU [i] ; + while (here->RESposNegptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->RESposNegptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->RESnegNode != 0) && (here->RESposNode != 0)) { - while (here->RESnegPosptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->RESnegPosptr = ckt->CKTkluBind_KLU [i] ; + while (here->RESnegPosptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->RESnegPosptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } } } @@ -65,26 +65,26 @@ RESbindkluComplex(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->RESposNode != 0) && (here->RESposNode != 0)) { - while (here->RESposPosptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->RESposPosptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->RESposPosptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->RESposPosptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->RESnegNode != 0) && (here->RESnegNode != 0)) { - while (here->RESnegNegptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->RESnegNegptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->RESnegNegptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->RESnegNegptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->RESposNode != 0) && (here->RESnegNode != 0)) { - while (here->RESposNegptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->RESposNegptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->RESposNegptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->RESposNegptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->RESnegNode != 0) && (here->RESposNode != 0)) { - while (here->RESnegPosptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->RESnegPosptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->RESnegPosptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->RESnegPosptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } } } diff --git a/src/spicelib/devices/res/resext.h b/src/spicelib/devices/res/resext.h index ee4be5516..07d7c5ee3 100644 --- a/src/spicelib/devices/res/resext.h +++ b/src/spicelib/devices/res/resext.h @@ -20,3 +20,8 @@ extern void RESsPrint(GENmodel*,CKTcircuit*); extern int RESsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int REStemp(GENmodel*,CKTcircuit*); extern int RESnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); + +#ifdef KLU +extern int RESbindklu(GENmodel*,CKTcircuit*); +extern int RESbindkluComplex(GENmodel*,CKTcircuit*); +#endif diff --git a/src/spicelib/devices/res/resinit.c b/src/spicelib/devices/res/resinit.c index e713e603b..a0ae0574f 100644 --- a/src/spicelib/devices/res/resinit.c +++ b/src/spicelib/devices/res/resinit.c @@ -72,7 +72,11 @@ SPICEdev RESinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &RESiSize, - /* DEVmodSize */ &RESmSize + /* DEVmodSize */ &RESmSize, +#ifdef KLU + /* DEVbindklu */ RESbindklu, + /* DEVbindkluComplex */ RESbindkluComplex, +#endif }; diff --git a/src/spicelib/devices/vsrc/Makefile.am b/src/spicelib/devices/vsrc/Makefile.am index 28d5fb38b..c18f5955b 100644 --- a/src/spicelib/devices/vsrc/Makefile.am +++ b/src/spicelib/devices/vsrc/Makefile.am @@ -23,6 +23,9 @@ libvsrc_la_SOURCES = \ vsrcset.c \ vsrctemp.c +if KLU_WANTED +libvsrc_la_SOURCES += vsrcbindklu.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include diff --git a/src/spicelib/devices/vsrc/vsrcbindklu.c b/src/spicelib/devices/vsrc/vsrcbindklu.c index 2c6b0aead..0a93f7e67 100644 --- a/src/spicelib/devices/vsrc/vsrcbindklu.c +++ b/src/spicelib/devices/vsrc/vsrcbindklu.c @@ -23,26 +23,26 @@ VSRCbindklu(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->VSRCposNode != 0) && (here->VSRCbranch != 0)) { - while (here->VSRCposIbrptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->VSRCposIbrptr = ckt->CKTkluBind_KLU [i] ; + while (here->VSRCposIbrptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->VSRCposIbrptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->VSRCnegNode != 0) && (here->VSRCbranch != 0)) { - while (here->VSRCnegIbrptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->VSRCnegIbrptr = ckt->CKTkluBind_KLU [i] ; + while (here->VSRCnegIbrptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->VSRCnegIbrptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->VSRCbranch != 0) && (here->VSRCnegNode != 0)) { - while (here->VSRCibrNegptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->VSRCibrNegptr = ckt->CKTkluBind_KLU [i] ; + while (here->VSRCibrNegptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->VSRCibrNegptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } i = 0 ; if ((here->VSRCbranch != 0) && (here->VSRCposNode != 0)) { - while (here->VSRCibrPosptr != ckt->CKTkluBind_Sparse [i]) i ++ ; - here->VSRCibrPosptr = ckt->CKTkluBind_KLU [i] ; + while (here->VSRCibrPosptr != ckt->CKTmatrix->CKTkluBind_Sparse [i]) i ++ ; + here->VSRCibrPosptr = ckt->CKTmatrix->CKTkluBind_KLU [i] ; } } } @@ -65,26 +65,26 @@ VSRCbindkluComplex(GENmodel *inModel, CKTcircuit *ckt) i = 0 ; if ((here->VSRCposNode != 0) && (here->VSRCbranch != 0)) { - while (here->VSRCposIbrptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->VSRCposIbrptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->VSRCposIbrptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->VSRCposIbrptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->VSRCnegNode != 0) && (here->VSRCbranch != 0)) { - while (here->VSRCnegIbrptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->VSRCnegIbrptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->VSRCnegIbrptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->VSRCnegIbrptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->VSRCbranch != 0) && (here->VSRCnegNode != 0)) { - while (here->VSRCibrNegptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->VSRCibrNegptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->VSRCibrNegptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->VSRCibrNegptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } i = 0 ; if ((here->VSRCbranch != 0) && (here->VSRCposNode != 0)) { - while (here->VSRCibrPosptr != ckt->CKTkluBind_KLU [i]) i ++ ; - here->VSRCibrPosptr = ckt->CKTkluBind_KLU_Complex [i] ; + while (here->VSRCibrPosptr != ckt->CKTmatrix->CKTkluBind_KLU [i]) i ++ ; + here->VSRCibrPosptr = ckt->CKTmatrix->CKTkluBind_KLU_Complex [i] ; } } } diff --git a/src/spicelib/devices/vsrc/vsrcext.h b/src/spicelib/devices/vsrc/vsrcext.h index 980efbf8e..994028259 100644 --- a/src/spicelib/devices/vsrc/vsrcext.h +++ b/src/spicelib/devices/vsrc/vsrcext.h @@ -18,3 +18,8 @@ extern int VSRCsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int VSRCunsetup(GENmodel*,CKTcircuit*); extern int VSRCpzSetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int VSRCtemp(GENmodel*,CKTcircuit*); + +#ifdef KLU +extern int VSRCbindklu(GENmodel*,CKTcircuit*); +extern int VSRCbindkluComplex(GENmodel*,CKTcircuit*); +#endif diff --git a/src/spicelib/devices/vsrc/vsrcinit.c b/src/spicelib/devices/vsrc/vsrcinit.c index f33d93e43..a31388660 100644 --- a/src/spicelib/devices/vsrc/vsrcinit.c +++ b/src/spicelib/devices/vsrc/vsrcinit.c @@ -72,7 +72,12 @@ SPICEdev VSRCinfo = { /* DEVacct */ NULL, #endif /* DEVinstSize */ &VSRCiSize, - /* DEVmodSize */ &VSRCmSize + /* DEVmodSize */ &VSRCmSize, +#ifdef KLU + /* DEVbindklu */ VSRCbindklu, + /* DEVbindkluComplex */ VSRCbindkluComplex, +#endif + };