diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 491ef7049..65069a239 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -308,6 +308,8 @@ struct CKTcircuit { #ifdef KLU unsigned int CKTkluMODE:1; + unsigned int CKTlinearModelsRequested : 1 ; + unsigned int CKTlinearStaticModelsRequested : 1 ; #endif }; diff --git a/src/spicelib/analysis/cktload.c b/src/spicelib/analysis/cktload.c index dbcfb1988..4ccd080b4 100644 --- a/src/spicelib/analysis/cktload.c +++ b/src/spicelib/analysis/cktload.c @@ -40,11 +40,11 @@ CKTloadLinearStatic (CKTcircuit *ckt) for (i = 0 ; i <= ckt->CKTmatrix->CKTkluN ; i++) ckt->CKTrhs_LinearStatic [i] = 0 ; + ckt->CKTlinearModelsRequested = 1 ; + ckt->CKTlinearStaticModelsRequested = 1 ; for (i = 0; i < DEVmaxnum; i++) { - if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead [i] && - DEVices[i]->DEVisLinear && (*DEVices[i]->DEVisLinear) && - DEVices[i]->DEVisLinearStatic && (*DEVices[i]->DEVisLinearStatic)) + if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead [i]) { error = DEVices[i]->DEVload (ckt->CKThead [i], ckt) ; @@ -67,11 +67,11 @@ CKTloadLinearDynamic (CKTcircuit *ckt) for (i = 0 ; i <= ckt->CKTmatrix->CKTkluN ; i++) ckt->CKTrhs_LinearDynamic [i] = 0 ; + ckt->CKTlinearModelsRequested = 1 ; + ckt->CKTlinearStaticModelsRequested = 0 ; for (i = 0; i < DEVmaxnum; i++) { - if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead [i] && - DEVices[i]->DEVisLinear && (*DEVices[i]->DEVisLinear) && - DEVices[i]->DEVisLinearStatic && !(*DEVices[i]->DEVisLinearStatic)) + if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead [i]) { error = DEVices[i]->DEVload (ckt->CKThead [i], ckt) ; @@ -130,16 +130,15 @@ CKTload(CKTcircuit *ckt) noncon = ckt->CKTnoncon; #endif /* STEPDEBUG */ - for (i = 0; i < DEVmaxnum; i++) { - - /* Francesco Lannutti */ #ifdef KLU - if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead[i] && - ((DEVices[i]->DEVisLinear && !(*DEVices[i]->DEVisLinear)) || !(DEVices[i]->DEVisLinear))) { -#else - if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead[i]) { + /* Francesco Lannutti */ + ckt->CKTlinearModelsRequested = 0 ; + ckt->CKTlinearStaticModelsRequested = 0 ; #endif + for (i = 0; i < DEVmaxnum; i++) { + if (DEVices[i] && DEVices[i]->DEVload && ckt->CKThead[i]) { + error = DEVices[i]->DEVload (ckt->CKThead[i], ckt); if (ckt->CKTnoncon) ckt->CKTtroubleNode = 0; diff --git a/src/spicelib/devices/bsim4v7/b4v7ld.c b/src/spicelib/devices/bsim4v7/b4v7ld.c index d984a14d8..9c3efb14a 100644 --- a/src/spicelib/devices/bsim4v7/b4v7ld.c +++ b/src/spicelib/devices/bsim4v7/b4v7ld.c @@ -249,7 +249,13 @@ ChargeComputationNeeded = #ifndef USE_OMP for (; model != NULL; model = BSIM4v7nextModel(model)) -{ for (here = BSIM4v7instances(model); here != NULL; +{ + +#ifdef KLU + if ((model->BSIM4v7isLinear == ckt->CKTlinearModelsRequested) && (model->BSIM4v7isLinearStatic == ckt->CKTlinearStaticModelsRequested)) { +#endif + + for (here = BSIM4v7instances(model); here != NULL; here = BSIM4v7nextInstance(here)) { #endif @@ -5312,6 +5318,11 @@ line1000: ; #ifndef USE_OMP } /* End of MOSFET Instance */ + +#ifdef KLU + } +#endif + } /* End of Model Instance */ #endif diff --git a/src/spicelib/devices/bsim4v7/b4v7set.c b/src/spicelib/devices/bsim4v7/b4v7set.c index f768d7fb3..ed398d86d 100644 --- a/src/spicelib/devices/bsim4v7/b4v7set.c +++ b/src/spicelib/devices/bsim4v7/b4v7set.c @@ -73,7 +73,14 @@ BSIM4v7instance **InstArray; /* loop through all the BSIM4v7 device models */ for( ; model != NULL; model = BSIM4v7nextModel(model)) - { /* process defaults of model parameters */ + { + +#ifdef KLU + model->BSIM4v7isLinear = 0 ; + model->BSIM4v7isLinearStatic = 0 ; +#endif + + /* process defaults of model parameters */ if (!model->BSIM4v7typeGiven) model->BSIM4v7type = NMOS; diff --git a/src/spicelib/devices/bsim4v7/bsim4v7def.h b/src/spicelib/devices/bsim4v7/bsim4v7def.h index bc6117367..977af239c 100644 --- a/src/spicelib/devices/bsim4v7/bsim4v7def.h +++ b/src/spicelib/devices/bsim4v7/bsim4v7def.h @@ -2791,6 +2791,10 @@ typedef struct sBSIM4v7model unsigned BSIM4v7pk2weGiven :1; unsigned BSIM4v7pku0weGiven :1; +#ifdef KLU + unsigned int BSIM4v7isLinear : 1 ; + unsigned int BSIM4v7isLinearStatic : 1 ; +#endif } BSIM4v7model; diff --git a/src/spicelib/devices/cap/capdefs.h b/src/spicelib/devices/cap/capdefs.h index af355cb54..52ed64a80 100644 --- a/src/spicelib/devices/cap/capdefs.h +++ b/src/spicelib/devices/cap/capdefs.h @@ -120,6 +120,11 @@ typedef struct sCAPmodel { /* model structure for a capacitor */ unsigned CAPthickGiven : 1; /* flags indicates insulator thickness given */ unsigned CAPbv_maxGiven : 1; /* flags indicates maximum voltage is given */ +#ifdef KLU + unsigned int CAPisLinear : 1 ; + unsigned int CAPisLinearStatic : 1 ; +#endif + } CAPmodel; /* device parameters */ diff --git a/src/spicelib/devices/cap/capload.c b/src/spicelib/devices/cap/capload.c index d7ed3224d..ed90adf98 100644 --- a/src/spicelib/devices/cap/capload.c +++ b/src/spicelib/devices/cap/capload.c @@ -37,6 +37,10 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) /* loop through all the capacitor models */ for( ; model != NULL; model = CAPnextModel(model)) { +#ifdef KLU + if ((model->CAPisLinear == ckt->CKTlinearModelsRequested) && (model->CAPisLinearStatic == ckt->CKTlinearStaticModelsRequested)) { +#endif + /* loop through all the instances of the model */ for (here = CAPinstances(model); here != NULL ; here=CAPnextInstance(here)) { @@ -80,6 +84,11 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) } else *(ckt->CKTstate0+here->CAPqcap) = here->CAPcapac * vcap; } + +#ifdef KLU + } +#endif + } } return(OK); diff --git a/src/spicelib/devices/cap/capsetup.c b/src/spicelib/devices/cap/capsetup.c index c003bd57a..b004cbccb 100644 --- a/src/spicelib/devices/cap/capsetup.c +++ b/src/spicelib/devices/cap/capsetup.c @@ -27,6 +27,11 @@ CAPsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* loop through all the capacitor models */ for( ; model != NULL; model = CAPnextModel(model)) { +#ifdef KLU + model->CAPisLinear = 1 ; + model->CAPisLinearStatic = 0 ; +#endif + /*Default Value Processing for Model Parameters */ if (!model->CAPmCapGiven) { model->CAPmCap = 0.0; diff --git a/src/spicelib/devices/res/resdefs.h b/src/spicelib/devices/res/resdefs.h index b601d236f..f0564fd98 100644 --- a/src/spicelib/devices/res/resdefs.h +++ b/src/spicelib/devices/res/resdefs.h @@ -141,6 +141,12 @@ typedef struct sRESmodel { /* model structure for a resistor */ unsigned RESlfGiven :1; /* flags indicates lf is given */ unsigned RESwfGiven :1; /* flags indicates wf is given */ unsigned RESefGiven :1; /* flags indicates ef is given */ + +#ifdef KLU + unsigned int RESisLinear : 1 ; + unsigned int RESisLinearStatic : 1 ; +#endif + } RESmodel; /* device parameters */ diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index db4ac539f..58f788a3e 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -19,6 +19,11 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) /* loop through all the resistor models */ for( ; model != NULL; model = RESnextModel(model)) { + +#ifdef KLU + if ((model->RESisLinear == ckt->CKTlinearModelsRequested) && (model->RESisLinearStatic == ckt->CKTlinearStaticModelsRequested)) { +#endif + RESinstance *here; /* loop through all the instances of the model */ @@ -33,6 +38,11 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) *(here->RESposNegPtr) -= here->RESconduct; *(here->RESnegPosPtr) -= here->RESconduct; } + +#ifdef KLU + } +#endif + } return(OK); } diff --git a/src/spicelib/devices/res/ressetup.c b/src/spicelib/devices/res/ressetup.c index 6064a412c..a9faa1f98 100644 --- a/src/spicelib/devices/res/ressetup.c +++ b/src/spicelib/devices/res/ressetup.c @@ -25,6 +25,11 @@ RESsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit*ckt, int *state) /* loop through all the resistor models */ for( ; model != NULL; model = RESnextModel(model)) { +#ifdef KLU + model->RESisLinear = 1 ; + model->RESisLinearStatic = 1 ; +#endif + /* Default Value Processing for Resistor Models */ if(!model->REStnomGiven) model->REStnom = ckt->CKTnomTemp; if(!model->RESsheetResGiven) model->RESsheetRes = 0.0; diff --git a/src/spicelib/devices/vsrc/vsrcbindCSC.c b/src/spicelib/devices/vsrc/vsrcbindCSC.c index 500c5b6d9..ea7cceec7 100644 --- a/src/spicelib/devices/vsrc/vsrcbindCSC.c +++ b/src/spicelib/devices/vsrc/vsrcbindCSC.c @@ -39,20 +39,39 @@ VSRCbindCSC (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = VSRCinstances(model); here != NULL ; here = VSRCnextInstance(here)) { - CREATE_KLU_BINDING_TABLE_DYNAMIC(VSRCposIbrPtr, VSRCposIbrBinding, VSRCposNode, VSRCbranch); - CREATE_KLU_BINDING_TABLE_DYNAMIC(VSRCnegIbrPtr, VSRCnegIbrBinding, VSRCnegNode, VSRCbranch); - CREATE_KLU_BINDING_TABLE_DYNAMIC(VSRCibrNegPtr, VSRCibrNegBinding, VSRCbranch, VSRCnegNode); - CREATE_KLU_BINDING_TABLE_DYNAMIC(VSRCibrPosPtr, VSRCibrPosBinding, VSRCbranch, VSRCposNode); + if ((here->VSRCisLinear == 1) && (here->VSRCisLinearStatic == 1)) { + CREATE_KLU_BINDING_TABLE_STATIC(VSRCposIbrPtr, VSRCposIbrBinding, VSRCposNode, VSRCbranch); + CREATE_KLU_BINDING_TABLE_STATIC(VSRCnegIbrPtr, VSRCnegIbrBinding, VSRCnegNode, VSRCbranch); + CREATE_KLU_BINDING_TABLE_STATIC(VSRCibrNegPtr, VSRCibrNegBinding, VSRCbranch, VSRCnegNode); + CREATE_KLU_BINDING_TABLE_STATIC(VSRCibrPosPtr, VSRCibrPosBinding, VSRCbranch, VSRCposNode); - /* Pole-Zero Analysis */ - if (here->VSRCibrIbrPtr) - { - i = here->VSRCibrIbrPtr ; - matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; - here->VSRCibrIbrBinding = matched ; - if (matched != NULL) + /* Pole-Zero Analysis */ + if (here->VSRCibrIbrPtr) { - here->VSRCibrIbrPtr = matched->CSC_LinearDynamic ; + i = here->VSRCibrIbrPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->VSRCibrIbrBinding = matched ; + if (matched != NULL) + { + here->VSRCibrIbrPtr = matched->CSC_LinearStatic ; + } + } + } else if ((here->VSRCisLinear == 1) && (here->VSRCisLinearStatic == 0)) { + CREATE_KLU_BINDING_TABLE_DYNAMIC(VSRCposIbrPtr, VSRCposIbrBinding, VSRCposNode, VSRCbranch); + CREATE_KLU_BINDING_TABLE_DYNAMIC(VSRCnegIbrPtr, VSRCnegIbrBinding, VSRCnegNode, VSRCbranch); + CREATE_KLU_BINDING_TABLE_DYNAMIC(VSRCibrNegPtr, VSRCibrNegBinding, VSRCbranch, VSRCnegNode); + CREATE_KLU_BINDING_TABLE_DYNAMIC(VSRCibrPosPtr, VSRCibrPosBinding, VSRCbranch, VSRCposNode); + + /* Pole-Zero Analysis */ + if (here->VSRCibrIbrPtr) + { + i = here->VSRCibrIbrPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->VSRCibrIbrBinding = matched ; + if (matched != NULL) + { + here->VSRCibrIbrPtr = matched->CSC_LinearDynamic ; + } } } } @@ -75,16 +94,31 @@ VSRCbindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = VSRCinstances(model); here != NULL ; here = VSRCnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(VSRCposIbrPtr, VSRCposIbrBinding, VSRCposNode, VSRCbranch); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(VSRCnegIbrPtr, VSRCnegIbrBinding, VSRCnegNode, VSRCbranch); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(VSRCibrNegPtr, VSRCibrNegBinding, VSRCbranch, VSRCnegNode); - CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(VSRCibrPosPtr, VSRCibrPosBinding, VSRCbranch, VSRCposNode); - /* Pole-Zero Analysis */ - if ((here-> VSRCbranch != 0) && (here-> VSRCbranch != 0)) - { - if (here->VSRCibrIbrBinding) + if ((here->VSRCisLinear == 1) && (here->VSRCisLinearStatic == 1)) { + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_STATIC(VSRCposIbrPtr, VSRCposIbrBinding, VSRCposNode, VSRCbranch); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_STATIC(VSRCnegIbrPtr, VSRCnegIbrBinding, VSRCnegNode, VSRCbranch); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_STATIC(VSRCibrNegPtr, VSRCibrNegBinding, VSRCbranch, VSRCnegNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_STATIC(VSRCibrPosPtr, VSRCibrPosBinding, VSRCbranch, VSRCposNode); + /* Pole-Zero Analysis */ + if ((here-> VSRCbranch != 0) && (here-> VSRCbranch != 0)) { - here->VSRCibrIbrPtr = here->VSRCibrIbrBinding->CSC_Complex_LinearDynamic ; + if (here->VSRCibrIbrBinding) + { + here->VSRCibrIbrPtr = here->VSRCibrIbrBinding->CSC_Complex_LinearStatic ; + } + } + } else if ((here->VSRCisLinear == 1) && (here->VSRCisLinearStatic == 0)) { + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(VSRCposIbrPtr, VSRCposIbrBinding, VSRCposNode, VSRCbranch); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(VSRCnegIbrPtr, VSRCnegIbrBinding, VSRCnegNode, VSRCbranch); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(VSRCibrNegPtr, VSRCibrNegBinding, VSRCbranch, VSRCnegNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX_DYNAMIC(VSRCibrPosPtr, VSRCibrPosBinding, VSRCbranch, VSRCposNode); + /* Pole-Zero Analysis */ + if ((here-> VSRCbranch != 0) && (here-> VSRCbranch != 0)) + { + if (here->VSRCibrIbrBinding) + { + here->VSRCibrIbrPtr = here->VSRCibrIbrBinding->CSC_Complex_LinearDynamic ; + } } } } @@ -107,16 +141,31 @@ VSRCbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances of the model */ for (here = VSRCinstances(model); here != NULL ; here = VSRCnextInstance(here)) { - CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(VSRCposIbrPtr, VSRCposIbrBinding, VSRCposNode, VSRCbranch); - CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(VSRCnegIbrPtr, VSRCnegIbrBinding, VSRCnegNode, VSRCbranch); - CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(VSRCibrNegPtr, VSRCibrNegBinding, VSRCbranch, VSRCnegNode); - CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(VSRCibrPosPtr, VSRCibrPosBinding, VSRCbranch, VSRCposNode); - /* Pole-Zero Analysis */ - if ((here-> VSRCbranch != 0) && (here-> VSRCbranch != 0)) - { - if (here->VSRCibrIbrBinding) + if ((here->VSRCisLinear == 1) && (here->VSRCisLinearStatic == 1)) { + CONVERT_KLU_BINDING_TABLE_TO_REAL_STATIC(VSRCposIbrPtr, VSRCposIbrBinding, VSRCposNode, VSRCbranch); + CONVERT_KLU_BINDING_TABLE_TO_REAL_STATIC(VSRCnegIbrPtr, VSRCnegIbrBinding, VSRCnegNode, VSRCbranch); + CONVERT_KLU_BINDING_TABLE_TO_REAL_STATIC(VSRCibrNegPtr, VSRCibrNegBinding, VSRCbranch, VSRCnegNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_STATIC(VSRCibrPosPtr, VSRCibrPosBinding, VSRCbranch, VSRCposNode); + /* Pole-Zero Analysis */ + if ((here-> VSRCbranch != 0) && (here-> VSRCbranch != 0)) { - here->VSRCibrIbrPtr = here->VSRCibrIbrBinding->CSC_LinearDynamic ; + if (here->VSRCibrIbrBinding) + { + here->VSRCibrIbrPtr = here->VSRCibrIbrBinding->CSC_LinearStatic ; + } + } + } else if ((here->VSRCisLinear == 1) && (here->VSRCisLinearStatic == 0)) { + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(VSRCposIbrPtr, VSRCposIbrBinding, VSRCposNode, VSRCbranch); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(VSRCnegIbrPtr, VSRCnegIbrBinding, VSRCnegNode, VSRCbranch); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(VSRCibrNegPtr, VSRCibrNegBinding, VSRCbranch, VSRCnegNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL_DYNAMIC(VSRCibrPosPtr, VSRCibrPosBinding, VSRCbranch, VSRCposNode); + /* Pole-Zero Analysis */ + if ((here-> VSRCbranch != 0) && (here-> VSRCbranch != 0)) + { + if (here->VSRCibrIbrBinding) + { + here->VSRCibrIbrPtr = here->VSRCibrIbrBinding->CSC_LinearDynamic ; + } } } } diff --git a/src/spicelib/devices/vsrc/vsrcdefs.h b/src/spicelib/devices/vsrc/vsrcdefs.h index 21cbee378..a6c53da82 100644 --- a/src/spicelib/devices/vsrc/vsrcdefs.h +++ b/src/spicelib/devices/vsrc/vsrcdefs.h @@ -84,6 +84,8 @@ typedef struct sVSRCinstance { BindElement *VSRCibrNegBinding ; BindElement *VSRCibrPosBinding ; BindElement *VSRCibrIbrBinding ; + unsigned int VSRCisLinear : 1 ; + unsigned int VSRCisLinearStatic : 1 ; #endif } VSRCinstance ; diff --git a/src/spicelib/devices/vsrc/vsrcload.c b/src/spicelib/devices/vsrc/vsrcload.c index 9adb081e5..f063a3633 100644 --- a/src/spicelib/devices/vsrc/vsrcload.c +++ b/src/spicelib/devices/vsrc/vsrcload.c @@ -40,6 +40,10 @@ VSRCload(GENmodel *inModel, CKTcircuit *ckt) for (here = VSRCinstances(model); here != NULL ; here=VSRCnextInstance(here)) { +#ifdef KLU + if ((here->VSRCisLinear == ckt->CKTlinearModelsRequested) && (here->VSRCisLinearStatic == ckt->CKTlinearStaticModelsRequested)) { +#endif + *(here->VSRCposIbrPtr) += 1.0 ; *(here->VSRCnegIbrPtr) -= 1.0 ; *(here->VSRCibrPosPtr) += 1.0 ; @@ -414,7 +418,12 @@ loadDone: /* load the new voltage value into the matrix */ #ifdef KLU - *(ckt->CKTrhs_LinearDynamic + (here->VSRCbranch)) += value; + if ((here->VSRCisLinear == 1) && (here->VSRCisLinearStatic == 1)) { + *(ckt->CKTrhs_LinearStatic + (here->VSRCbranch)) += value; + } else if ((here->VSRCisLinear == 1) && (here->VSRCisLinearStatic == 0)) { + *(ckt->CKTrhs_LinearDynamic + (here->VSRCbranch)) += value; + } + } #else *(ckt->CKTrhs + (here->VSRCbranch)) += value; #endif diff --git a/src/spicelib/devices/vsrc/vsrcpar.c b/src/spicelib/devices/vsrc/vsrcpar.c index f21ec4354..9ef47450f 100644 --- a/src/spicelib/devices/vsrc/vsrcpar.c +++ b/src/spicelib/devices/vsrc/vsrcpar.c @@ -43,18 +43,36 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) case VSRC_DC: here->VSRCdcValue = value->rValue; here->VSRCdcGiven = TRUE; + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 1 ; +#endif + break; case VSRC_AC_MAG: here->VSRCacMag = value->rValue; here->VSRCacMGiven = TRUE; here->VSRCacGiven = TRUE; + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 1 ; +#endif + break; case VSRC_AC_PHASE: here->VSRCacPhase = value->rValue; here->VSRCacPGiven = TRUE; here->VSRCacGiven = TRUE; + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 1 ; +#endif + break; case VSRC_AC: @@ -71,6 +89,12 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) default: return(E_BADPARM); } + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 1 ; +#endif + break; case VSRC_PULSE: @@ -79,6 +103,12 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->VSRCfunctionType = PULSE; here->VSRCfuncTGiven = TRUE; copy_coeffs(here, value); + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 0 ; +#endif + break; case VSRC_SINE: @@ -87,6 +117,12 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->VSRCfunctionType = SINE; here->VSRCfuncTGiven = TRUE; copy_coeffs(here, value); + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 0 ; +#endif + break; case VSRC_EXP: @@ -95,6 +131,12 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->VSRCfunctionType = EXP; here->VSRCfuncTGiven = TRUE; copy_coeffs(here, value); + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 0 ; +#endif + break; case VSRC_PWL: @@ -112,6 +154,11 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) } } +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 0 ; +#endif + break; case VSRC_TD: @@ -148,6 +195,12 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->VSRCfunctionType = SFFM; here->VSRCfuncTGiven = TRUE; copy_coeffs(here, value); + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 0 ; +#endif + break; case VSRC_AM: @@ -156,6 +209,12 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->VSRCfunctionType = AM; here->VSRCfuncTGiven = TRUE; copy_coeffs(here, value); + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 0 ; +#endif + break; case VSRC_D_F1: @@ -233,6 +292,12 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->VSRCtrnoise_state = trnoise_state_init(NA, TS, NALPHA, NAMP, RTSAM, RTSCAPT, RTSEMT); } + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 0 ; +#endif + break; case VSRC_TRRANDOM: { @@ -259,6 +324,12 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->VSRCtrrandom_state = trrandom_state_init(rndtype, TS, TD, PARAM1, PARAM2); } + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 0 ; +#endif + break; #ifdef SHARED_MODULE @@ -269,6 +340,12 @@ VSRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) copy_coeffs(here, value); */ } + +#ifdef KLU + here->VSRCisLinear = 1 ; + here->VSRCisLinearStatic = 0 ; +#endif + break; #endif