diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index 76470de0d..6e22c3b0a 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -36,12 +36,19 @@ CKTsetup(CKTcircuit *ckt) { int i; int error; + #ifdef XSPICE /* gtri - begin - Setup for adding rshunt option resistors */ CKTnode *node; int num_nodes; /* gtri - end - Setup for adding rshunt option resistors */ + +#ifdef KLU + BindElement BindNode, *matched, *BindStruct ; + size_t nz ; #endif +#endif + SMPmatrix *matrix; if (!ckt->CKThead) { @@ -108,6 +115,38 @@ CKTsetup(CKTcircuit *ckt) } } +#ifdef XSPICE + /* gtri - begin - Setup for adding rshunt option resistors */ + + if(ckt->enh->rshunt_data.enabled) { + + /* Count number of voltage nodes in circuit */ + for(num_nodes = 0, node = ckt->CKTnodes; node; node = node->next) + if((node->type == SP_VOLTAGE) && (node->number != 0)) + num_nodes++; + + /* Allocate space for the matrix diagonal data */ + if(num_nodes > 0) { + ckt->enh->rshunt_data.diag = + TMALLOC(double *, num_nodes); + } + + /* Set the number of nodes in the rshunt data */ + ckt->enh->rshunt_data.num_nodes = num_nodes; + + /* Get/create matrix diagonal entry following what RESsetup does */ + for(i = 0, node = ckt->CKTnodes; node; node = node->next) { + if((node->type == SP_VOLTAGE) && (node->number != 0)) { + ckt->enh->rshunt_data.diag[i] = + SMPmakeElt(matrix,node->number,node->number); + i++; + } + } + } + + /* gtri - end - Setup for adding rshunt option resistors */ +#endif + #ifdef KLU if (ckt->CKTmatrix->CKTkluMODE) { @@ -120,6 +159,27 @@ CKTsetup(CKTcircuit *ckt) for (i = 0 ; i < DEVmaxnum ; i++) if (DEVices [i] && DEVices [i]->DEVbindCSC && ckt->CKThead [i]) DEVices [i]->DEVbindCSC (ckt->CKThead [i], ckt) ; + +#ifdef XSPICE + if (ckt->enh->rshunt_data.num_nodes > 0) { + BindStruct = ckt->CKTmatrix->SMPkluMatrix->KLUmatrixBindStructCOO ; + nz = (size_t)ckt->CKTmatrix->SMPkluMatrix->KLUmatrixLinkedListNZ ; + for(i = 0, node = ckt->CKTnodes; node; node = node->next) { + if((node->type == SP_VOLTAGE) && (node->number != 0)) { + BindNode.COO = ckt->enh->rshunt_data.diag [i] ; + BindNode.CSC = NULL ; + BindNode.CSC_Complex = NULL ; + matched = (BindElement *) bsearch (&BindNode, BindStruct, nz, sizeof (BindElement), BindCompare) ; + if (matched == NULL) { + printf ("Ptr %p not found in BindStruct Table\n", ckt->enh->rshunt_data.diag [i]) ; + } + ckt->enh->rshunt_data.diag [i] = matched->CSC ; + i++; + } + } + } +#endif + } else { fprintf (stderr, "Using SPARSE 1.3 as Direct Linear Solver\n") ; } @@ -141,37 +201,6 @@ CKTsetup(CKTcircuit *ckt) error = NIreinit(ckt); if(error) return(error); } -#ifdef XSPICE - /* gtri - begin - Setup for adding rshunt option resistors */ - - if(ckt->enh->rshunt_data.enabled) { - - /* Count number of voltage nodes in circuit */ - for(num_nodes = 0, node = ckt->CKTnodes; node; node = node->next) - if((node->type == SP_VOLTAGE) && (node->number != 0)) - num_nodes++; - - /* Allocate space for the matrix diagonal data */ - if(num_nodes > 0) { - ckt->enh->rshunt_data.diag = - TMALLOC(double *, num_nodes); - } - - /* Set the number of nodes in the rshunt data */ - ckt->enh->rshunt_data.num_nodes = num_nodes; - - /* Get/create matrix diagonal entry following what RESsetup does */ - for(i = 0, node = ckt->CKTnodes; node; node = node->next) { - if((node->type == SP_VOLTAGE) && (node->number != 0)) { - ckt->enh->rshunt_data.diag[i] = - SMPmakeElt(matrix,node->number,node->number); - i++; - } - } - } - - /* gtri - end - Setup for adding rshunt option resistors */ -#endif return(OK); }