Browse Source

Getting rid of SPARSE for Initial Circuit Matrix creation. Now KLU is totally independent from SPARSE. This opens up the interface for other solvers as well

SPARSE can still used through '.options sparse', but it isn't possible to switch from KLU to SPARSE and viceversa at run-time
pre-master-46
Francesco Lannutti 6 years ago
committed by Holger Vogt
parent
commit
fe89da2b2c
  1. 8
      src/ciderlib/oned/oneadmit.c
  2. 77
      src/ciderlib/oned/onecont.c
  3. 51
      src/ciderlib/oned/onepoiss.c
  4. 21
      src/ciderlib/oned/onesolve.c
  5. 12
      src/ciderlib/twod/twoadmit.c
  6. 6
      src/ciderlib/twod/twocont.c
  7. 6
      src/ciderlib/twod/twoncont.c
  8. 6
      src/ciderlib/twod/twopcont.c
  9. 6
      src/ciderlib/twod/twopoiss.c
  10. 27
      src/ciderlib/twod/twosolve.c
  11. 2
      src/include/ngspice/cktdefs.h
  12. 128
      src/include/ngspice/klu-binding.h
  13. 69
      src/include/ngspice/klu.h
  14. 54
      src/include/ngspice/onemesh.h
  15. 30
      src/include/ngspice/smpdefs.h
  16. 15
      src/include/ngspice/spmatrix.h
  17. 2
      src/include/ngspice/tskdefs.h
  18. 123
      src/include/ngspice/twomesh.h
  19. 4
      src/maths/KLU/klu_defaults.c
  20. 835
      src/maths/KLU/klusmp.c
  21. 18
      src/maths/ni/niinit.c
  22. 6
      src/maths/sparse/Makefile.am
  23. 174
      src/maths/sparse/spCSC.c
  24. 10
      src/spicelib/analysis/acan.c
  25. 15
      src/spicelib/analysis/cktacct.c
  26. 85
      src/spicelib/analysis/cktpzset.c
  27. 101
      src/spicelib/analysis/cktsens.c
  28. 74
      src/spicelib/analysis/cktsetup.c
  29. 20
      src/spicelib/devices/adms/admst/ngspiceMODULEbindCSC.c.xml
  30. 20
      src/spicelib/devices/asrc/asrcbindCSC.c
  31. 20
      src/spicelib/devices/bjt/bjtbindCSC.c
  32. 20
      src/spicelib/devices/bsim1/b1bindCSC.c
  33. 20
      src/spicelib/devices/bsim2/b2bindCSC.c
  34. 20
      src/spicelib/devices/bsim3/b3bindCSC.c
  35. 20
      src/spicelib/devices/bsim3soi_dd/b3soiddbindCSC.c
  36. 20
      src/spicelib/devices/bsim3soi_fd/b3soifdbindCSC.c
  37. 20
      src/spicelib/devices/bsim3soi_pd/b3soipdbindCSC.c
  38. 20
      src/spicelib/devices/bsim3v0/b3v0bindCSC.c
  39. 20
      src/spicelib/devices/bsim3v1/b3v1bindCSC.c
  40. 20
      src/spicelib/devices/bsim3v32/b3v32bindCSC.c
  41. 20
      src/spicelib/devices/bsim4/b4bindCSC.c
  42. 20
      src/spicelib/devices/bsim4v5/b4v5bindCSC.c
  43. 20
      src/spicelib/devices/bsim4v6/b4v6bindCSC.c
  44. 20
      src/spicelib/devices/bsim4v7/b4v7bindCSC.c
  45. 20
      src/spicelib/devices/bsimsoi/b4soibindCSC.c
  46. 20
      src/spicelib/devices/cap/capbindCSC.c
  47. 20
      src/spicelib/devices/cccs/cccsbindCSC.c
  48. 20
      src/spicelib/devices/ccvs/ccvsbindCSC.c
  49. 21
      src/spicelib/devices/cpl/cplbindCSC.c
  50. 20
      src/spicelib/devices/csw/cswbindCSC.c
  51. 20
      src/spicelib/devices/dio/diobindCSC.c
  52. 20
      src/spicelib/devices/hfet1/hfetbindCSC.c
  53. 20
      src/spicelib/devices/hfet2/hfet2bindCSC.c
  54. 20
      src/spicelib/devices/hisim2/hsm2bindCSC.c
  55. 20
      src/spicelib/devices/hisimhv1/hsmhvbindCSC.c
  56. 20
      src/spicelib/devices/hisimhv2/hsmhv2bindCSC.c
  57. 20
      src/spicelib/devices/ind/indbindCSC.c
  58. 20
      src/spicelib/devices/ind/mutbindCSC.c
  59. 20
      src/spicelib/devices/jfet/jfetbindCSC.c
  60. 20
      src/spicelib/devices/jfet2/jfet2bindCSC.c
  61. 20
      src/spicelib/devices/ltra/ltrabindCSC.c
  62. 20
      src/spicelib/devices/mes/mesbindCSC.c
  63. 20
      src/spicelib/devices/mesa/mesabindCSC.c
  64. 20
      src/spicelib/devices/mos1/mos1bindCSC.c
  65. 20
      src/spicelib/devices/mos2/mos2bindCSC.c
  66. 20
      src/spicelib/devices/mos3/mos3bindCSC.c
  67. 20
      src/spicelib/devices/mos6/mos6bindCSC.c
  68. 20
      src/spicelib/devices/mos9/mos9bindCSC.c
  69. 20
      src/spicelib/devices/nbjt/nbjtbindCSC.c
  70. 20
      src/spicelib/devices/nbjt2/nbjt2bindCSC.c
  71. 20
      src/spicelib/devices/numd/numdbindCSC.c
  72. 20
      src/spicelib/devices/numd2/numd2bindCSC.c
  73. 20
      src/spicelib/devices/numos/numosbindCSC.c
  74. 20
      src/spicelib/devices/res/resbindCSC.c
  75. 20
      src/spicelib/devices/soi3/soi3bindCSC.c
  76. 20
      src/spicelib/devices/sw/swbindCSC.c
  77. 20
      src/spicelib/devices/tra/trabindCSC.c
  78. 20
      src/spicelib/devices/txl/txlbindCSC.c
  79. 20
      src/spicelib/devices/vbic/vbicbindCSC.c
  80. 20
      src/spicelib/devices/vccs/vccsbindCSC.c
  81. 20
      src/spicelib/devices/vcvs/vcvsbindCSC.c
  82. 24
      src/spicelib/devices/vsrc/vsrcbindCSC.c
  83. 20
      src/xspice/mif/mifbindCSC.c

8
src/ciderlib/oned/oneadmit.c

@ -119,7 +119,7 @@ NUMDadmittance(ONEdevice *pDevice, double omega, SPcomplex *yd)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif
@ -315,7 +315,7 @@ NBJTadmittance(ONEdevice *pDevice, double omega, SPcomplex *yIeVce,
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif
@ -580,7 +580,7 @@ NUMDys(ONEdevice *pDevice, SPcomplex *s, SPcomplex *yd)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif
@ -667,7 +667,7 @@ NBJTys(ONEdevice *pDevice, SPcomplex *s, SPcomplex *yIeVce,
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif

77
src/ciderlib/oned/onecont.c

@ -251,77 +251,6 @@ ONE_jacBuild(ONEdevice *pDevice)
}
#ifdef KLU
/*
#define CREATE_KLU_BINDING_TABLE_CIDER(ptr, binding, a, b) \
printf ("Swapping Pointer %s: (%d,%d)\n", #ptr, a, b) ; \
if ((a > 0) && (b > 0)) { \
if (pNode->binding != NULL) { \
if (pNode->binding->CSC_Complex != NULL) { \
printf (" Looking for the Pointer: %p\n", pNode->binding->CSC_Complex) ; \
qsort (BindStructCSC, nz, sizeof(BindKluElementCOO), BindKluCompareCSC) ; \
i.COO = NULL ; \
i.CSC_Complex = pNode->binding->CSC_Complex ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStructCSC, nz, sizeof(BindKluElementCOO), BindKluCompareCSC) ; \
if (matched != NULL) { \
printf (" Found the Old Pointer\n") ; \
pNode->ptr = pNode->binding->CSC_Complex ; \
} else { \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
if (matched != NULL) { \
printf (" Looking for the Pointer 1\n") ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} else { \
printf (" Leaving the Pointer as is\n") ; \
} \
} \
} else { \
printf (" Looking for the Pointer 2\n") ; \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
} else { \
printf (" Looking for the Pointer 3\n") ; \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
}
*/
/*
#define CREATE_KLU_BINDING_TABLE_CIDER_TO_REAL(ptr, binding, a, b) \
if ((a > 0) && (b > 0)) { \
printf ("Macro\n") ; \
if (pNode->binding) { \
printf ("IF: %p\n", pNode->binding) ; \
printf ("COO: %p\n", pNode->binding->COO) ; \
printf ("CSC: %p\n", pNode->binding->CSC) ; \
if (pNode->binding->CSC_Complex) { \
printf ("CSC_Complex: %p\n", pNode->binding->CSC_Complex) ; \
pNode->ptr = pNode->binding->CSC_Complex ; \
} else { \
i = pNode->ptr ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
} else { \
i = pNode->ptr ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
}
*/
void
ONEbindCSC (ONEdevice *pDevice)
{
@ -331,13 +260,13 @@ ONEbindCSC (ONEdevice *pDevice)
int psiEqn, nEqn, pEqn; /* scratch for deref'd eqn numbers */
int psiEqnL=0, nEqnL=0, pEqnL=0;
int psiEqnR=0, nEqnR=0, pEqnR=0;
BindKluElementCOO i, *matched, *BindStruct, *BindStructCSC ;
BindElementKLUforCIDER i, *matched, *BindStruct, *BindStructCSC ;
size_t nz ;
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructForCIDER ;
nz = pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
BindStructCSC = (BindKluElementCOO *) malloc (nz * sizeof(BindKluElementCOO)) ;
BindStructCSC = (BindElementKLUforCIDER *) malloc (nz * sizeof (BindElementKLUforCIDER)) ;
for (index = 0 ; index < (int)nz ; index++) {
BindStructCSC [index] = BindStruct [index] ;
}

51
src/ciderlib/oned/onepoiss.c

@ -70,64 +70,19 @@ ONEQjacBuild(ONEdevice *pDevice)
}
#ifdef KLU
/*
#define CREATE_KLU_BINDING_TABLE_CIDER(ptr, binding, a, b) \
printf ("Swapping Pointer %s: (%d,%d)\n", #ptr, a, b) ; \
if ((a > 0) && (b > 0)) { \
if (pNode->binding != NULL) { \
if (pNode->binding->CSC_Complex != NULL) { \
printf (" Looking for the Pointer: %p\n", pNode->binding->CSC_Complex) ; \
qsort (BindStructCSC, nz, sizeof(BindKluElementCOO), BindKluCompareCSC) ; \
i.COO = NULL ; \
i.CSC_Complex = pNode->binding->CSC_Complex ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStructCSC, nz, sizeof(BindKluElementCOO), BindKluCompareCSC) ; \
if (matched != NULL) { \
printf (" Found the Old Pointer\n") ; \
pNode->ptr = pNode->binding->CSC_Complex ; \
} else { \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
if (matched != NULL) { \
printf (" Looking for the Pointer 1\n") ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} else { \
printf (" Leaving the Pointer as is\n") ; \
} \
} \
} else { \
printf (" Looking for the Pointer 2\n") ; \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
} else { \
printf (" Looking for the Pointer 3\n") ; \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
}
*/
void
ONEQbindCSC (ONEdevice *pDevice)
{
ONEelem *pElem ;
ONEnode *pNode, *pNode1 ;
int index ;
BindKluElementCOO i, *matched, *BindStruct, *BindStructCSC ;
BindElementKLUforCIDER i, *matched, *BindStruct, *BindStructCSC ;
size_t nz ;
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructForCIDER ;
nz = pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
BindStructCSC = (BindKluElementCOO *) malloc (nz * sizeof(BindKluElementCOO)) ;
BindStructCSC = (BindElementKLUforCIDER *) malloc (nz * sizeof (BindElementKLUforCIDER)) ;
for (index = 0 ; index < (int)nz ; index++) {
BindStructCSC [index] = BindStruct [index] ;
}

21
src/ciderlib/oned/onesolve.c

@ -592,7 +592,7 @@ ONEequilSolve(ONEdevice *pDevice)
#ifdef KLU
pDevice->matrix->CKTkluMODE = CKTkluON ; /* Francesco Lannutti - To be sustitued with a value coming from the uplevel */
error = SMPnewMatrixKLUforCIDER (pDevice->matrix, pDevice->numEqns, CKTkluMatrixReal) ;
error = SMPnewMatrixKLUforCIDER (pDevice->matrix, pDevice->numEqns, KLUmatrixReal) ;
#else
error = SMPnewMatrixForCIDER (pDevice->matrix, pDevice->numEqns, 0) ;
#endif
@ -605,7 +605,7 @@ ONEequilSolve(ONEdevice *pDevice)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixReal ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUmatrixReal ;
} else {
#endif
@ -636,7 +636,8 @@ ONEequilSolve(ONEdevice *pDevice)
}
}
printf ("CIDER: KLU to be fixed: spElementCount\n") ;
pDevice->numOrigEquil = 0 ; // Francesco Lannutti - Fix for KLU
pDevice->numOrigEquil = 0 ; //pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->lnz + pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->unz
//+ pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->nzoff ;
} else {
pDevice->numOrigEquil = spElementCount (pDevice->matrix->SPmatrix) ;
}
@ -666,9 +667,8 @@ ONEequilSolve(ONEdevice *pDevice)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - Fix for KLU
printf ("CIDER: KLU to be fixed: spFillinCount\n") ;
pDevice->numFillEquil = 0 ;
pDevice->numFillEquil = pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->lnz + pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->unz
+ pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->nzoff - (int)pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
} else {
#endif
@ -752,7 +752,7 @@ ONEbiasSolve(ONEdevice *pDevice, int iterationLimit,
#ifdef KLU
pDevice->matrix->CKTkluMODE = CKTkluON ; /* Francesco Lannutti - To be sustitued with a value coming from the uplevel */
error = SMPnewMatrixKLUforCIDER (pDevice->matrix, pDevice->numEqns, CKTkluMatrixComplex) ;
error = SMPnewMatrixKLUforCIDER (pDevice->matrix, pDevice->numEqns, KLUMatrixComplex) ;
#else
error = SMPnewMatrixForCIDER (pDevice->matrix, pDevice->numEqns, 1) ;
#endif
@ -796,7 +796,7 @@ ONEbiasSolve(ONEdevice *pDevice, int iterationLimit,
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixReal ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUmatrixReal ;
} else {
#endif
@ -826,9 +826,8 @@ ONEbiasSolve(ONEdevice *pDevice, int iterationLimit,
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - Fix for KLU
printf ("CIDER: KLU to be fixed: spFillinCount\n") ;
pDevice->numFillBias = 0 ;
pDevice->numFillBias = pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->lnz + pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->unz
+ pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->nzoff - (int)pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
} else {
#endif

12
src/ciderlib/twod/twoadmit.c

@ -105,7 +105,7 @@ NUMD2admittance(TWOdevice *pDevice, double omega, SPcomplex *yd)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - To be completed
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif
@ -292,7 +292,7 @@ NBJT2admittance(TWOdevice *pDevice, double omega, SPcomplex *yIeVce,
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - To be completed
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif
@ -577,7 +577,7 @@ NUMOSadmittance(TWOdevice *pDevice, double omega, struct mosAdmittances *yAc)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - To be completed
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif
@ -1180,7 +1180,7 @@ NUMD2ys(TWOdevice *pDevice, SPcomplex *s, SPcomplex *yIn)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - To be completed
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif
@ -1277,7 +1277,7 @@ NBJT2ys(TWOdevice *pDevice, SPcomplex *s, SPcomplex *yIeVce, SPcomplex *yIcVce,
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - To be completed
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif
@ -1399,7 +1399,7 @@ NUMOSys(TWOdevice *pDevice, SPcomplex *s, struct mosAdmittances *yAc)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - To be completed
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixComplex ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
} else {
#endif

6
src/ciderlib/twod/twocont.c

@ -902,7 +902,7 @@ TWObindCSC (TWOdevice *pDevice)
TWOelem *pElem;
TWOnode *pNode;
TWOchannel *pCh;
BindKluElementCOO i, *matched, *BindStruct, *BindStructCSC ;
BindElementKLUforCIDER i, *matched, *BindStruct, *BindStructCSC ;
int index ;
size_t nz ;
@ -916,10 +916,10 @@ TWObindCSC (TWOdevice *pDevice)
int psiEqnInM = 0, psiEqnInP = 0; /* scratch for deref'd surface eqns */
int psiEqnOxM = 0, psiEqnOxP = 0; /* M= more negative, P= more positive */
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructForCIDER ;
nz = pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
BindStructCSC = (BindKluElementCOO *) malloc (nz * sizeof(BindKluElementCOO)) ;
BindStructCSC = (BindElementKLUforCIDER *) malloc (nz * sizeof (BindElementKLUforCIDER)) ;
for (index = 0 ; index < (int)nz ; index++) {
BindStructCSC [index] = BindStruct [index] ;
}

6
src/ciderlib/twod/twoncont.c

@ -577,7 +577,7 @@ TWONbindCSC (TWOdevice *pDevice)
TWOelem *pElem;
TWOnode *pNode;
TWOchannel *pCh;
BindKluElementCOO i, *matched, *BindStruct, *BindStructCSC ;
BindElementKLUforCIDER i, *matched, *BindStruct, *BindStructCSC ;
int index ;
size_t nz ;
@ -591,10 +591,10 @@ TWONbindCSC (TWOdevice *pDevice)
int psiEqnInM = 0, psiEqnInP = 0; /* scratch for deref'd surface eqns */
int psiEqnOxM = 0, psiEqnOxP = 0; /* M= more negative, P= more positive */
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructForCIDER ;
nz = pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
BindStructCSC = (BindKluElementCOO *) malloc (nz * sizeof(BindKluElementCOO)) ;
BindStructCSC = (BindElementKLUforCIDER *) malloc (nz * sizeof (BindElementKLUforCIDER)) ;
for (index = 0 ; index < (int)nz ; index++) {
BindStructCSC [index] = BindStruct [index] ;
}

6
src/ciderlib/twod/twopcont.c

@ -577,7 +577,7 @@ TWOPbindCSC (TWOdevice *pDevice)
TWOelem *pElem;
TWOnode *pNode;
TWOchannel *pCh;
BindKluElementCOO i, *matched, *BindStruct, *BindStructCSC ;
BindElementKLUforCIDER i, *matched, *BindStruct, *BindStructCSC ;
int index ;
size_t nz ;
@ -591,10 +591,10 @@ TWOPbindCSC (TWOdevice *pDevice)
int psiEqnInM = 0, psiEqnInP = 0; /* scratch for deref'd surface eqns */
int psiEqnOxM = 0, psiEqnOxP = 0; /* M= more negative, P= more positive */
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructForCIDER ;
nz = pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
BindStructCSC = (BindKluElementCOO *) malloc (nz * sizeof(BindKluElementCOO)) ;
BindStructCSC = (BindElementKLUforCIDER *) malloc (nz * sizeof (BindElementKLUforCIDER)) ;
for (index = 0 ; index < (int)nz ; index++) {
BindStructCSC [index] = BindStruct [index] ;
}

6
src/ciderlib/twod/twopoiss.c

@ -165,13 +165,13 @@ TWOQbindCSC (TWOdevice *pDevice)
TWOnode *pNode, *pNode1;
int eIndex, nIndex;
int index ;
BindKluElementCOO i, *matched, *BindStruct, *BindStructCSC ;
BindElementKLUforCIDER i, *matched, *BindStruct, *BindStructCSC ;
size_t nz ;
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
BindStruct = pDevice->matrix->SMPkluMatrix->KLUmatrixBindStructForCIDER ;
nz = pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
BindStructCSC = (BindKluElementCOO *) malloc (nz * sizeof(BindKluElementCOO)) ;
BindStructCSC = (BindElementKLUforCIDER *) malloc (nz * sizeof (BindElementKLUforCIDER)) ;
for (index = 0 ; index < (int)nz ; index++) {
BindStructCSC [index] = BindStruct [index] ;
}

27
src/ciderlib/twod/twosolve.c

@ -505,7 +505,7 @@ int TWOequilSolve(TWOdevice *pDevice)
#ifdef KLU
pDevice->matrix->CKTkluMODE = CKTkluON ; /* Francesco Lannutti - To be sustitued with a value coming from the uplevel */
error = SMPnewMatrixKLUforCIDER (pDevice->matrix, pDevice->numEqns, CKTkluMatrixReal) ;
error = SMPnewMatrixKLUforCIDER (pDevice->matrix, pDevice->numEqns, KLUmatrixReal) ;
#else
error = SMPnewMatrixForCIDER (pDevice->matrix, pDevice->numEqns, 0) ;
#endif
@ -519,7 +519,7 @@ int TWOequilSolve(TWOdevice *pDevice)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixReal ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUmatrixReal ;
} else {
#endif
@ -550,7 +550,8 @@ int TWOequilSolve(TWOdevice *pDevice)
}
}
printf ("CIDER: KLU to be fixed: spElementCount\n") ;
pDevice->numOrigEquil = 0 ; // Francesco Lannutti - Fix for KLU
pDevice->numOrigEquil = 0 ; //pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->lnz + pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->unz
//+ pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->nzoff ;
} else {
pDevice->numOrigEquil = spElementCount (pDevice->matrix->SPmatrix) ;
}
@ -580,9 +581,8 @@ int TWOequilSolve(TWOdevice *pDevice)
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - Fix for KLU
printf ("CIDER: KLU to be fixed: spFillinCount\n") ;
pDevice->numFillEquil = 0 ;
pDevice->numFillEquil = pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->lnz + pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->unz
+ pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->nzoff - (int)pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
} else {
#endif
@ -666,7 +666,7 @@ TWObiasSolve(TWOdevice *pDevice, int iterationLimit, BOOLEAN tranAnalysis,
#ifdef KLU
pDevice->matrix->CKTkluMODE = CKTkluON ; /* Francesco Lannutti - To be sustitued with a value coming from the uplevel */
error = SMPnewMatrixKLUforCIDER (pDevice->matrix, pDevice->numEqns, CKTkluMatrixComplex) ;
error = SMPnewMatrixKLUforCIDER (pDevice->matrix, pDevice->numEqns, KLUMatrixComplex) ;
#else
error = SMPnewMatrixForCIDER (pDevice->matrix, pDevice->numEqns, 1) ;
#endif
@ -708,7 +708,9 @@ TWObiasSolve(TWOdevice *pDevice, int iterationLimit, BOOLEAN tranAnalysis,
return ; // Francesco Lannutti - Fix KLU return values
}
}
pDevice->numOrigBias = 0 ; // Francesco Lannutti - Fix for KLU
printf ("CIDER: KLU to be fixed: spElementCount\n") ;
pDevice->numOrigBias = 0 ; //pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->lnz + pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->unz
//+ pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->nzoff ;
} else {
pDevice->numOrigBias = spElementCount(pDevice->matrix->SPmatrix);
}
@ -723,7 +725,7 @@ TWObiasSolve(TWOdevice *pDevice, int iterationLimit, BOOLEAN tranAnalysis,
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = CKTkluMatrixReal ;
pDevice->matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUmatrixReal ;
} else {
#endif
@ -753,13 +755,12 @@ TWObiasSolve(TWOdevice *pDevice, int iterationLimit, BOOLEAN tranAnalysis,
#ifdef KLU
if (pDevice->matrix->CKTkluMODE) {
// Francesco Lannutti - Fix for KLU
printf ("CIDER: KLU to be fixed: spFillinCount\n") ;
pDevice->numFillBias = 0 ;
pDevice->numFillBias = pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->lnz + pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->unz
+ pDevice->matrix->SMPkluMatrix->KLUmatrixNumeric->nzoff - (int)pDevice->matrix->SMPkluMatrix->KLUmatrixNZ ;
} else {
#endif
pDevice->numFillBias = spFillinCount (pDevice->matrix->SPmatrix) ; // Francesco Lannutti - Fix for KLU
pDevice->numFillBias = spFillinCount (pDevice->matrix->SPmatrix) ;
#ifdef KLU
}

2
src/include/ngspice/cktdefs.h

@ -328,7 +328,7 @@ struct CKTcircuit {
#ifdef KLU
unsigned int CKTkluMODE:1;
unsigned int CKTkluMemGrowFactor : 1 ;
double CKTkluMemGrowFactor ;
#endif
};

128
src/include/ngspice/klu-binding.h

@ -1,101 +1,118 @@
#ifndef _KLU_BINDING_H
#define _KLU_BINDING_H
#include "ngspice/klu.h"
#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) ; \
if ((here->a > 0) && (here->b > 0)) { \
i.COO = here->ptr ; \
i.CSC = NULL ; \
i.CSC_Complex = NULL ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof (BindElement), BindCompare) ; \
if (matched == NULL) { \
printf ("Ptr %p not found in BindStruct Table\n", here->ptr) ; \
} \
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)) \
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)) \
if ((here->a > 0) && (here->b > 0)) \
here->ptr = here->binding->CSC ;
#ifdef XSPICE
#define CREATE_KLU_BINDING_TABLE_XSPICE_OUTPUTS(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_out->b != 0)) { \
i = smp_data_out->ptr ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; \
if ((smp_data_out->a > 0) && (smp_data_out->b > 0)) { \
i.COO = smp_data_out->ptr ; \
i.CSC = NULL ; \
i.CSC_Complex = NULL ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof (BindElement), BindCompare) ; \
smp_data_out->binding = matched ; \
smp_data_out->ptr = matched->CSC ; \
}
#define CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_XSPICE_OUTPUTS(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_out->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_out->b > 0)) \
smp_data_out->ptr = smp_data_out->binding->CSC_Complex ;
#define CONVERT_KLU_BINDING_TABLE_TO_REAL_XSPICE_OUTPUTS(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_out->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_out->b > 0)) \
smp_data_out->ptr = smp_data_out->binding->CSC ;
#define CREATE_KLU_BINDING_TABLE_XSPICE_INPUTS_E(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) { \
i = smp_data_out->input[k].port[l].ptr ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) { \
i.COO = smp_data_out->input[k].port[l].ptr ; \
i.CSC = NULL ; \
i.CSC_Complex = NULL ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof (BindElement), BindCompare) ; \
smp_data_out->input[k].port[l].e.binding = matched ; \
smp_data_out->input[k].port[l].ptr = matched->CSC ; \
}
#define CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_XSPICE_INPUTS_E(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) \
smp_data_out->input[k].port[l].ptr = smp_data_out->input[k].port[l].e.binding->CSC_Complex ;
#define CONVERT_KLU_BINDING_TABLE_TO_REAL_XSPICE_INPUTS_E(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) \
smp_data_out->input[k].port[l].ptr = smp_data_out->input[k].port[l].e.binding->CSC ;
#define CREATE_KLU_BINDING_TABLE_XSPICE_INPUTS_F(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) { \
i = smp_data_out->input[k].port[l].ptr ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) { \
i.COO = smp_data_out->input[k].port[l].ptr ; \
i.CSC = NULL ; \
i.CSC_Complex = NULL ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof (BindElement), BindCompare) ; \
smp_data_out->input[k].port[l].f.binding = matched ; \
smp_data_out->input[k].port[l].ptr = matched->CSC ; \
}
#define CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_XSPICE_INPUTS_F(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) \
smp_data_out->input[k].port[l].ptr = smp_data_out->input[k].port[l].f.binding->CSC_Complex ;
#define CONVERT_KLU_BINDING_TABLE_TO_REAL_XSPICE_INPUTS_F(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) \
smp_data_out->input[k].port[l].ptr = smp_data_out->input[k].port[l].f.binding->CSC ;
#define CREATE_KLU_BINDING_TABLE_XSPICE_INPUTS_G(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) { \
i = smp_data_out->input[k].port[l].ptr ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) { \
i.COO = smp_data_out->input[k].port[l].ptr ; \
i.CSC = NULL ; \
i.CSC_Complex = NULL ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof (BindElement), BindCompare) ; \
smp_data_out->input[k].port[l].g.binding = matched ; \
smp_data_out->input[k].port[l].ptr = matched->CSC ; \
}
#define CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_XSPICE_INPUTS_G(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) \
smp_data_out->input[k].port[l].ptr = smp_data_out->input[k].port[l].g.binding->CSC_Complex ;
#define CONVERT_KLU_BINDING_TABLE_TO_REAL_XSPICE_INPUTS_G(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) \
smp_data_out->input[k].port[l].ptr = smp_data_out->input[k].port[l].g.binding->CSC ;
#define CREATE_KLU_BINDING_TABLE_XSPICE_INPUTS_H(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) { \
i = smp_data_out->input[k].port[l].ptr ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) { \
i.COO = smp_data_out->input[k].port[l].ptr ; \
i.CSC = NULL ; \
i.CSC_Complex = NULL ; \
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof (BindElement), BindCompare) ; \
smp_data_out->input[k].port[l].h.binding = matched ; \
smp_data_out->input[k].port[l].ptr = matched->CSC ; \
}
#define CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_XSPICE_INPUTS_H(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) \
smp_data_out->input[k].port[l].ptr = smp_data_out->input[k].port[l].h.binding->CSC_Complex ;
#define CONVERT_KLU_BINDING_TABLE_TO_REAL_XSPICE_INPUTS_H(ptr, binding, a, b) \
if ((smp_data_out->a != 0) && (smp_data_cntl->b != 0)) \
if ((smp_data_out->a > 0) && (smp_data_cntl->b > 0)) \
smp_data_out->input[k].port[l].ptr = smp_data_out->input[k].port[l].h.binding->CSC ;
#endif
@ -104,34 +121,35 @@
if ((a > 0) && (b > 0)) { \
if (pNode->binding != NULL) { \
if (pNode->binding->CSC_Complex != NULL) { \
qsort (BindStructCSC, nz, sizeof(BindKluElementCOO), BindKluCompareCSC) ; \
i.COO = NULL ; \
i.CSC_Complex = pNode->binding->CSC_Complex ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStructCSC, nz, sizeof(BindKluElementCOO), BindKluCompareCSC) ; \
if (matched == NULL) { \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
if (matched != NULL) { \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
} \
} else { \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
qsort (BindStructCSC, nz, sizeof (BindElementKLUforCIDER), BindKluCompareCSCKLUforCIDER) ; \
i.COO = NULL ; \
i.CSC_Complex = pNode->binding->CSC_Complex ; \
matched = (BindElementKLUforCIDER *) bsearch (&i, BindStructCSC, nz, sizeof (BindElementKLUforCIDER), BindKluCompareCSCKLUforCIDER) ; \
if (matched == NULL) { \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindElementKLUforCIDER *) bsearch (&i, BindStruct, nz, sizeof (BindElementKLUforCIDER), BindCompareKLUforCIDER) ; \
if (matched != NULL) { \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
} \
} else { \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindElementKLUforCIDER *) bsearch (&i, BindStruct, nz, sizeof (BindElementKLUforCIDER), BindCompareKLUforCIDER) ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
} else { \
pNode->ptr = matched->CSC_Complex ; \
} \
} else { \
i.COO = pNode->ptr ; \
i.CSC_Complex = NULL ; \
matched = (BindKluElementCOO *) bsearch (&i, BindStruct, nz, sizeof(BindKluElementCOO), BindKluCompareCOO) ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
i.CSC_Complex = NULL ; \
matched = (BindElementKLUforCIDER *) bsearch (&i, BindStruct, nz, sizeof (BindElementKLUforCIDER), BindCompareKLUforCIDER) ; \
pNode->binding = matched ; \
pNode->ptr = matched->CSC_Complex ; \
} \
}
#endif
#endif

69
src/include/ngspice/klu.h

@ -935,34 +935,63 @@ int klu_z_convert_matrix_in_CSR
klu_common *Common
) ;
typedef struct sBindElement {
double *COO ;
double *CSC ;
double *CSC_Complex ;
} BindElement ;
#ifdef CIDER
typedef struct sBindKluElementCOO {
typedef struct sBindElementKLUforCIDER {
double *COO ;
double *CSC_Complex ;
} BindKluElementCOO ;
} BindElementKLUforCIDER ;
#endif
int BindKluCompareCOO (const void *a, const void *b) ;
int BindKluCompareCSC (const void *a, const void *b) ;
typedef struct sKluLinkedListCOO {
unsigned int row ;
unsigned int col ;
double *pointer ;
struct sKluLinkedListCOO *next ;
} KluLinkedListCOO ;
int BindCompare (const void *a, const void *b) ;
#ifdef CIDER
int BindCompareKLUforCIDER (const void *a, const void *b) ;
int BindKluCompareCSCKLUforCIDER (const void *a, const void *b) ;
#endif
typedef struct sKLUmatrix {
klu_common *KLUmatrixCommon ; /* KLU common object */
klu_symbolic *KLUmatrixSymbolic ; /* KLU symbolic object */
klu_numeric *KLUmatrixNumeric ; /* KLU numeric object */
int *KLUmatrixAp ; /* KLU column pointer */
int *KLUmatrixAi ; /* KLU row pointer */
double *KLUmatrixAxComplex ; /* KLU Complex Elements */
unsigned int KLUmatrixIsComplex:1 ; /* KLU Matrix Is Complex Flag */
double *KLUmatrixIntermediateComplex ; /* KLU iRHS Intermediate for Solve Complex Step */
unsigned int KLUmatrixN ; /* KLU N, copied */
unsigned int KLUmatrixNZ ; /* KLU nz, copied for AC Analysis */
int *KLUmatrixColCOO ; /* KLU Col Index for COO storage */
int *KLUmatrixRowCOO ; /* KLU Row Index for COO storage */
double *KLUmatrixValueComplexCOO ; /* KLU Complex Elements for COO storage */
BindKluElementCOO *KLUmatrixBindStructCOO ; /* KLU COO Binding Structure */
double *KLUmatrixTrashCOO ; /* KLU COO Trash Pointer for Ground Node not Stored in the Matrix */
} KLUmatrix ;
klu_common *KLUmatrixCommon ; /* KLU common object */
klu_symbolic *KLUmatrixSymbolic ; /* KLU symbolic object */
klu_numeric *KLUmatrixNumeric ; /* KLU numeric object */
int *KLUmatrixAp ; /* KLU column pointer */
int *KLUmatrixAi ; /* KLU row pointer */
double *KLUmatrixAx ; /* KLU Real Elements */
double *KLUmatrixAxComplex ; /* KLU Complex Elements */
unsigned int KLUmatrixIsComplex:1 ; /* KLU Matrix Is Complex Flag */
#define KLUmatrixReal 0 /* KLU Matrix Real definition */
#define KLUMatrixComplex 1 /* KLU Matrix Complex definition */
double *KLUmatrixIntermediate ; /* KLU RHS Intermediate for Solve Real Step */
double *KLUmatrixIntermediateComplex ; /* KLU iRHS Intermediate for Solve Complex Step */
unsigned int KLUmatrixN ; /* KLU N */
unsigned int KLUmatrixNZ ; /* KLU nz */
BindElement *KLUmatrixBindStructCOO ; /* KLU COO Binding Structure */
KluLinkedListCOO *KLUmatrixLinkedListCOO ; /* KLU COO in Linked List Format for Initial Parsing */
unsigned int KLUmatrixLinkedListNZ ; /* KLU nz for the Initial Parsing */
double *KLUmatrixTrashCOO ; /* KLU COO Trash Pointer for Ground Node not Stored in the Matrix */
double **KLUmatrixDiag ; /* KLU pointer to diagonal element to perform Gmin */
#ifdef CIDER
int *KLUmatrixColCOOforCIDER ; /* KLU Col Index for COO storage (for CIDER) */
int *KLUmatrixRowCOOforCIDER ; /* KLU Row Index for COO storage (for CIDER) */
double *KLUmatrixValueComplexCOOforCIDER ; /* KLU Complex Elements for COO storage (for CIDER) */
BindElementKLUforCIDER *KLUmatrixBindStructForCIDER ; /* KLU COO Binding Structure (for CIDER) */
#endif
} KLUmatrix ;
/* ========================================================================== */
/* === KLU version ========================================================== */
/* ========================================================================== */

54
src/include/ngspice/onemesh.h

@ -38,10 +38,10 @@ typedef struct sONEelem {
double *KLUrightLeftNode ;
double *KLUrightRightNode ;
BindKluElementCOO *KLUleftLeftNodeBinding ;
BindKluElementCOO *KLUleftRightNodeBinding ;
BindKluElementCOO *KLUrightLeftNodeBinding ;
BindKluElementCOO *KLUrightRightNodeBinding ;
BindElementKLUforCIDER *KLUleftLeftNodeBinding ;
BindElementKLUforCIDER *KLUleftRightNodeBinding ;
BindElementKLUforCIDER *KLUrightLeftNodeBinding ;
BindElementKLUforCIDER *KLUrightRightNodeBinding ;
#endif
@ -132,29 +132,29 @@ typedef struct sONEnode {
double *fPNiP1;
#ifdef KLU
BindKluElementCOO *fPsiPsiiM1Binding ;
BindKluElementCOO *fPsiPsiBinding ;
BindKluElementCOO *fPsiPsiiP1Binding ;
BindKluElementCOO *fPsiNBinding ;
BindKluElementCOO *fPsiPBinding ;
BindKluElementCOO *fNPsiiM1Binding ;
BindKluElementCOO *fNPsiBinding ;
BindKluElementCOO *fNPsiiP1Binding ;
BindKluElementCOO *fNNiM1Binding ;
BindKluElementCOO *fNNBinding ;
BindKluElementCOO *fNNiP1Binding ;
BindKluElementCOO *fNPiM1Binding ;
BindKluElementCOO *fNPBinding ;
BindKluElementCOO *fNPiP1Binding ;
BindKluElementCOO *fPPsiiM1Binding ;
BindKluElementCOO *fPPsiBinding ;
BindKluElementCOO *fPPsiiP1Binding ;
BindKluElementCOO *fPPiM1Binding ;
BindKluElementCOO *fPPBinding ;
BindKluElementCOO *fPPiP1Binding ;
BindKluElementCOO *fPNiM1Binding ;
BindKluElementCOO *fPNBinding ;
BindKluElementCOO *fPNiP1Binding ;
BindElementKLUforCIDER *fPsiPsiiM1Binding ;
BindElementKLUforCIDER *fPsiPsiBinding ;
BindElementKLUforCIDER *fPsiPsiiP1Binding ;
BindElementKLUforCIDER *fPsiNBinding ;
BindElementKLUforCIDER *fPsiPBinding ;
BindElementKLUforCIDER *fNPsiiM1Binding ;
BindElementKLUforCIDER *fNPsiBinding ;
BindElementKLUforCIDER *fNPsiiP1Binding ;
BindElementKLUforCIDER *fNNiM1Binding ;
BindElementKLUforCIDER *fNNBinding ;
BindElementKLUforCIDER *fNNiP1Binding ;
BindElementKLUforCIDER *fNPiM1Binding ;
BindElementKLUforCIDER *fNPBinding ;
BindElementKLUforCIDER *fNPiP1Binding ;
BindElementKLUforCIDER *fPPsiiM1Binding ;
BindElementKLUforCIDER *fPPsiBinding ;
BindElementKLUforCIDER *fPPsiiP1Binding ;
BindElementKLUforCIDER *fPPiM1Binding ;
BindElementKLUforCIDER *fPPBinding ;
BindElementKLUforCIDER *fPPiP1Binding ;
BindElementKLUforCIDER *fPNiM1Binding ;
BindElementKLUforCIDER *fPNBinding ;
BindElementKLUforCIDER *fPNiP1Binding ;
#endif
} ONEnode;

30
src/include/ngspice/smpdefs.h

@ -28,39 +28,19 @@ typedef struct sSMPmatrix {
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 */
KLUmatrix *SMPkluMatrix ; /* KLU Pointer to the KLU Matrix Data Structure (only for CIDER, for the moment) */
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 */
#ifdef CIDER
KLUmatrix *SMPkluMatrix ; /* KLU Pointer to the KLU Matrix Data Structure (only for CIDER, for the moment) */
#endif
double CKTkluMemGrowFactor ; /* KLU Memory Grow Factor - default = 1.2 */
#endif
} SMPmatrix ;
#ifdef KLU
void SMPmatrix_CSC (SMPmatrix *) ;
void SMPnnz (SMPmatrix *) ;
void spDeterminant_KLU (SMPmatrix *, int *, double *, double *) ;
void SMPconvertCOOtoCSC (SMPmatrix *) ;
#ifdef CIDER
void SMPsolveKLUforCIDER (SMPmatrix *, double [], double [], double [], double []) ;
@ -74,9 +54,10 @@ int SMPluFacKLUforCIDER (SMPmatrix *) ;
void SMPprintKLUforCIDER (SMPmatrix *, char *) ;
#endif
#else
int SMPaddElt (SMPmatrix *, int, int, double) ;
#endif
int SMPaddElt( SMPmatrix *, int , int , double );
double * SMPmakeElt( SMPmatrix * , int , int );
void SMPcClear( SMPmatrix *);
void SMPclear( SMPmatrix *);
@ -112,3 +93,4 @@ void SMPsolveForCIDER (SMPmatrix *, double [], double []) ;
#endif
#endif

15
src/include/ngspice/spmatrix.h

@ -296,20 +296,7 @@ extern void spMultTransposed(MatrixPtr,spREAL*,spREAL*,spREAL*,spREAL*);
extern void spSolve( MatrixPtr, spREAL*, spREAL*, spREAL*, spREAL* );
extern void spSolveTransposed(MatrixPtr,spREAL*,spREAL*,spREAL*,spREAL*);
/* Francesco Lannutti - CSC Data Structure Conversion */
#ifdef KLU
typedef struct sBindElement {
double *Sparse ;
double *CSC ;
double *CSC_Complex ;
} BindElement ;
extern int WriteCol_original (MatrixPtr, int, 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_dump (MatrixPtr, unsigned int, char *) ;
extern void spRHS_CSC_dump (spREAL *, char *, MatrixPtr) ;
#endif
/* ------------------------------------------------------ */
#endif /* spOKAY */

2
src/include/ngspice/tskdefs.h

@ -76,7 +76,7 @@ struct TSKtask {
#ifdef KLU
unsigned int TSKkluMODE:1;
unsigned int TSKkluMemGrowFactor : 1 ;
double TSKkluMemGrowFactor ;
#endif
};

123
src/include/ngspice/twomesh.h

@ -55,11 +55,10 @@ typedef struct sTWOelem
double *KLUrightLeftNode ;
double *KLUrightRightNode ;
BindKluElementCOO *KLUleftLeftNodeBinding ;
BindKluElementCOO *KLUleftRightNodeBinding ;
BindKluElementCOO *KLUrightLeftNodeBinding ;
BindKluElementCOO *KLUrightRightNodeBinding ;
BindElementKLUforCIDER *KLUleftLeftNodeBinding ;
BindElementKLUforCIDER *KLUleftRightNodeBinding ;
BindElementKLUforCIDER *KLUrightLeftNodeBinding ;
BindElementKLUforCIDER *KLUrightRightNodeBinding ;
#endif
} TWOelem;
@ -213,63 +212,63 @@ typedef struct sTWOnode {
double *fPPsiOxP1;
#ifdef KLU
BindKluElementCOO *fPsiPsiBinding ;
BindKluElementCOO *fPsiNBinding ;
BindKluElementCOO *fPsiPBinding ;
BindKluElementCOO *fNPsiBinding ;
BindKluElementCOO *fNNBinding ;
BindKluElementCOO *fNPBinding ;
BindKluElementCOO *fPPsiBinding ;
BindKluElementCOO *fPNBinding ;
BindKluElementCOO *fPPBinding ;
BindKluElementCOO *fPsiPsiiP1Binding ;
BindKluElementCOO *fPsiPsijP1Binding ;
BindKluElementCOO *fNPsiiP1Binding ;
BindKluElementCOO *fNNiP1Binding ;
BindKluElementCOO *fNPsijP1Binding ;
BindKluElementCOO *fNNjP1Binding ;
BindKluElementCOO *fPPsiiP1Binding ;
BindKluElementCOO *fPPiP1Binding ;
BindKluElementCOO *fPPsijP1Binding ;
BindKluElementCOO *fPPjP1Binding ;
BindKluElementCOO *fNPsiiP1jP1Binding ;
BindKluElementCOO *fNNiP1jP1Binding ;
BindKluElementCOO *fPPsiiP1jP1Binding ;
BindKluElementCOO *fPPiP1jP1Binding ;
BindKluElementCOO *fPsiPsiiM1Binding ;
BindKluElementCOO *fNPsiiM1Binding ;
BindKluElementCOO *fNNiM1Binding ;
BindKluElementCOO *fPPsiiM1Binding ;
BindKluElementCOO *fPPiM1Binding ;
BindKluElementCOO *fNPsiiM1jP1Binding ;
BindKluElementCOO *fNNiM1jP1Binding ;
BindKluElementCOO *fPPsiiM1jP1Binding ;
BindKluElementCOO *fPPiM1jP1Binding ;
BindKluElementCOO *fPsiPsijM1Binding ;
BindKluElementCOO *fNPsijM1Binding ;
BindKluElementCOO *fNNjM1Binding ;
BindKluElementCOO *fPPsijM1Binding ;
BindKluElementCOO *fPPjM1Binding ;
BindKluElementCOO *fNPsiiM1jM1Binding ;
BindKluElementCOO *fNNiM1jM1Binding ;
BindKluElementCOO *fPPsiiM1jM1Binding ;
BindKluElementCOO *fPPiM1jM1Binding ;
BindKluElementCOO *fNPsiiP1jM1Binding ;
BindKluElementCOO *fNNiP1jM1Binding ;
BindKluElementCOO *fPPsiiP1jM1Binding ;
BindKluElementCOO *fPPiP1jM1Binding ;
BindKluElementCOO *fNPsiInBinding ;
BindKluElementCOO *fNPsiInP1Binding ;
BindKluElementCOO *fNPsiOxBinding ;
BindKluElementCOO *fNPsiOxP1Binding ;
BindKluElementCOO *fPPsiInBinding ;
BindKluElementCOO *fPPsiInP1Binding ;
BindKluElementCOO *fPPsiOxBinding ;
BindKluElementCOO *fPPsiOxP1Binding ;
BindKluElementCOO *fNPsiInM1Binding ;
BindKluElementCOO *fNPsiOxM1Binding ;
BindKluElementCOO *fPPsiInM1Binding ;
BindKluElementCOO *fPPsiOxM1Binding ;
BindElementKLUforCIDER *fPsiPsiBinding ;
BindElementKLUforCIDER *fPsiNBinding ;
BindElementKLUforCIDER *fPsiPBinding ;
BindElementKLUforCIDER *fNPsiBinding ;
BindElementKLUforCIDER *fNNBinding ;
BindElementKLUforCIDER *fNPBinding ;
BindElementKLUforCIDER *fPPsiBinding ;
BindElementKLUforCIDER *fPNBinding ;
BindElementKLUforCIDER *fPPBinding ;
BindElementKLUforCIDER *fPsiPsiiP1Binding ;
BindElementKLUforCIDER *fPsiPsijP1Binding ;
BindElementKLUforCIDER *fNPsiiP1Binding ;
BindElementKLUforCIDER *fNNiP1Binding ;
BindElementKLUforCIDER *fNPsijP1Binding ;
BindElementKLUforCIDER *fNNjP1Binding ;
BindElementKLUforCIDER *fPPsiiP1Binding ;
BindElementKLUforCIDER *fPPiP1Binding ;
BindElementKLUforCIDER *fPPsijP1Binding ;
BindElementKLUforCIDER *fPPjP1Binding ;
BindElementKLUforCIDER *fNPsiiP1jP1Binding ;
BindElementKLUforCIDER *fNNiP1jP1Binding ;
BindElementKLUforCIDER *fPPsiiP1jP1Binding ;
BindElementKLUforCIDER *fPPiP1jP1Binding ;
BindElementKLUforCIDER *fPsiPsiiM1Binding ;
BindElementKLUforCIDER *fNPsiiM1Binding ;
BindElementKLUforCIDER *fNNiM1Binding ;
BindElementKLUforCIDER *fPPsiiM1Binding ;
BindElementKLUforCIDER *fPPiM1Binding ;
BindElementKLUforCIDER *fNPsiiM1jP1Binding ;
BindElementKLUforCIDER *fNNiM1jP1Binding ;
BindElementKLUforCIDER *fPPsiiM1jP1Binding ;
BindElementKLUforCIDER *fPPiM1jP1Binding ;
BindElementKLUforCIDER *fPsiPsijM1Binding ;
BindElementKLUforCIDER *fNPsijM1Binding ;
BindElementKLUforCIDER *fNNjM1Binding ;
BindElementKLUforCIDER *fPPsijM1Binding ;
BindElementKLUforCIDER *fPPjM1Binding ;
BindElementKLUforCIDER *fNPsiiM1jM1Binding ;
BindElementKLUforCIDER *fNNiM1jM1Binding ;
BindElementKLUforCIDER *fPPsiiM1jM1Binding ;
BindElementKLUforCIDER *fPPiM1jM1Binding ;
BindElementKLUforCIDER *fNPsiiP1jM1Binding ;
BindElementKLUforCIDER *fNNiP1jM1Binding ;
BindElementKLUforCIDER *fPPsiiP1jM1Binding ;
BindElementKLUforCIDER *fPPiP1jM1Binding ;
BindElementKLUforCIDER *fNPsiInBinding ;
BindElementKLUforCIDER *fNPsiInP1Binding ;
BindElementKLUforCIDER *fNPsiOxBinding ;
BindElementKLUforCIDER *fNPsiOxP1Binding ;
BindElementKLUforCIDER *fPPsiInBinding ;
BindElementKLUforCIDER *fPPsiInP1Binding ;
BindElementKLUforCIDER *fPPsiOxBinding ;
BindElementKLUforCIDER *fPPsiOxP1Binding ;
BindElementKLUforCIDER *fNPsiInM1Binding ;
BindElementKLUforCIDER *fNPsiOxM1Binding ;
BindElementKLUforCIDER *fPPsiInM1Binding ;
BindElementKLUforCIDER *fPPsiOxM1Binding ;
#endif
} TWOnode;

4
src/maths/KLU/klu_defaults.c

@ -18,8 +18,8 @@ Int KLU_defaults
/* parameters */
Common->tol = 0.001 ; /* pivot tolerance for diagonal */
Common->memgrow = 1.2; /* realloc size ratio increase for LU factors */
Common->initmem_amd = 1.2 ; /* init. mem with AMD: c*nnz(L) + n */
Common->memgrow = 10; /* realloc size ratio increase for LU factors */
Common->initmem_amd = 10 ; /* init. mem with AMD: c*nnz(L) + n */
Common->initmem = 10 ; /* init. mem otherwise: c*nnz(A) + n */
Common->btf = TRUE ; /* use BTF pre-ordering, or not */
Common->maxwork = 0 ; /* no limit to work done by btf_order */

835
src/maths/KLU/klusmp.c
File diff suppressed because it is too large
View File

18
src/maths/ni/niinit.c

@ -32,25 +32,11 @@ NIinit(CKTcircuit *ckt)
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->CKTkluMatrixIsComplex = CKTkluMatrixReal ;
ckt->CKTmatrix->CKTkluIntermediate = NULL ;
ckt->CKTmatrix->CKTkluIntermediate_Complex = NULL ;
ckt->CKTmatrix->CKTbindStruct = NULL ;
ckt->CKTmatrix->CKTdiag_CSC = NULL ;
ckt->CKTmatrix->CKTkluN = 0 ;
ckt->CKTmatrix->CKTklunz = 0 ;
ckt->CKTmatrix->CKTkluMODE = ckt->CKTkluMODE ; /* TO BE SUBSTITUTED WITH THE HEURISTICS */
klu_defaults (ckt->CKTmatrix->CKTkluCommon) ;
ckt->CKTmatrix->CKTkluCommon->memgrow = ckt->CKTkluMemGrowFactor ;
ckt->CKTmatrix->CKTkluMemGrowFactor = ckt->CKTkluMemGrowFactor ;
#endif
ckt->CKTniState = NIUNINITIALIZED;
return SMPnewMatrix(ckt->CKTmatrix, 0);
}

6
src/maths/sparse/Makefile.am

@ -13,10 +13,7 @@ libsparse_la_SOURCES = \
spsolve.c \
sputils.c
if KLU_WANTED
libsparse_la_SOURCES += spCSC.c
else
if !KLU_WANTED
libsparse_la_SOURCES += spsmp.c
endif
@ -24,3 +21,4 @@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include
AM_CFLAGS = $(STATIC)
MAINTAINERCLEANFILES = Makefile.in

174
src/maths/sparse/spCSC.c

@ -1,174 +0,0 @@
/* Sparse Matrix to CSC Matrix Conversion Routines
* Including Dump Routines
*
* 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:
*
* pExtOrder = IntToExtColMap [n] ;
* for (i = n - 1 ; i >= 0 ; i--)
* RHS [*(pExtOrder--)] = Intermediate [i] ;
*/
/* Includes */
#include "ngspice/spmatrix.h"
#include "spdefs.h"
/* Body */
int
WriteCol_original (MatrixPtr Matrix, int Col, spREAL *CSC_Element, spREAL *CSC_Element_Complex, int *CSC_Row, BindElement *BindSparseCSC, spREAL **diag)
{
int i ;
ElementPtr current ;
i = 0 ;
current = Matrix->FirstInCol [Col] ;
while (current != NULL) {
BindSparseCSC [i].Sparse = (double *)current ;
BindSparseCSC [i].CSC = &(CSC_Element [i]) ;
BindSparseCSC [i].CSC_Complex = &(CSC_Element_Complex [2 * i]) ;
CSC_Row [i] = (current->Row) - 1 ;
if (CSC_Row [i] == Col - 1)
diag [0] = &(CSC_Element [i]) ;
i++ ;
current = current->NextInCol ;
}
return i ;
}
int
WriteCol_original_dump (MatrixPtr Matrix, int Col, spREAL *CSC_Element, int *CSC_Row, unsigned int complex)
{
int i ;
ElementPtr current ;
i = 0 ;
current = Matrix->FirstInCol [Col] ;
while (current != NULL)
{
if (complex)
{
CSC_Element [2 * i] = current->Real ;
CSC_Element [2 * i + 1] = current->Imag ;
} else {
CSC_Element [i] = current->Real ;
}
CSC_Row [i] = (current->Row) - 1 ;
i++ ;
current = current->NextInCol ;
}
return i ;
}
void
spMatrix_CSC (MatrixPtr Matrix, int *Ap, int *Ai, double *Ax, double *Ax_Complex, int n, BindElement *BindSparseCSC, double **diag)
{
int offset, i ;
offset = 0 ;
Ap[0] = offset ;
for (i = 1 ; i <= n ; i++) {
offset += WriteCol_original (Matrix, i, (spREAL *)(Ax + offset), (spREAL *)(Ax_Complex + 2 * offset),
(int *)(Ai + offset), BindSparseCSC + offset, (spREAL **)(diag + (i - 1))) ;
Ap[i] = offset ;
}
}
void
spMatrix_CSC_dump (MatrixPtr Matrix, unsigned int complex, char *CSC_output)
{
FILE *output ;
int offset, i, j, *Ap, *Ai, n, nz ;
double *Ax ;
n = spGetSize (Matrix, 1) ;
nz = Matrix->Elements ;
Ap = (int *) SP_MALLOC (int, n + 1) ;
Ai = (int *) SP_MALLOC (int, nz) ;
if (complex)
{
Ax = (double *) SP_MALLOC (double, 2 * nz) ;
} else {
Ax = (double *) SP_MALLOC (double, nz) ;
}
offset = 0 ;
Ap [0] = offset ;
for (i = 1 ; i <= n ; i++) {
offset += WriteCol_original_dump (Matrix, i, (spREAL *)(Ax + offset), (int *)(Ai + offset), complex) ;
Ap [i] = offset ;
}
if (!complex && CSC_output != NULL)
{
output = fopen (CSC_output, "w") ;
fprintf (output, "%%%%MatrixMarket matrix coordinate real general\n") ;
fprintf (output, "%%-------------------------------------------------------------------------------\n") ;
fprintf (output, "%% Transient Matrix Dump\n%% Family: ISCAS Circuit\n") ;
fprintf (output, "%%-------------------------------------------------------------------------------\n") ;
fprintf (output, "%d %d %d\n", n, n, offset) ;
for (i = 0 ; i < n ; i++)
for (j = Ap [i] ; j < Ap [i + 1] ; j++)
fprintf (output, "%d %d %-.9g\n", Ai [j] + 1, i + 1, Ax [j]) ;
fclose (output) ;
output = fopen ("IntToExtColMap.txt", "w") ;
for (i = 1 ; i <= n ; i++)
fprintf (output, "%d\n", Matrix->IntToExtColMap [i]) ;
fclose (output) ;
} else {
fprintf (stderr, "CSC Matrix converted from SPARSE 1.3 matrix\n") ;
for (i = 0 ; i < n ; i++)
{
for (j = Ap [i] ; j < Ap [i + 1] ; j++)
{
if (complex)
{
fprintf (stderr, "Row: %d\tCol: %d\tValue: %-.9g j%-.9g\n", Ai [j] + 1, i + 1, Ax [2 * j], Ax [2 * j + 1]) ;
} else {
fprintf (stderr, "Row: %d\tCol: %d\tValue: %-.9g\n", Ai [j] + 1, i + 1, Ax [j]) ;
}
}
}
}
SP_FREE (Ap) ;
SP_FREE (Ai) ;
SP_FREE (Ax) ;
}
void
spRHS_CSC_dump (RealNumber *RHS, char *CSC_output_b, MatrixPtr Matrix)
{
FILE *output ;
int i, n, *pExtOrder ;
double *Intermediate ;
n = spGetSize (Matrix, 1) ;
Intermediate = (double *) SP_MALLOC (double, n) ;
pExtOrder = &Matrix->IntToExtRowMap [n] ;
for (i = n - 1 ; i >= 0 ; i--)
Intermediate [i] = RHS [*(pExtOrder--)] ;
output = fopen (CSC_output_b, "w") ;
fprintf (output, "%%%%MatrixMarket matrix array real general\n") ;
fprintf (output, "%%-------------------------------------------------------------------------------\n") ;
fprintf (output, "%% Transient RHS Vector Dump\n%% Family: ISCAS Circuit\n") ;
fprintf (output, "%%-------------------------------------------------------------------------------\n") ;
fprintf (output, "%d %d\n", n, 1) ;
for (i = 1 ; i < n + 1 ; i++)
fprintf (output, "%-.9g\n", Intermediate [i]) ;
fclose (output) ;
SP_FREE (Intermediate) ;
}

10
src/spicelib/analysis/acan.c

@ -259,13 +259,13 @@ ACan(CKTcircuit* ckt, int restart)
if (ckt->CKTmatrix->CKTkluMODE)
{
/* Conversion from Real Matrix to Complex Matrix */
if (!ckt->CKTmatrix->CKTkluMatrixIsComplex)
if (!ckt->CKTmatrix->SMPkluMatrix->KLUmatrixIsComplex)
{
for (i = 0 ; i < DEVmaxnum ; i++)
if (DEVices [i] && DEVices [i]->DEVbindCSCComplex && ckt->CKThead [i])
DEVices [i]->DEVbindCSCComplex (ckt->CKThead [i], ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixComplex ;
ckt->CKTmatrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
}
}
#endif
@ -290,7 +290,7 @@ ACan(CKTcircuit* ckt, int restart)
if (DEVices [i] && DEVices [i]->DEVbindCSCComplexToReal && ckt->CKThead [i])
DEVices [i]->DEVbindCSCComplexToReal (ckt->CKThead [i], ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ;
ckt->CKTmatrix->SMPkluMatrix->KLUmatrixIsComplex = KLUmatrixReal ;
}
#endif
@ -331,7 +331,7 @@ ACan(CKTcircuit* ckt, int restart)
if (DEVices [i] && DEVices [i]->DEVbindCSCComplex && ckt->CKThead [i])
DEVices [i]->DEVbindCSCComplex (ckt->CKThead [i], ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixComplex ;
ckt->CKTmatrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
}
#endif
@ -443,7 +443,7 @@ endsweep:
if (DEVices [i] && DEVices [i]->DEVbindCSCComplexToReal && ckt->CKThead [i])
DEVices [i]->DEVbindCSCComplexToReal (ckt->CKThead [i], ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ;
ckt->CKTmatrix->SMPkluMatrix->KLUmatrixIsComplex = KLUmatrixReal ;
}
#endif

15
src/spicelib/analysis/cktacct.c

@ -40,7 +40,16 @@ CKTacct(CKTcircuit *ckt, JOB *anal, int which, IFvalue *val)
break;
case OPT_ORIGNZ:
if ( ckt->CKTmatrix != NULL ) {
#ifdef KLU
if (ckt->CKTkluMODE)
val->iValue = (int)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNZ ;
else
val->iValue = spOriginalCount (ckt->CKTmatrix->SPmatrix) ;
#else
val->iValue = spOriginalCount(ckt->CKTmatrix->SPmatrix);
#endif
} else {
val->iValue = 0;
}
@ -49,7 +58,8 @@ CKTacct(CKTcircuit *ckt, JOB *anal, int which, IFvalue *val)
if ( ckt->CKTmatrix != NULL ) {
#ifdef KLU
if (ckt->CKTmatrix->CKTkluMODE)
val->iValue = ckt->CKTmatrix->CKTkluNumeric->lnz + ckt->CKTmatrix->CKTkluNumeric->unz + ckt->CKTmatrix->CKTkluNumeric->nzoff - ckt->CKTmatrix->CKTklunz ;
val->iValue = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->lnz + ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->unz
+ ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->nzoff - (int)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNZ ;
else
val->iValue = spFillinCount(ckt->CKTmatrix->SPmatrix);
#else
@ -63,7 +73,8 @@ CKTacct(CKTcircuit *ckt, JOB *anal, int which, IFvalue *val)
if ( ckt->CKTmatrix != NULL ) {
#ifdef KLU
if (ckt->CKTmatrix->CKTkluMODE)
val->iValue = ckt->CKTmatrix->CKTkluNumeric->lnz + ckt->CKTmatrix->CKTkluNumeric->unz + ckt->CKTmatrix->CKTkluNumeric->nzoff ;
val->iValue = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->lnz + ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->unz
+ ckt->CKTmatrix->SMPkluMatrix->KLUmatrixNumeric->nzoff ;
else
val->iValue = spElementCount(ckt->CKTmatrix->SPmatrix);
#else

85
src/spicelib/analysis/cktpzset.c

@ -14,21 +14,6 @@ Copyright 1990 Regents of the University of California. All rights reserved.
#include "ngspice/devdefs.h"
#include "ngspice/sperror.h"
#ifdef KLU
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
#endif
int
CKTpzSetup(CKTcircuit *ckt, int type)
{
@ -104,35 +89,12 @@ CKTpzSetup(CKTcircuit *ckt, int type)
job->PZnumswaps = 1;
#ifdef KLU
if (ckt->CKTmatrix->CKTkluMODE)
if (matrix->CKTkluMODE)
{
fprintf (stderr, "Using KLU as Direct Linear Solver\n") ;
int i ;
int n = SMPmatSize (ckt->CKTmatrix) ;
ckt->CKTmatrix->CKTkluN = n ;
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->CKTkluIntermediate = TMALLOC (double, n) ;
ckt->CKTmatrix->CKTbindStruct = TMALLOC (BindElement, nz) ;
ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ;
/* Complex Stuff needed for AC Analysis */
ckt->CKTmatrix->CKTkluAx_Complex = TMALLOC (double, 2 * nz) ;
ckt->CKTmatrix->CKTkluIntermediate_Complex = TMALLOC (double, 2 * n) ;
/* Binding Table from Sparse to CSC Format Creation */
SMPmatrix_CSC (ckt->CKTmatrix) ;
/* Binding Table Sorting */
qsort (ckt->CKTmatrix->CKTbindStruct, (size_t)nz, sizeof(BindElement), BindCompare) ;
/* Convert the COO Storage to CSC for KLU and Fill the Binding Table */
SMPconvertCOOtoCSC (matrix) ;
/* KLU Pointers Assignment */
for (i = 0 ; i < DEVmaxnum ; i++)
@ -140,34 +102,48 @@ CKTpzSetup(CKTcircuit *ckt, int type)
DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ;
/* ReOrder */
error = SMPpreOrder (ckt->CKTmatrix) ;
error = SMPpreOrder (matrix) ;
if (error) {
fprintf (stderr, "Error during ReOrdering\n") ;
}
/* Conversion from Real Matrix to Complex Matrix */
/* Conversion from Real Circuit Matrix to Complex Circuit Matrix */
for (i = 0 ; i < DEVmaxnum ; i++)
if (DEVices [i] && DEVices [i]->DEVbindCSCComplex && ckt->CKThead [i])
DEVices [i]->DEVbindCSCComplex (ckt->CKThead [i], ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixComplex ;
matrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
/* Input Pos */
if ((input_pos != 0) && (solution_col != 0))
if ((input_pos > 0) && (solution_col > 0))
{
double *j ;
j = job->PZdrive_pptr ;
job->PZdrive_pptr = ((BindElement *) bsearch (&j, ckt->CKTmatrix->CKTbindStruct, (size_t)nz, sizeof(BindElement), BindCompare))->CSC_Complex ;
BindElement j, *matched ;
j.COO = job->PZdrive_pptr ;
j.CSC = NULL ;
j.CSC_Complex = NULL ;
matched = (BindElement *) bsearch (&j, matrix->SMPkluMatrix->KLUmatrixBindStructCOO,
matrix->SMPkluMatrix->KLUmatrixLinkedListNZ, sizeof (BindElement), BindCompare) ;
if (matched == NULL) {
printf ("Ptr %p not found in BindStruct Table\n", job->PZdrive_pptr) ;
}
job->PZdrive_pptr = matched->CSC_Complex ;
}
/* Input Neg */
if ((input_neg != 0) && (solution_col != 0))
if ((input_neg > 0) && (solution_col > 0))
{
double *j ;
j = job->PZdrive_nptr ;
job->PZdrive_nptr = ((BindElement *) bsearch (&j, ckt->CKTmatrix->CKTbindStruct, (size_t)nz, sizeof(BindElement), BindCompare))->CSC_Complex ;
BindElement j, *matched ;
j.COO = job->PZdrive_nptr ;
j.CSC = NULL ;
j.CSC_Complex = NULL ;
matched = (BindElement *) bsearch (&j, matrix->SMPkluMatrix->KLUmatrixBindStructCOO,
matrix->SMPkluMatrix->KLUmatrixLinkedListNZ, sizeof (BindElement), BindCompare) ;
if (matched == NULL) {
printf ("Ptr %p not found in BindStruct Table\n", job->PZdrive_nptr) ;
}
job->PZdrive_nptr = matched->CSC_Complex ;
}
} else {
fprintf (stderr, "Using SPARSE 1.3 as Direct Linear Solver\n") ;
@ -180,3 +156,4 @@ CKTpzSetup(CKTcircuit *ckt, int type)
return OK;
}

101
src/spicelib/analysis/cktsens.c

@ -45,22 +45,6 @@ static double inc_freq(double freq, int type, double step_size);
}
#ifdef KLU
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
#endif
/*
* Procedure:
*
@ -117,7 +101,7 @@ int sens_sens(CKTcircuit *ckt, int restart)
SMPmatrix *saved_matrix = NULL;
#ifdef KLU
int nz, size_CSC;
int size_CSC ;
#endif
#ifndef notdef
@ -173,33 +157,14 @@ int sens_sens(CKTcircuit *ckt, int restart)
/* Create the perturbation matrix */
delta_Y = TMALLOC(SMPmatrix, 1);
#ifdef KLU
delta_Y->CKTkluSymbolic = NULL;
delta_Y->CKTkluNumeric = NULL;
delta_Y->CKTkluAp = NULL;
delta_Y->CKTkluAi = NULL;
delta_Y->CKTkluAx = NULL;
delta_Y->CKTkluMatrixIsComplex = CKTkluMatrixReal;
delta_Y->CKTkluIntermediate = NULL;
delta_Y->CKTkluIntermediate_Complex = NULL;
delta_Y->CKTbindStruct = NULL;
delta_Y->CKTdiag_CSC = NULL;
delta_Y->CKTkluN = 0;
delta_Y->CKTklunz = 0;
delta_Y->CKTkluMODE = ckt->CKTkluMODE;
if (ckt->CKTkluMODE) {
delta_Y->CKTkluCommon = TMALLOC(klu_common, 1);
klu_defaults(delta_Y->CKTkluCommon);
} else {
delta_Y->CKTkluCommon = NULL;
}
#endif
error = SMPnewMatrix(delta_Y, size);
if (error)
return error;
#ifdef KLU
delta_Y->SMPkluMatrix->KLUmatrixDiag = NULL ;
#endif
// SMPprint(delta_Y, NULL);
size += 1;
@ -300,15 +265,15 @@ int sens_sens(CKTcircuit *ckt, int restart)
#ifdef KLU
if (ckt->CKTkluMODE) {
/* Convert the KLU matrix to complex */
for (i = 0 ; i < Y->CKTklunz ; i++) {
Y->CKTkluAx_Complex [2 * i] = Y->CKTkluAx [i];
Y->CKTkluAx_Complex [2 * i + 1] = 0.0;
/* Convert the KLU Circuit Matrix to Complex */
for (i = 0 ; i < (int)Y->SMPkluMatrix->KLUmatrixNZ ; i++) {
Y->SMPkluMatrix->KLUmatrixAxComplex [2 * i] = Y->SMPkluMatrix->KLUmatrixAx [i] ;
Y->SMPkluMatrix->KLUmatrixAxComplex [2 * i + 1] = 0.0 ;
}
Y->CKTkluMatrixIsComplex = CKTkluMatrixComplex;
Y->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
SMPcReorder(Y, ckt->CKTpivotAbsTol, ckt->CKTpivotRelTol, &size_CSC); // size_CSC is just a placeholder here
SMPcReorder (Y, ckt->CKTpivotAbsTol, ckt->CKTpivotRelTol, &size_CSC) ; // size_CSC is just a placeholder here
}
#endif
@ -378,14 +343,14 @@ int sens_sens(CKTcircuit *ckt, int restart)
/* ReOrder */
error = SMPpreOrder (ckt->CKTmatrix) ;
/* Conversion from Real Matrix to Complex Matrix */
if (!ckt->CKTmatrix->CKTkluMatrixIsComplex)
/* Conversion from Real Circuit Matrix to Complex Circuit Matrix */
if (!ckt->CKTmatrix->SMPkluMatrix->KLUmatrixIsComplex)
{
for (i = 0 ; i < DEVmaxnum ; i++)
if (DEVices [i] && DEVices [i]->DEVbindCSCComplex && ckt->CKThead [i])
DEVices [i]->DEVbindCSCComplex (ckt->CKThead [i], ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixComplex ;
ckt->CKTmatrix->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
}
}
#endif
@ -470,43 +435,23 @@ int sens_sens(CKTcircuit *ckt, int restart)
#ifdef KLU
if (ckt->CKTmatrix->CKTkluMODE)
{
size_CSC = SMPmatSize (ckt->CKTmatrix) ;
ckt->CKTmatrix->CKTkluN = size_CSC ;
SMPnnz (ckt->CKTmatrix) ;
nz = ckt->CKTmatrix->CKTklunz ;
ckt->CKTmatrix->CKTkluAp = TMALLOC (int, size_CSC + 1) ;
ckt->CKTmatrix->CKTkluAi = TMALLOC (int, nz) ;
ckt->CKTmatrix->CKTkluAx = TMALLOC (double, nz) ;
ckt->CKTmatrix->CKTkluIntermediate = TMALLOC (double, size_CSC) ;
ckt->CKTmatrix->CKTbindStruct = TMALLOC (BindElement, nz) ;
ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, size_CSC) ;
/* Complex Stuff needed for AC Analysis */
ckt->CKTmatrix->CKTkluAx_Complex = TMALLOC (double, 2 * nz) ;
ckt->CKTmatrix->CKTkluIntermediate_Complex = TMALLOC (double, 2 * size_CSC) ;
/* Binding Table from Sparse to CSC Format Creation */
SMPmatrix_CSC (ckt->CKTmatrix) ;
/* Populate the delta_Y KLU Matrix */
/* Binding Table Sorting */
qsort (ckt->CKTmatrix->CKTbindStruct, (size_t)nz, sizeof(BindElement), BindCompare) ;
/* Convert the COO Storage to CSC for KLU and Fill the Binding Table */
SMPconvertCOOtoCSC (delta_Y) ;
/* KLU Pointers Assignment */
if (DEVices [sg->dev]->DEVbindCSC)
DEVices [sg->dev]->DEVbindCSC (sg->model, ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ;
delta_Y->SMPkluMatrix->KLUmatrixIsComplex = KLUmatrixReal ;
/* Clear KLU Vectors */
for (i = 0 ; i < nz ; i++)
for (i = 0 ; i < (int)delta_Y->SMPkluMatrix->KLUmatrixNZ ; i++)
{
ckt->CKTmatrix->CKTkluAx [i] = 0 ;
ckt->CKTmatrix->CKTkluAx_Complex [2 * i] = 0 ;
ckt->CKTmatrix->CKTkluAx_Complex [2 * i + 1] = 0 ;
delta_Y->SMPkluMatrix->KLUmatrixAx [i] = 0 ;
delta_Y->SMPkluMatrix->KLUmatrixAxComplex [2 * i] = 0 ;
delta_Y->SMPkluMatrix->KLUmatrixAxComplex [2 * i + 1] = 0 ;
}
}
#endif
@ -529,7 +474,7 @@ int sens_sens(CKTcircuit *ckt, int restart)
if (DEVices [sg->dev]->DEVbindCSCComplex)
DEVices [sg->dev]->DEVbindCSCComplex (sg->model, ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixComplex ;
delta_Y->SMPkluMatrix->KLUmatrixIsComplex = KLUMatrixComplex ;
}
}
#endif

74
src/spicelib/analysis/cktsetup.c

@ -31,21 +31,6 @@ int nthreads;
return(E_NOMEM);\
}
#ifdef KLU
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
#endif
int
CKTsetup(CKTcircuit *ckt)
{
@ -123,6 +108,23 @@ CKTsetup(CKTcircuit *ckt)
}
}
#ifdef KLU
if (ckt->CKTmatrix->CKTkluMODE)
{
fprintf (stderr, "Using KLU as Direct Linear Solver\n") ;
/* Convert the COO Storage to CSC for KLU and Fill the Binding Table */
SMPconvertCOOtoCSC (matrix) ;
/* Assign the KLU Pointers */
for (i = 0 ; i < DEVmaxnum ; i++)
if (DEVices [i] && DEVices [i]->DEVbindCSC && ckt->CKThead [i])
DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ;
} else {
fprintf (stderr, "Using SPARSE 1.3 as Direct Linear Solver\n") ;
}
#endif
for(i=0;i<=MAX(2,ckt->CKTmaxOrder)+1;i++) { /* dctran needs 3 states as minimum */
CKALLOC(ckt->CKTstates[i],ckt->CKTnumStates,double);
}
@ -171,48 +173,6 @@ CKTsetup(CKTcircuit *ckt)
/* gtri - end - Setup for adding rshunt option resistors */
#endif
#ifdef KLU
if (ckt->CKTmatrix->CKTkluMODE)
{
fprintf (stderr, "Using KLU as Direct Linear Solver\n") ;
int i ;
int n = SMPmatSize (ckt->CKTmatrix) ;
ckt->CKTmatrix->CKTkluN = n ;
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->CKTkluIntermediate = TMALLOC (double, n) ;
ckt->CKTmatrix->CKTbindStruct = TMALLOC (BindElement, nz) ;
ckt->CKTmatrix->CKTdiag_CSC = TMALLOC (double *, n) ;
/* Complex Stuff needed for AC Analysis */
ckt->CKTmatrix->CKTkluAx_Complex = TMALLOC (double, 2 * nz) ;
ckt->CKTmatrix->CKTkluIntermediate_Complex = TMALLOC (double, 2 * n) ;
/* Binding Table from Sparse to CSC Format Creation */
SMPmatrix_CSC (ckt->CKTmatrix) ;
/* Binding Table Sorting */
qsort (ckt->CKTmatrix->CKTbindStruct, (size_t)nz, sizeof(BindElement), BindCompare) ;
/* KLU Pointers Assignment */
for (i = 0 ; i < DEVmaxnum ; i++)
if (DEVices [i] && DEVices [i]->DEVbindCSC && ckt->CKThead [i])
DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ;
ckt->CKTmatrix->CKTkluMatrixIsComplex = CKTkluMatrixReal ;
} else {
fprintf (stderr, "Using SPARSE 1.3 as Direct Linear Solver\n") ;
}
#endif
return(OK);
}

20
src/spicelib/devices/adms/admst/ngspiceMODULEbindCSC.c.xml

@ -51,30 +51,16 @@ Author: 2020 Francesco Lannutti
#include &quot;ngspice/sperror.h&quot;
#include &quot;ngspice/klu-binding.h&quot;
#include &lt;stdlib.h&gt;
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
$(module)bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
$(module)model *model = ($(module)model *)inModel ;
$(module)instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the $(module) models */
for ( ; model != NULL ; model = $(module)nextModel(model))

20
src/spicelib/devices/asrc/asrcbindCSC.c

@ -8,31 +8,17 @@ Author: 2015 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
ASRCbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
ASRCmodel *model = (ASRCmodel *)inModel ;
ASRCinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
int j, k ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the ASRC models */
for ( ; model != NULL ; model = ASRCnextModel(model))

20
src/spicelib/devices/bjt/bjtbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BJTbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BJTmodel *model = (BJTmodel *)inModel ;
BJTinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the BJT models */
for ( ; model != NULL ; model = BJTnextModel(model))

20
src/spicelib/devices/bsim1/b1bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
B1bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
B1model *model = (B1model *)inModel ;
B1instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the B1 models */
for ( ; model != NULL ; model = B1nextModel(model))

20
src/spicelib/devices/bsim2/b2bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
B2bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
B2model *model = (B2model *)inModel ;
B2instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the B2 models */
for ( ; model != NULL ; model = B2nextModel(model))

20
src/spicelib/devices/bsim3/b3bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BSIM3bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BSIM3model *model = (BSIM3model *)inModel ;
BSIM3instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the BSIM3 models */
for ( ; model != NULL ; model = BSIM3nextModel(model))

20
src/spicelib/devices/bsim3soi_dd/b3soiddbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
B3SOIDDbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
B3SOIDDmodel *model = (B3SOIDDmodel *)inModel ;
B3SOIDDinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the B3SOIDD models */
for ( ; model != NULL ; model = B3SOIDDnextModel(model))

20
src/spicelib/devices/bsim3soi_fd/b3soifdbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
B3SOIFDbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
B3SOIFDmodel *model = (B3SOIFDmodel *)inModel ;
B3SOIFDinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the B3SOIFD models */
for ( ; model != NULL ; model = B3SOIFDnextModel(model))

20
src/spicelib/devices/bsim3soi_pd/b3soipdbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
B3SOIPDbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
B3SOIPDmodel *model = (B3SOIPDmodel *)inModel ;
B3SOIPDinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the B3SOIPD models */
for ( ; model != NULL ; model = B3SOIPDnextModel(model))

20
src/spicelib/devices/bsim3v0/b3v0bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BSIM3v0bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BSIM3v0model *model = (BSIM3v0model *)inModel ;
BSIM3v0instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the BSIM3v0 models */
for ( ; model != NULL ; model = BSIM3v0nextModel(model))

20
src/spicelib/devices/bsim3v1/b3v1bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BSIM3v1bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BSIM3v1model *model = (BSIM3v1model *)inModel ;
BSIM3v1instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the BSIM3v1 models */
for ( ; model != NULL ; model = BSIM3v1nextModel(model))

20
src/spicelib/devices/bsim3v32/b3v32bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BSIM3v32bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BSIM3v32model *model = (BSIM3v32model *)inModel ;
BSIM3v32instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the BSIM3v32 models */
for ( ; model != NULL ; model = BSIM3v32nextModel(model))

20
src/spicelib/devices/bsim4/b4bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BSIM4bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BSIM4model *model = (BSIM4model *)inModel ;
BSIM4instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the BSIM4 models */
for ( ; model != NULL ; model = BSIM4nextModel(model))

20
src/spicelib/devices/bsim4v5/b4v5bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BSIM4v5bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BSIM4v5model *model = (BSIM4v5model *)inModel ;
BSIM4v5instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the BSIM4v5 models */
for ( ; model != NULL ; model = BSIM4v5nextModel(model))

20
src/spicelib/devices/bsim4v6/b4v6bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BSIM4v6bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BSIM4v6model *model = (BSIM4v6model *)inModel ;
BSIM4v6instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the BSIM4v6 models */
for ( ; model != NULL ; model = BSIM4v6nextModel(model))

20
src/spicelib/devices/bsim4v7/b4v7bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BSIM4v7bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BSIM4v7model *model = (BSIM4v7model *)inModel ;
BSIM4v7instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the BSIM4v7 models */
for ( ; model != NULL ; model = BSIM4v7nextModel(model))

20
src/spicelib/devices/bsimsoi/b4soibindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
B4SOIbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
B4SOImodel *model = (B4SOImodel *)inModel ;
B4SOIinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the B4SOI models */
for ( ; model != NULL ; model = B4SOInextModel(model))

20
src/spicelib/devices/cap/capbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
CAPbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
CAPmodel *model = (CAPmodel *)inModel ;
CAPinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the CAP models */
for ( ; model != NULL ; model = CAPnextModel(model))

20
src/spicelib/devices/cccs/cccsbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
CCCSbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
CCCSmodel *model = (CCCSmodel *)inModel ;
CCCSinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the CCCS models */
for ( ; model != NULL ; model = CCCSnextModel(model))

20
src/spicelib/devices/ccvs/ccvsbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
CCVSbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
CCVSmodel *model = (CCVSmodel *)inModel ;
CCVSinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the CCVS models */
for ( ; model != NULL ; model = CCVSnextModel(model))

21
src/spicelib/devices/cpl/cplbindCSC.c

@ -8,32 +8,17 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
CPLbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
CPLmodel *model = (CPLmodel *)inModel ;
CPLinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
int m, p ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the CPL models */
for ( ; model != NULL ; model = CPLnextModel(model))

20
src/spicelib/devices/csw/cswbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
CSWbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
CSWmodel *model = (CSWmodel *)inModel ;
CSWinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the CSW models */
for ( ; model != NULL ; model = CSWnextModel(model))

20
src/spicelib/devices/dio/diobindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
DIObindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
DIOmodel *model = (DIOmodel *)inModel ;
DIOinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the DIO models */
for ( ; model != NULL ; model = DIOnextModel(model))

20
src/spicelib/devices/hfet1/hfetbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
HFETAbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
HFETAmodel *model = (HFETAmodel *)inModel ;
HFETAinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the HFETA models */
for ( ; model != NULL ; model = HFETAnextModel(model))

20
src/spicelib/devices/hfet2/hfet2bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
HFET2bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
HFET2model *model = (HFET2model *)inModel ;
HFET2instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the HFET2 models */
for ( ; model != NULL ; model = HFET2nextModel(model))

20
src/spicelib/devices/hisim2/hsm2bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
HSM2bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
HSM2model *model = (HSM2model *)inModel ;
HSM2instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the HSM2 models */
for ( ; model != NULL ; model = HSM2nextModel(model))

20
src/spicelib/devices/hisimhv1/hsmhvbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
HSMHVbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
HSMHVmodel *model = (HSMHVmodel *)inModel ;
HSMHVinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the HSMHV models */
for ( ; model != NULL ; model = HSMHVnextModel(model))

20
src/spicelib/devices/hisimhv2/hsmhv2bindCSC.c

@ -8,30 +8,16 @@ Author: 2016 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
HSMHV2bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
HSMHV2model *model = (HSMHV2model *)inModel ;
HSMHV2instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the HSMHV2 models */
for ( ; model != NULL ; model = HSMHV2nextModel(model))

20
src/spicelib/devices/ind/indbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
INDbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
INDmodel *model = (INDmodel *)inModel ;
INDinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the IND models */
for ( ; model != NULL ; model = INDnextModel(model))

20
src/spicelib/devices/ind/mutbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
MUTbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
MUTmodel *model = (MUTmodel *)inModel ;
MUTinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the MUT models */
for ( ; model != NULL ; model = MUTnextModel(model))

20
src/spicelib/devices/jfet/jfetbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
JFETbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
JFETmodel *model = (JFETmodel *)inModel ;
JFETinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the JFET models */
for ( ; model != NULL ; model = JFETnextModel(model))

20
src/spicelib/devices/jfet2/jfet2bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
JFET2bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
JFET2model *model = (JFET2model *)inModel ;
JFET2instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the JFET2 models */
for ( ; model != NULL ; model = JFET2nextModel(model))

20
src/spicelib/devices/ltra/ltrabindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
LTRAbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
LTRAmodel *model = (LTRAmodel *)inModel ;
LTRAinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the LTRA models */
for ( ; model != NULL ; model = LTRAnextModel(model))

20
src/spicelib/devices/mes/mesbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
MESbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
MESmodel *model = (MESmodel *)inModel ;
MESinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the MES models */
for ( ; model != NULL ; model = MESnextModel(model))

20
src/spicelib/devices/mesa/mesabindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
MESAbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
MESAmodel *model = (MESAmodel *)inModel ;
MESAinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the MESA models */
for ( ; model != NULL ; model = MESAnextModel(model))

20
src/spicelib/devices/mos1/mos1bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
MOS1bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
MOS1model *model = (MOS1model *)inModel ;
MOS1instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the MOS1 models */
for ( ; model != NULL ; model = MOS1nextModel(model))

20
src/spicelib/devices/mos2/mos2bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
MOS2bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
MOS2model *model = (MOS2model *)inModel ;
MOS2instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the MOS2 models */
for ( ; model != NULL ; model = MOS2nextModel(model))

20
src/spicelib/devices/mos3/mos3bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
MOS3bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
MOS3model *model = (MOS3model *)inModel ;
MOS3instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the MOS3 models */
for ( ; model != NULL ; model = MOS3nextModel(model))

20
src/spicelib/devices/mos6/mos6bindCSC.c

@ -8,30 +8,16 @@ Author: 2012 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
MOS6bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
MOS6model *model = (MOS6model *)inModel ;
MOS6instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the MOS6 models */
for ( ; model != NULL ; model = MOS6nextModel(model))

20
src/spicelib/devices/mos9/mos9bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
MOS9bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
MOS9model *model = (MOS9model *)inModel ;
MOS9instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the MOS9 models */
for ( ; model != NULL ; model = MOS9nextModel(model))

20
src/spicelib/devices/nbjt/nbjtbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
NBJTbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
NBJTmodel *model = (NBJTmodel *)inModel ;
NBJTinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the NBJT models */
for ( ; model != NULL ; model = NBJTnextModel(model))

20
src/spicelib/devices/nbjt2/nbjt2bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
NBJT2bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
NBJT2model *model = (NBJT2model *)inModel ;
NBJT2instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the NBJT2 models */
for ( ; model != NULL ; model = NBJT2nextModel(model))

20
src/spicelib/devices/numd/numdbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
NUMDbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
NUMDmodel *model = (NUMDmodel *)inModel ;
NUMDinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the NUMD models */
for ( ; model != NULL ; model = NUMDnextModel(model))

20
src/spicelib/devices/numd2/numd2bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
NUMD2bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
NUMD2model *model = (NUMD2model *)inModel ;
NUMD2instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the NUMD2 models */
for ( ; model != NULL ; model = NUMD2nextModel(model))

20
src/spicelib/devices/numos/numosbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
NUMOSbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
NUMOSmodel *model = (NUMOSmodel *)inModel ;
NUMOSinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the NUMOS models */
for ( ; model != NULL ; model = NUMOSnextModel(model))

20
src/spicelib/devices/res/resbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
RESbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
RESmodel *model = (RESmodel *)inModel ;
RESinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the RES models */
for ( ; model != NULL ; model = RESnextModel(model))

20
src/spicelib/devices/soi3/soi3bindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
SOI3bindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
SOI3model *model = (SOI3model *)inModel ;
SOI3instance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the SOI3 models */
for ( ; model != NULL ; model = SOI3nextModel(model))

20
src/spicelib/devices/sw/swbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
SWbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
SWmodel *model = (SWmodel *)inModel ;
SWinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the SW models */
for ( ; model != NULL ; model = SWnextModel(model))

20
src/spicelib/devices/tra/trabindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
TRAbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
TRAmodel *model = (TRAmodel *)inModel ;
TRAinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the TRA models */
for ( ; model != NULL ; model = TRAnextModel(model))

20
src/spicelib/devices/txl/txlbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
TXLbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
TXLmodel *model = (TXLmodel *)inModel ;
TXLinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the TXL models */
for ( ; model != NULL ; model = TXLnextModel(model))

20
src/spicelib/devices/vbic/vbicbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
VBICbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
VBICmodel *model = (VBICmodel *)inModel ;
VBICinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the VBIC models */
for ( ; model != NULL ; model = VBICnextModel(model))

20
src/spicelib/devices/vccs/vccsbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
VCCSbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
VCCSmodel *model = (VCCSmodel *)inModel ;
VCCSinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the VCCS models */
for ( ; model != NULL ; model = VCCSnextModel(model))

20
src/spicelib/devices/vcvs/vcvsbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
VCVSbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
VCVSmodel *model = (VCVSmodel *)inModel ;
VCVSinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the VCVS models */
for ( ; model != NULL ; model = VCVSnextModel(model))

24
src/spicelib/devices/vsrc/vsrcbindCSC.c

@ -8,30 +8,16 @@ Author: 2013 Francesco Lannutti
#include "ngspice/sperror.h"
#include "ngspice/klu-binding.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
VSRCbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
VSRCmodel *model = (VSRCmodel *)inModel ;
VSRCinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the VSRC models */
for ( ; model != NULL ; model = VSRCnextModel(model))
@ -47,7 +33,9 @@ VSRCbindCSC (GENmodel *inModel, CKTcircuit *ckt)
/* Pole-Zero Analysis */
if (here->VSRCibrIbrPtr)
{
i = here->VSRCibrIbrPtr ;
i.COO = here->VSRCibrIbrPtr ;
i.CSC = NULL ;
i.CSC_Complex = NULL ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->VSRCibrIbrBinding = matched ;
if (matched != NULL)

20
src/xspice/mif/mifbindCSC.c

@ -12,26 +12,12 @@
#include "ngspice/mifproto.h"
#include "ngspice/mifdefs.h"
#include <stdlib.h>
static
int
BindCompare (const void *a, const void *b)
{
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
return ((int)(A->Sparse - B->Sparse)) ;
}
int
MIFbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
MIFmodel *model = (MIFmodel *)inModel ;
MIFinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
BindElement i, *matched, *BindStruct ;
int ii, j, k, l, num_conn, num_port, num_port_k ;
Mif_Boolean_t is_input, is_output ;
Mif_Cntl_Src_Type_t cntl_src_type ;
@ -39,8 +25,8 @@ MIFbindCSC (GENmodel *inModel, CKTcircuit *ckt)
Mif_Smp_Ptr_t *smp_data_cntl, *smp_data_out ;
size_t nz ;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ;
nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ;
/* loop through all the MIF models */
for ( ; model != NULL ; model = MIFnextModel(model))

Loading…
Cancel
Save