diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 5668d67f1..add25894d 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -306,7 +306,12 @@ struct CKTcircuit { }; -/* Now function prottypes */ +/* Now function prototypes */ + +/* Francesco Lannutti */ +extern int CKTloadLinearStatic (CKTcircuit *) ; +extern int CKTloadLinearDynamic (CKTcircuit *) ; +extern int CKTloadAssemble (CKTcircuit *) ; extern int ACan(CKTcircuit *, int); extern int ACaskQuest(CKTcircuit *, JOB *, int , IFvalue *); diff --git a/src/include/ngspice/devdefs.h b/src/include/ngspice/devdefs.h index be65de693..3729cd233 100644 --- a/src/include/ngspice/devdefs.h +++ b/src/include/ngspice/devdefs.h @@ -121,6 +121,10 @@ typedef struct SPICEdev { /* routine to convert Real CSC array to Complex CSC array */ int (*DEVbindCSCComplexToReal)(GENmodel *, CKTcircuit *); /* routine to convert Complex CSC array to Real CSC array */ + int *DEVisLinear ; + /* flag to indicate if device is linear or non-linear */ + int *DEVisLinearStatic ; + /* flag to indicate if device is linear static or linear dynamic */ #endif } SPICEdev; /* instance of structure for each possible type of device */ diff --git a/src/include/ngspice/klu-binding.h b/src/include/ngspice/klu-binding.h index b3f5fa48d..f8f0c154a 100644 --- a/src/include/ngspice/klu-binding.h +++ b/src/include/ngspice/klu-binding.h @@ -1,20 +1,52 @@ #ifndef _KLU_BINDING_H #define _KLU_BINDING_H -#define CREATE_KLU_BINDING_TABLE(ptr, binding, a, b) \ - if ((here->a != 0) && (here->b != 0)) { \ - i = here->ptr ; \ +#define CREATE_KLU_BINDING_TABLE(ptr, binding, a, b) \ + if ((here->a != 0) && (here->b != 0)) { \ + i = here->ptr ; \ matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; \ - here->binding = matched ; \ - here->ptr = matched->CSC ; \ + here->binding = matched ; \ + here->ptr = matched->CSC ; \ } -#define CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(ptr, binding, a, b) \ - if ((here->a != 0) && (here->b != 0)) \ +#define CREATE_KLU_BINDING_TABLE_DYNAMIC(ptr, binding, a, b) \ + if ((here->a != 0) && (here->b != 0)) { \ + i = here->ptr ; \ + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; \ + here->binding = matched ; \ + here->ptr = matched->CSC_LinearDynamic ; \ + } + +#define CREATE_KLU_BINDING_TABLE_STATIC(ptr, binding, a, b) \ + if ((here->a != 0) && (here->b != 0)) { \ + i = here->ptr ; \ + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; \ + here->binding = matched ; \ + here->ptr = matched->CSC_LinearStatic ; \ + } + +#define CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(ptr, binding, a, b) \ + if ((here->a != 0) && (here->b != 0)) \ here->ptr = here->binding->CSC_Complex ; -#define CONVERT_KLU_BINDING_TABLE_TO_REAL(ptr, binding, a, b) \ - if ((here->a != 0) && (here->b != 0)) \ +#define CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(ptr, binding, a, b) \ + if ((here->a != 0) && (here->b != 0)) \ + here->ptr = here->binding->CSC_Complex_LinearDynamic ; + +#define CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_STATIC(ptr, binding, a, b) \ + if ((here->a != 0) && (here->b != 0)) \ + here->ptr = here->binding->CSC_Complex_LinearStatic ; + +#define CONVERT_KLU_BINDING_TABLE_TO_REAL(ptr, binding, a, b) \ + if ((here->a != 0) && (here->b != 0)) \ here->ptr = here->binding->CSC ; +#define CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(ptr, binding, a, b) \ + if ((here->a != 0) && (here->b != 0)) \ + here->ptr = here->binding->CSC_LinearDynamic ; + +#define CONVERT_KLU_BINDING_TABLE_TO_REAL_STATIC(ptr, binding, a, b) \ + if ((here->a != 0) && (here->b != 0)) \ + here->ptr = here->binding->CSC_LinearStatic ; + #endif diff --git a/src/include/ngspice/smpdefs.h b/src/include/ngspice/smpdefs.h index a4fd24745..26359550a 100644 --- a/src/include/ngspice/smpdefs.h +++ b/src/include/ngspice/smpdefs.h @@ -25,28 +25,32 @@ Modified: 2000 AlansFixes /* SMPmatrix structure - Francesco Lannutti (2012-02) */ typedef struct sSMPmatrix { - MatrixFrame *SPmatrix ; /* pointer to sparse matrix */ + 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 Real Elements */ - double *CKTkluAx_Complex ; /* KLU Complex Elements */ - unsigned int CKTkluMatrixIsComplex:1 ; /* KLU Matrix Is Complex Flag */ - #define CKTkluMatrixReal 0 /* KLU Matrix Real definition */ - #define CKTkluMatrixComplex 1 /* KLU Matrix Complex definition */ - double *CKTkluIntermediate ; /* KLU RHS Intermediate for Solve Real Step */ - double *CKTkluIntermediate_Complex ; /* KLU iRHS Intermediate for Solve Complex Step */ - BindElement *CKTbindStruct ; /* KLU - Sparse Binding Structure */ - double **CKTdiag_CSC ; /* KLU pointer to diagonal element to perform Gmin */ - int CKTkluN ; /* KLU N, copied */ - int CKTklunz ; /* KLU nz, copied for AC Analysis */ - unsigned int CKTkluMODE:1 ; /* 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 */ + 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 Real Elements */ + double *CKTkluAx_LinearStatic ; /* KLU Real Elements - Linear Static */ + double *CKTkluAx_LinearDynamic ; /* KLU Real Elements - Linear Dynamic */ + double *CKTkluAx_Complex ; /* KLU Complex Elements */ + double *CKTkluAx_Complex_LinearStatic ; /* KLU Complex Elements - Linear Static */ + double *CKTkluAx_Complex_LinearDynamic ; /* KLU Complex Elements - Linear Dynamic */ + unsigned int CKTkluMatrixIsComplex:1 ; /* KLU Matrix Is Complex Flag */ + #define CKTkluMatrixReal 0 /* KLU Matrix Real definition */ + #define CKTkluMatrixComplex 1 /* KLU Matrix Complex definition */ + double *CKTkluIntermediate ; /* KLU RHS Intermediate for Solve Real Step */ + double *CKTkluIntermediate_Complex ; /* KLU iRHS Intermediate for Solve Complex Step */ + BindElement *CKTbindStruct ; /* KLU - Sparse Binding Structure */ + double **CKTdiag_CSC ; /* KLU pointer to diagonal element to perform Gmin */ + int CKTkluN ; /* KLU N, copied */ + int CKTklunz ; /* KLU nz, copied for AC Analysis */ + unsigned int CKTkluMODE:1 ; /* 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 ; diff --git a/src/include/ngspice/spmatrix.h b/src/include/ngspice/spmatrix.h index 5ffd418b2..b7c2dd5bc 100644 --- a/src/include/ngspice/spmatrix.h +++ b/src/include/ngspice/spmatrix.h @@ -301,15 +301,19 @@ extern void spSolveTransposed(MatrixPtr,spREAL*,spREAL*,spREAL*,spREAL*); typedef struct sBindElement { double *Sparse ; double *CSC ; + double *CSC_LinearStatic ; + double *CSC_LinearDynamic ; double *CSC_Complex ; + double *CSC_Complex_LinearStatic ; + double *CSC_Complex_LinearDynamic ; } BindElement ; -extern int WriteCol_original (MatrixPtr, int, spREAL *, spREAL *, int *, BindElement *, spREAL **) ; +extern int WriteCol_original (MatrixPtr, int, spREAL *, spREAL *, spREAL *, spREAL *, spREAL *, spREAL *, int *, BindElement *, spREAL **) ; extern int WriteCol_original_dump (MatrixPtr, int, spREAL *, int *, unsigned int) ; -extern void spMatrix_CSC (MatrixPtr, int *, int *, double *, double *, int, BindElement *, double **) ; +extern void spMatrix_CSC (MatrixPtr, int *, int *, double *, double *, double *, double *, double *, double *, int, BindElement *, double **) ; extern void spMatrix_CSC_dump (MatrixPtr, unsigned int, char *) ; extern void spRHS_CSC_dump (spREAL *, char *, MatrixPtr) ; #endif -/* ------------------------------------------------------ */ +/* -------------------------------------------------- */ #endif /* spOKAY */ diff --git a/src/maths/KLU/klusmp.c b/src/maths/KLU/klusmp.c index a22c4669d..b6ca216d0 100644 --- a/src/maths/KLU/klusmp.c +++ b/src/maths/KLU/klusmp.c @@ -115,7 +115,9 @@ void SMPmatrix_CSC (SMPmatrix *Matrix) { spMatrix_CSC (Matrix->SPmatrix, Matrix->CKTkluAp, Matrix->CKTkluAi, Matrix->CKTkluAx, - Matrix->CKTkluAx_Complex, Matrix->CKTkluN, Matrix->CKTbindStruct, Matrix->CKTdiag_CSC) ; + Matrix->CKTkluAx_LinearStatic, Matrix->CKTkluAx_LinearDynamic, Matrix->CKTkluAx_Complex, + Matrix->CKTkluAx_Complex_LinearStatic, Matrix->CKTkluAx_Complex_LinearDynamic, + Matrix->CKTkluN, Matrix->CKTbindStruct, Matrix->CKTdiag_CSC) ; // spMatrix_CSC_dump (Matrix->SPmatrix, 1, NULL) ; diff --git a/src/maths/ni/niinit.c b/src/maths/ni/niinit.c index 301269de5..39c883c19 100644 --- a/src/maths/ni/niinit.c +++ b/src/maths/ni/niinit.c @@ -38,6 +38,11 @@ NIinit(CKTcircuit *ckt) ckt->CKTmatrix->CKTkluAp = NULL ; ckt->CKTmatrix->CKTkluAi = NULL ; ckt->CKTmatrix->CKTkluAx = NULL ; + ckt->CKTmatrix->CKTkluAx_LinearStatic = NULL ; + ckt->CKTmatrix->CKTkluAx_LinearDynamic = NULL ; + ckt->CKTmatrix->CKTkluAx_Complex = NULL ; + ckt->CKTmatrix->CKTkluAx_Complex_LinearStatic = NULL ; + ckt->CKTmatrix->CKTkluAx_Complex_LinearDynamic = NULL ; ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ; ckt->CKTmatrix->CKTkluIntermediate = NULL ; ckt->CKTmatrix->CKTkluIntermediate_Complex = NULL ; diff --git a/src/maths/ni/niiter.c b/src/maths/ni/niiter.c index 7611bb4a3..bb21777cb 100644 --- a/src/maths/ni/niiter.c +++ b/src/maths/ni/niiter.c @@ -63,6 +63,12 @@ NIiter(CKTcircuit *ckt, int maxIter) /* OldCKTstate0 = TMALLOC(double, ckt->CKTnumStates + 1); */ +#ifdef KLU + /* Francesco Lannutti */ + /* Loading the Linear Dynamic Part */ + error = CKTloadLinearDynamic (ckt) ; +#endif + for (;;) { ckt->CKTnoncon = 0; @@ -71,7 +77,7 @@ NIiter(CKTcircuit *ckt, int maxIter) if (!(ckt->CKTmode & MODEINITPRED)) #endif { - + /* Loading the Non-Linear Part */ error = CKTload(ckt); /* printf("loaded, noncon is %d\n", ckt->CKTnoncon); */ /* fflush(stdout); */ @@ -85,6 +91,12 @@ NIiter(CKTcircuit *ckt, int maxIter) return (error); } +#ifdef KLU + /* Francesco Lannutti */ + /* Assembling the Linear and Non-Linear Part */ + error = CKTloadAssemble (ckt) ; +#endif + /* printf("after loading, before solving\n"); */ /* CKTdump(ckt); */ diff --git a/src/maths/sparse/spCSC.c b/src/maths/sparse/spCSC.c index 8e00648ae..60b7b26a3 100644 --- a/src/maths/sparse/spCSC.c +++ b/src/maths/sparse/spCSC.c @@ -1,18 +1,18 @@ -/* Sparse Matrix to CSC Matrix Conversion Routines - * Including Dump Routines +/** Sparse Matrix to CSC Matrix Conversion Routines + * Including Dump Routines * - * Author: Francesco Lannutti 2011-2012 + * Author: Francesco Lannutti 2011-2012 * - * Instructions: - * spMatrix_CSC_dump and spRHS_CSC_dump are the dump routines; - * insert them in a point in your code after that the Sparse Matrix - * is filled in to dump the whole matrix in the CSC format. - * To solve correctly the resulting CSC linear system, it's crucial - * to perform another inversion of the Solution Vector following this code: + * Instructions: + * spMatrix_CSC_dump and spRHS_CSC_dump are the dump routines; + * insert them in a point in your code after that the Sparse Matrix + * is filled in to dump the whole matrix in the CSC format. + * To solve correctly the resulting CSC linear system, it's crucial + * to perform another inversion of the Solution Vector following this code: * - * pExtOrder = IntToExtColMap [n] ; - * for (i = n - 1 ; i >= 0 ; i--) - * RHS [*(pExtOrder--)] = Intermediate [i] ; + * pExtOrder = IntToExtColMap [n] ; + * for (i = n - 1 ; i >= 0 ; i--) + * RHS [*(pExtOrder--)] = Intermediate [i] ; */ /* Includes */ @@ -21,7 +21,9 @@ /* Body */ int -WriteCol_original (MatrixPtr Matrix, int Col, spREAL *CSC_Element, spREAL *CSC_Element_Complex, int *CSC_Row, BindElement *BindSparseCSC, spREAL **diag) +WriteCol_original (MatrixPtr Matrix, int Col, spREAL *CSC_Element, spREAL *CSC_LinearStatic_Element, spREAL *CSC_LinearDynamic_Element, + spREAL *CSC_Complex_Element, spREAL *CSC_Complex_LinearStatic_Element, spREAL *CSC_Complex_LinearDynamic_Element, + int *CSC_Row, BindElement *BindSparseCSC, spREAL **diag) { int i ; ElementPtr current ; @@ -32,7 +34,11 @@ WriteCol_original (MatrixPtr Matrix, int Col, spREAL *CSC_Element, spREAL *CSC_E while (current != NULL) { BindSparseCSC [i].Sparse = (double *)current ; BindSparseCSC [i].CSC = &(CSC_Element [i]) ; - BindSparseCSC [i].CSC_Complex = &(CSC_Element_Complex [2 * i]) ; + BindSparseCSC [i].CSC_LinearStatic = &(CSC_LinearStatic_Element [i]) ; + BindSparseCSC [i].CSC_LinearDynamic = &(CSC_LinearDynamic_Element [i]) ; + BindSparseCSC [i].CSC_Complex = &(CSC_Complex_Element [2 * i]) ; + BindSparseCSC [i].CSC_Complex_LinearStatic = &(CSC_Complex_LinearStatic_Element [2 * i]) ; + BindSparseCSC [i].CSC_Complex_LinearDynamic = &(CSC_Complex_LinearDynamic_Element [2 * i]) ; CSC_Row [i] = (current->Row) - 1 ; if (CSC_Row [i] == Col - 1) diag [0] = &(CSC_Element [i]) ; @@ -69,17 +75,22 @@ WriteCol_original_dump (MatrixPtr Matrix, int Col, spREAL *CSC_Element, int *CSC } void -spMatrix_CSC (MatrixPtr Matrix, int *Ap, int *Ai, double *Ax, double *Ax_Complex, int n, BindElement *BindSparseCSC, double **diag) +spMatrix_CSC (MatrixPtr Matrix, int *Ap, int *Ai, double *Ax, double *Ax_LinearStatic, double *Ax_LinearDynamic, + double *Ax_Complex, double *Ax_Complex_LinearStatic, double *Ax_Complex_LinearDynamic, int n, + BindElement *BindSparseCSC, double **diag) { int offset, i ; offset = 0 ; - Ap[0] = offset ; + Ap [0] = offset ; for (i = 1 ; i <= n ; i++) { - offset += WriteCol_original (Matrix, i, (spREAL *)(Ax + offset), (spREAL *)(Ax_Complex + 2 * offset), + offset += WriteCol_original (Matrix, i, (spREAL *)(Ax + offset), (spREAL *)(Ax_LinearStatic + offset), + (spREAL *)(Ax_LinearDynamic + offset), (spREAL *)(Ax_Complex + 2 * offset), + (spREAL *)(Ax_Complex_LinearStatic + 2 * offset), + (spREAL *)(Ax_Complex_LinearDynamic + 2 * offset), (int *)(Ai + offset), BindSparseCSC + offset, (spREAL **)(diag + (i - 1))) ; - Ap[i] = offset ; + Ap [i] = offset ; } } diff --git a/src/spicelib/analysis/cktload.c b/src/spicelib/analysis/cktload.c index b56f7e255..6055218e6 100644 --- a/src/spicelib/analysis/cktload.c +++ b/src/spicelib/analysis/cktload.c @@ -27,6 +27,66 @@ Modified: 2000 AlansFixes static int ZeroNoncurRow(SMPmatrix *matrix, CKTnode *nodes, int rownum); +/* Francesco Lannutti */ +#ifdef KLU +int +CKTloadLinearStatic (CKTcircuit *ckt) +{ + int error, i, size ; + + size = SMPmatSize (ckt->CKTmatrix) ; + for (i = 0 ; i <= size ; i++) + ckt->CKTmatrix->CKTkluAx_LinearStatic [i] = 0 ; + + for (i = 0; i < DEVmaxnum; i++) + { + if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead [i] && (*DEVices[i]->DEVisLinear) && (*DEVices[i]->DEVisLinearStatic)) + { + error = DEVices[i]->DEVload (ckt->CKThead [i], ckt) ; + + if (error) + return (error) ; + } + } + + return 0 ; +} + +int +CKTloadLinearDynamic (CKTcircuit *ckt) +{ + int error, i, size ; + + size = SMPmatSize (ckt->CKTmatrix) ; + for (i = 0 ; i <= size ; i++) + ckt->CKTmatrix->CKTkluAx_LinearDynamic [i] = 0 ; + + for (i = 0; i < DEVmaxnum; i++) + { + if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead [i] && *DEVices[i]->DEVisLinear && !(*DEVices[i]->DEVisLinearStatic)) + { + error = DEVices[i]->DEVload (ckt->CKThead [i], ckt) ; + + if (error) + return (error) ; + } + } + + return 0 ; +} + +int +CKTloadAssemble (CKTcircuit *ckt) +{ + int i ; + + for (i = 0 ; i < ckt->CKTmatrix->CKTklunz ; i++) + ckt->CKTmatrix->CKTkluAx [i] += (ckt->CKTmatrix->CKTkluAx_LinearStatic [i] + ckt->CKTmatrix->CKTkluAx_LinearDynamic [i]) ; + + return 0 ; +} +#endif + int CKTload(CKTcircuit *ckt) { @@ -60,7 +120,14 @@ CKTload(CKTcircuit *ckt) #endif /* STEPDEBUG */ for (i = 0; i < DEVmaxnum; i++) { + + /* Francesco Lannutti */ +#ifdef KLU + if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead[i] && !(*DEVices[i]->DEVisLinear)) { +#else if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead[i]) { +#endif + error = DEVices[i]->DEVload (ckt->CKThead[i], ckt); if (ckt->CKTnoncon) ckt->CKTtroubleNode = 0; diff --git a/src/spicelib/analysis/cktop.c b/src/spicelib/analysis/cktop.c index e9b1fb075..7f5ce0973 100644 --- a/src/spicelib/analysis/cktop.c +++ b/src/spicelib/analysis/cktop.c @@ -39,10 +39,26 @@ CKTop (CKTcircuit *ckt, long int firstmode, long int continuemode, ckt->enh->conv_debug.last_NIiter_call = (ckt->CKTnumGminSteps <= 0) && (ckt->CKTnumSrcSteps <= 0); #endif + +#ifdef KLU + /* Francesco Lannutti */ + /* Loading the Linear Static Part */ + int error ; + error = CKTloadLinearStatic (ckt) ; +#endif + converged = NIiter (ckt, iterlim); if (converged == 0) return converged; /* successfull */ } else { + +#ifdef KLU + /* Francesco Lannutti */ + /* Loading the Linear Static Part */ + int error ; + error = CKTloadLinearStatic (ckt) ; +#endif + converged = 1; /* the 'go directly to gmin stepping' option */ } diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index a841af434..6edecd3b4 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -118,17 +118,21 @@ CKTsetup(CKTcircuit *ckt) SMPnnz (ckt->CKTmatrix) ; 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->CKTkluAp = TMALLOC (int, n + 1) ; + ckt->CKTmatrix->CKTkluAi = TMALLOC (int, nz) ; + ckt->CKTmatrix->CKTkluAx = TMALLOC (double, nz) ; + ckt->CKTmatrix->CKTkluAx_LinearStatic = TMALLOC (double, nz) ; + ckt->CKTmatrix->CKTkluAx_LinearDynamic = TMALLOC (double, nz) ; ckt->CKTmatrix->CKTkluIntermediate = TMALLOC (double, n) ; - ckt->CKTmatrix->CKTbindStruct = TMALLOC (BindElement, nz) ; + ckt->CKTmatrix->CKTbindStruct = TMALLOC (BindElement, nz) ; - ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ; + ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ; /* Complex Stuff needed for AC Analysis */ ckt->CKTmatrix->CKTkluAx_Complex = TMALLOC (double, 2 * nz) ; + ckt->CKTmatrix->CKTkluAx_Complex_LinearStatic = TMALLOC (double, 2 * nz) ; + ckt->CKTmatrix->CKTkluAx_Complex_LinearDynamic = TMALLOC (double, 2 * nz) ; ckt->CKTmatrix->CKTkluIntermediate_Complex = TMALLOC (double, 2 * n) ; /* Binding Table from Sparse to CSC Format Creation */ diff --git a/src/spicelib/devices/bsim4/b4.c b/src/spicelib/devices/bsim4/b4.c index d58ff67eb..028db91fb 100644 --- a/src/spicelib/devices/bsim4/b4.c +++ b/src/spicelib/devices/bsim4/b4.c @@ -1099,3 +1099,8 @@ int BSIM4pTSize = NUMELEMS(BSIM4pTable); int BSIM4mPTSize = NUMELEMS(BSIM4mPTable); int BSIM4iSize = sizeof(BSIM4instance); int BSIM4mSize = sizeof(BSIM4model); + +#ifdef KLU +int BSIM4isLinear = 0 ; +int BSIM4isLinearStatic = 0 ; +#endif diff --git a/src/spicelib/devices/bsim4/bsim4init.c b/src/spicelib/devices/bsim4/bsim4init.c index f70f5c7d6..3c14316f7 100644 --- a/src/spicelib/devices/bsim4/bsim4init.c +++ b/src/spicelib/devices/bsim4/bsim4init.c @@ -71,6 +71,8 @@ SPICEdev BSIM4info = { .DEVbindCSC = BSIM4bindCSC, .DEVbindCSCComplex = BSIM4bindCSCComplex, .DEVbindCSCComplexToReal = BSIM4bindCSCComplexToReal, + .DEVisLinear = &BSIM4isLinear, + .DEVisLinearStatic = &BSIM4isLinearStatic, #endif }; diff --git a/src/spicelib/devices/bsim4/bsim4init.h b/src/spicelib/devices/bsim4/bsim4init.h index 11faee141..715837d5f 100644 --- a/src/spicelib/devices/bsim4/bsim4init.h +++ b/src/spicelib/devices/bsim4/bsim4init.h @@ -10,4 +10,9 @@ extern int BSIM4nSize; extern int BSIM4iSize; extern int BSIM4mSize; +#ifdef KLU +extern int BSIM4isLinear ; +extern int BSIM4isLinearStatic ; +#endif + #endif diff --git a/src/spicelib/devices/cap/cap.c b/src/spicelib/devices/cap/cap.c index afcb58d29..657f20867 100644 --- a/src/spicelib/devices/cap/cap.c +++ b/src/spicelib/devices/cap/cap.c @@ -69,3 +69,8 @@ int CAPpTSize = NUMELEMS(CAPpTable); int CAPmPTSize = NUMELEMS(CAPmPTable); int CAPiSize = sizeof(CAPinstance); int CAPmSize = sizeof(CAPmodel); + +#ifdef KLU +int CAPisLinear = 1 ; +int CAPisLinearStatic = 0 ; +#endif diff --git a/src/spicelib/devices/cap/capbindCSC.c b/src/spicelib/devices/cap/capbindCSC.c index 77a37f7fc..520304606 100644 --- a/src/spicelib/devices/cap/capbindCSC.c +++ b/src/spicelib/devices/cap/capbindCSC.c @@ -39,10 +39,10 @@ CAPbindCSC (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = CAPinstances(model); here != NULL ; here = CAPnextInstance(here)) { - CREATE_KLU_BINDING_TABLE(CAPposPosPtr, CAPposPosBinding, CAPposNode, CAPposNode); - CREATE_KLU_BINDING_TABLE(CAPnegNegPtr, CAPnegNegBinding, CAPnegNode, CAPnegNode); - CREATE_KLU_BINDING_TABLE(CAPposNegPtr, CAPposNegBinding, CAPposNode, CAPnegNode); - CREATE_KLU_BINDING_TABLE(CAPnegPosPtr, CAPnegPosBinding, CAPnegNode, CAPposNode); + CREATE_KLU_BINDING_TABLE_DYNAMIC(CAPposPosPtr, CAPposPosBinding, CAPposNode, CAPposNode); + CREATE_KLU_BINDING_TABLE_DYNAMIC(CAPnegNegPtr, CAPnegNegBinding, CAPnegNode, CAPnegNode); + CREATE_KLU_BINDING_TABLE_DYNAMIC(CAPposNegPtr, CAPposNegBinding, CAPposNode, CAPnegNode); + CREATE_KLU_BINDING_TABLE_DYNAMIC(CAPnegPosPtr, CAPnegPosBinding, CAPnegNode, CAPposNode); } } @@ -63,10 +63,10 @@ CAPbindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = CAPinstances(model); here != NULL ; here = CAPnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(CAPposPosPtr, CAPposPosBinding, CAPposNode, CAPposNode); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(CAPnegNegPtr, CAPnegNegBinding, CAPnegNode, CAPnegNode); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(CAPposNegPtr, CAPposNegBinding, CAPposNode, CAPnegNode); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(CAPnegPosPtr, CAPnegPosBinding, CAPnegNode, CAPposNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(CAPposPosPtr, CAPposPosBinding, CAPposNode, CAPposNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(CAPnegNegPtr, CAPnegNegBinding, CAPnegNode, CAPnegNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(CAPposNegPtr, CAPposNegBinding, CAPposNode, CAPnegNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(CAPnegPosPtr, CAPnegPosBinding, CAPnegNode, CAPposNode); } } @@ -87,10 +87,10 @@ CAPbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = CAPinstances(model); here != NULL ; here = CAPnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_REAL(CAPposPosPtr, CAPposPosBinding, CAPposNode, CAPposNode); - CONVERT_KLU_BINDING_TABLE_TO_REAL(CAPnegNegPtr, CAPnegNegBinding, CAPnegNode, CAPnegNode); - CONVERT_KLU_BINDING_TABLE_TO_REAL(CAPposNegPtr, CAPposNegBinding, CAPposNode, CAPnegNode); - CONVERT_KLU_BINDING_TABLE_TO_REAL(CAPnegPosPtr, CAPnegPosBinding, CAPnegNode, CAPposNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(CAPposPosPtr, CAPposPosBinding, CAPposNode, CAPposNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(CAPnegNegPtr, CAPnegNegBinding, CAPnegNode, CAPnegNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(CAPposNegPtr, CAPposNegBinding, CAPposNode, CAPnegNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(CAPnegPosPtr, CAPnegPosBinding, CAPnegNode, CAPposNode); } } diff --git a/src/spicelib/devices/cap/capinit.c b/src/spicelib/devices/cap/capinit.c index 41444a1d7..ccde3b8d7 100644 --- a/src/spicelib/devices/cap/capinit.c +++ b/src/spicelib/devices/cap/capinit.c @@ -71,6 +71,8 @@ SPICEdev CAPinfo = { .DEVbindCSC = CAPbindCSC, .DEVbindCSCComplex = CAPbindCSCComplex, .DEVbindCSCComplexToReal = CAPbindCSCComplexToReal, + .DEVisLinear = &CAPisLinear, + .DEVisLinearStatic = &CAPisLinearStatic, #endif }; diff --git a/src/spicelib/devices/cap/capinit.h b/src/spicelib/devices/cap/capinit.h index 143abfb62..dd4d3b857 100644 --- a/src/spicelib/devices/cap/capinit.h +++ b/src/spicelib/devices/cap/capinit.h @@ -10,4 +10,9 @@ extern int CAPnSize; extern int CAPiSize; extern int CAPmSize; +#ifdef KLU +extern int CAPisLinear ; +extern int CAPisLinearStatic ; +#endif + #endif diff --git a/src/spicelib/devices/ind/ind.c b/src/spicelib/devices/ind/ind.c index 97356b503..bece3cb26 100644 --- a/src/spicelib/devices/ind/ind.c +++ b/src/spicelib/devices/ind/ind.c @@ -63,6 +63,11 @@ int INDmPTSize = NUMELEMS(INDmPTable); int INDiSize = sizeof(INDinstance); int INDmSize = sizeof(INDmodel); +#ifdef KLU +int INDisLinear = 1 ; +int INDisLinearStatic = 0 ; +#endif + #ifdef MUTUAL IFparm MUTpTable[] = { /* parameters */ @@ -87,4 +92,9 @@ int MUTmPTSize = 0; int MUTiSize = sizeof(INDinstance); int MUTmSize = sizeof(INDmodel); +#ifdef KLU +int MUTisLinear = 1 ; +int MUTisLinearStatic = 0 ; +#endif + #endif /*MUTUAL*/ diff --git a/src/spicelib/devices/ind/indbindCSC.c b/src/spicelib/devices/ind/indbindCSC.c index 609c0ed2c..44c096a63 100644 --- a/src/spicelib/devices/ind/indbindCSC.c +++ b/src/spicelib/devices/ind/indbindCSC.c @@ -39,11 +39,11 @@ INDbindCSC (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = INDinstances(model); here != NULL ; here = INDnextInstance(here)) { - CREATE_KLU_BINDING_TABLE(INDposIbrPtr, INDposIbrBinding, INDposNode, INDbrEq); - CREATE_KLU_BINDING_TABLE(INDnegIbrPtr, INDnegIbrBinding, INDnegNode, INDbrEq); - CREATE_KLU_BINDING_TABLE(INDibrNegPtr, INDibrNegBinding, INDbrEq, INDnegNode); - CREATE_KLU_BINDING_TABLE(INDibrPosPtr, INDibrPosBinding, INDbrEq, INDposNode); - CREATE_KLU_BINDING_TABLE(INDibrIbrPtr, INDibrIbrBinding, INDbrEq, INDbrEq); + CREATE_KLU_BINDING_TABLE_DYNAMIC(INDposIbrPtr, INDposIbrBinding, INDposNode, INDbrEq); + CREATE_KLU_BINDING_TABLE_DYNAMIC(INDnegIbrPtr, INDnegIbrBinding, INDnegNode, INDbrEq); + CREATE_KLU_BINDING_TABLE_DYNAMIC(INDibrNegPtr, INDibrNegBinding, INDbrEq, INDnegNode); + CREATE_KLU_BINDING_TABLE_DYNAMIC(INDibrPosPtr, INDibrPosBinding, INDbrEq, INDposNode); + CREATE_KLU_BINDING_TABLE_DYNAMIC(INDibrIbrPtr, INDibrIbrBinding, INDbrEq, INDbrEq); } } @@ -64,11 +64,11 @@ INDbindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = INDinstances(model); here != NULL ; here = INDnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(INDposIbrPtr, INDposIbrBinding, INDposNode, INDbrEq); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(INDnegIbrPtr, INDnegIbrBinding, INDnegNode, INDbrEq); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(INDibrNegPtr, INDibrNegBinding, INDbrEq, INDnegNode); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(INDibrPosPtr, INDibrPosBinding, INDbrEq, INDposNode); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(INDibrIbrPtr, INDibrIbrBinding, INDbrEq, INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(INDposIbrPtr, INDposIbrBinding, INDposNode, INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(INDnegIbrPtr, INDnegIbrBinding, INDnegNode, INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(INDibrNegPtr, INDibrNegBinding, INDbrEq, INDnegNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(INDibrPosPtr, INDibrPosBinding, INDbrEq, INDposNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(INDibrIbrPtr, INDibrIbrBinding, INDbrEq, INDbrEq); } } @@ -89,11 +89,11 @@ INDbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = INDinstances(model); here != NULL ; here = INDnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_REAL(INDposIbrPtr, INDposIbrBinding, INDposNode, INDbrEq); - CONVERT_KLU_BINDING_TABLE_TO_REAL(INDnegIbrPtr, INDnegIbrBinding, INDnegNode, INDbrEq); - CONVERT_KLU_BINDING_TABLE_TO_REAL(INDibrNegPtr, INDibrNegBinding, INDbrEq, INDnegNode); - CONVERT_KLU_BINDING_TABLE_TO_REAL(INDibrPosPtr, INDibrPosBinding, INDbrEq, INDposNode); - CONVERT_KLU_BINDING_TABLE_TO_REAL(INDibrIbrPtr, INDibrIbrBinding, INDbrEq, INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(INDposIbrPtr, INDposIbrBinding, INDposNode, INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(INDnegIbrPtr, INDnegIbrBinding, INDnegNode, INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(INDibrNegPtr, INDibrNegBinding, INDbrEq, INDnegNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(INDibrPosPtr, INDibrPosBinding, INDbrEq, INDposNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(INDibrIbrPtr, INDibrIbrBinding, INDbrEq, INDbrEq); } } diff --git a/src/spicelib/devices/ind/indinit.c b/src/spicelib/devices/ind/indinit.c index abc0aa57c..4080ac213 100644 --- a/src/spicelib/devices/ind/indinit.c +++ b/src/spicelib/devices/ind/indinit.c @@ -71,6 +71,8 @@ SPICEdev INDinfo = { .DEVbindCSC = INDbindCSC, .DEVbindCSCComplex = INDbindCSCComplex, .DEVbindCSCComplexToReal = INDbindCSCComplexToReal, + .DEVisLinear = &INDisLinear, + .DEVisLinearStatic = &INDisLinearStatic, #endif }; @@ -139,6 +141,8 @@ SPICEdev MUTinfo = { .DEVbindCSC = MUTbindCSC, .DEVbindCSCComplex = MUTbindCSCComplex, .DEVbindCSCComplexToReal = MUTbindCSCComplexToReal, + .DEVisLinear = &MUTisLinear, + .DEVisLinearStatic = &MUTisLinearStatic, #endif }; diff --git a/src/spicelib/devices/ind/indinit.h b/src/spicelib/devices/ind/indinit.h index dafe8e5e4..ed3fd57ea 100644 --- a/src/spicelib/devices/ind/indinit.h +++ b/src/spicelib/devices/ind/indinit.h @@ -16,4 +16,11 @@ extern int MUTpTSize; extern int MUTiSize; extern int MUTmSize; +#ifdef KLU +extern int INDisLinear ; +extern int INDisLinearStatic ; +extern int MUTisLinear ; +extern int MUTisLinearStatic ; +#endif + #endif diff --git a/src/spicelib/devices/ind/mutbindCSC.c b/src/spicelib/devices/ind/mutbindCSC.c index d17ebf640..3a775d824 100644 --- a/src/spicelib/devices/ind/mutbindCSC.c +++ b/src/spicelib/devices/ind/mutbindCSC.c @@ -39,8 +39,8 @@ MUTbindCSC (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = MUTinstances(model); here != NULL ; here = MUTnextInstance(here)) { - CREATE_KLU_BINDING_TABLE(MUTbr1br2Ptr, MUTbr1br2Binding, MUTind1->INDbrEq, MUTind2->INDbrEq); - CREATE_KLU_BINDING_TABLE(MUTbr2br1Ptr, MUTbr2br1Binding, MUTind2->INDbrEq, MUTind1->INDbrEq); + CREATE_KLU_BINDING_TABLE_DYNAMIC(MUTbr1br2Ptr, MUTbr1br2Binding, MUTind1->INDbrEq, MUTind2->INDbrEq); + CREATE_KLU_BINDING_TABLE_DYNAMIC(MUTbr2br1Ptr, MUTbr2br1Binding, MUTind2->INDbrEq, MUTind1->INDbrEq); } } @@ -61,8 +61,8 @@ MUTbindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = MUTinstances(model); here != NULL ; here = MUTnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(MUTbr1br2Ptr, MUTbr1br2Binding, MUTind1->INDbrEq, MUTind2->INDbrEq); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(MUTbr2br1Ptr, MUTbr2br1Binding, MUTind2->INDbrEq, MUTind1->INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(MUTbr1br2Ptr, MUTbr1br2Binding, MUTind1->INDbrEq, MUTind2->INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(MUTbr2br1Ptr, MUTbr2br1Binding, MUTind2->INDbrEq, MUTind1->INDbrEq); } } @@ -83,8 +83,8 @@ MUTbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = MUTinstances(model); here != NULL ; here = MUTnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_REAL(MUTbr1br2Ptr, MUTbr1br2Binding, MUTind1->INDbrEq, MUTind2->INDbrEq); - CONVERT_KLU_BINDING_TABLE_TO_REAL(MUTbr2br1Ptr, MUTbr2br1Binding, MUTind2->INDbrEq, MUTind1->INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(MUTbr1br2Ptr, MUTbr1br2Binding, MUTind1->INDbrEq, MUTind2->INDbrEq); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(MUTbr2br1Ptr, MUTbr2br1Binding, MUTind2->INDbrEq, MUTind1->INDbrEq); } } diff --git a/src/spicelib/devices/res/res.c b/src/spicelib/devices/res/res.c index 9e76a8dcf..47cb35150 100644 --- a/src/spicelib/devices/res/res.c +++ b/src/spicelib/devices/res/res.c @@ -77,3 +77,8 @@ int RESpTSize = NUMELEMS(RESpTable); int RESmPTSize = NUMELEMS(RESmPTable); int RESiSize = sizeof(RESinstance); int RESmSize = sizeof(RESmodel); + +#ifdef KLU +int RESisLinear = 1 ; +int RESisLinearStatic = 1 ; +#endif diff --git a/src/spicelib/devices/res/resbindCSC.c b/src/spicelib/devices/res/resbindCSC.c index 99a2b4c27..4b8159036 100644 --- a/src/spicelib/devices/res/resbindCSC.c +++ b/src/spicelib/devices/res/resbindCSC.c @@ -39,10 +39,10 @@ RESbindCSC (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = RESinstances(model); here != NULL ; here = RESnextInstance(here)) { - CREATE_KLU_BINDING_TABLE(RESposPosPtr, RESposPosBinding, RESposNode, RESposNode); - CREATE_KLU_BINDING_TABLE(RESnegNegPtr, RESnegNegBinding, RESnegNode, RESnegNode); - CREATE_KLU_BINDING_TABLE(RESposNegPtr, RESposNegBinding, RESposNode, RESnegNode); - CREATE_KLU_BINDING_TABLE(RESnegPosPtr, RESnegPosBinding, RESnegNode, RESposNode); + CREATE_KLU_BINDING_TABLE_STATIC(RESposPosPtr, RESposPosBinding, RESposNode, RESposNode); + CREATE_KLU_BINDING_TABLE_STATIC(RESnegNegPtr, RESnegNegBinding, RESnegNode, RESnegNode); + CREATE_KLU_BINDING_TABLE_STATIC(RESposNegPtr, RESposNegBinding, RESposNode, RESnegNode); + CREATE_KLU_BINDING_TABLE_STATIC(RESnegPosPtr, RESnegPosBinding, RESnegNode, RESposNode); } } @@ -63,10 +63,10 @@ RESbindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = RESinstances(model); here != NULL ; here = RESnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(RESposPosPtr, RESposPosBinding, RESposNode, RESposNode); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(RESnegNegPtr, RESnegNegBinding, RESnegNode, RESnegNode); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(RESposNegPtr, RESposNegBinding, RESposNode, RESnegNode); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(RESnegPosPtr, RESnegPosBinding, RESnegNode, RESposNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_STATIC(RESposPosPtr, RESposPosBinding, RESposNode, RESposNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_STATIC(RESnegNegPtr, RESnegNegBinding, RESnegNode, RESnegNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_STATIC(RESposNegPtr, RESposNegBinding, RESposNode, RESnegNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_STATIC(RESnegPosPtr, RESnegPosBinding, RESnegNode, RESposNode); } } @@ -87,10 +87,10 @@ RESbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = RESinstances(model); here != NULL ; here = RESnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_REAL(RESposPosPtr, RESposPosBinding, RESposNode, RESposNode); - CONVERT_KLU_BINDING_TABLE_TO_REAL(RESnegNegPtr, RESnegNegBinding, RESnegNode, RESnegNode); - CONVERT_KLU_BINDING_TABLE_TO_REAL(RESposNegPtr, RESposNegBinding, RESposNode, RESnegNode); - CONVERT_KLU_BINDING_TABLE_TO_REAL(RESnegPosPtr, RESnegPosBinding, RESnegNode, RESposNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_STATIC(RESposPosPtr, RESposPosBinding, RESposNode, RESposNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_STATIC(RESnegNegPtr, RESnegNegBinding, RESnegNode, RESnegNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_STATIC(RESposNegPtr, RESposNegBinding, RESposNode, RESnegNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_STATIC(RESnegPosPtr, RESnegPosBinding, RESnegNode, RESposNode); } } diff --git a/src/spicelib/devices/res/resinit.c b/src/spicelib/devices/res/resinit.c index 10a3d00b6..81681fc68 100644 --- a/src/spicelib/devices/res/resinit.c +++ b/src/spicelib/devices/res/resinit.c @@ -71,6 +71,8 @@ SPICEdev RESinfo = { .DEVbindCSC = RESbindCSC, .DEVbindCSCComplex = RESbindCSCComplex, .DEVbindCSCComplexToReal = RESbindCSCComplexToReal, + .DEVisLinear = &RESisLinear, + .DEVisLinearStatic = &RESisLinearStatic, #endif }; diff --git a/src/spicelib/devices/res/resinit.h b/src/spicelib/devices/res/resinit.h index b3f71595f..464c69d32 100644 --- a/src/spicelib/devices/res/resinit.h +++ b/src/spicelib/devices/res/resinit.h @@ -10,4 +10,9 @@ extern int RESnSize; extern int RESiSize; extern int RESmSize; +#ifdef KLU +extern int RESisLinear ; +extern int RESisLinearStatic ; +#endif + #endif diff --git a/src/spicelib/devices/vsrc/vsrc.c b/src/spicelib/devices/vsrc/vsrc.c index 8b32979bd..91e481363 100644 --- a/src/spicelib/devices/vsrc/vsrc.c +++ b/src/spicelib/devices/vsrc/vsrc.c @@ -52,3 +52,8 @@ int VSRCpTSize = NUMELEMS(VSRCpTable); int VSRCmPTSize = 0; int VSRCiSize = sizeof(VSRCinstance); int VSRCmSize = sizeof(VSRCmodel); + +#ifdef KLU +int VSRCisLinear = 0 ; +int VSRCisLinearStatic = 0 ; +#endif diff --git a/src/spicelib/devices/vsrc/vsrcinit.c b/src/spicelib/devices/vsrc/vsrcinit.c index f43ad2b9e..c3b5cb7c0 100644 --- a/src/spicelib/devices/vsrc/vsrcinit.c +++ b/src/spicelib/devices/vsrc/vsrcinit.c @@ -71,6 +71,8 @@ SPICEdev VSRCinfo = { .DEVbindCSC = VSRCbindCSC, .DEVbindCSCComplex = VSRCbindCSCComplex, .DEVbindCSCComplexToReal = VSRCbindCSCComplexToReal, + .DEVisLinear = &VSRCisLinear, + .DEVisLinearStatic = &VSRCisLinearStatic, #endif }; diff --git a/src/spicelib/devices/vsrc/vsrcinit.h b/src/spicelib/devices/vsrc/vsrcinit.h index e11a2dd67..5066c1bd8 100644 --- a/src/spicelib/devices/vsrc/vsrcinit.h +++ b/src/spicelib/devices/vsrc/vsrcinit.h @@ -8,4 +8,9 @@ extern int VSRCnSize; extern int VSRCiSize; extern int VSRCmSize; +#ifdef KLU +extern int VSRCisLinear ; +extern int VSRCisLinearStatic ; +#endif + #endif