Jspice3
niditer.c File Reference
#include "spice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "util.h"
#include "sperror.h"
#include "cktext.h"
#include "niext.h"
Include dependency graph for niditer.c:

Go to the source code of this file.

Functions

int NIdIter (CKTcircuit *ckt)
 

Function Documentation

int NIdIter ( CKTcircuit ckt)

Definition at line 26 of file niditer.c.

29 {
30  int error;
31  int ignore;
32  double *temp;
33 
34  for (;;) {
35  ckt->CKTnoncon = 0;
36 
37  if (ckt->CKTniState & NIACSHOULDREORDER) {
38  spSetComplex(ckt->CKTmatrix);
39  error = spOrderAndFactor(ckt->CKTmatrix,NULL,
40  ckt->CKTpivotRelTol,ckt->CKTpivotAbsTol,1);
42  if (error != 0) {
43  /* either singular equations or no memory, in either case,
44  * let caller handle problem
45  */
46  return (error);
47  }
48  }
49  else {
50  spSetComplex(ckt->CKTmatrix);
51  error = spFactor(ckt->CKTmatrix);
52  if (error != 0) {
53  if (error == E_SINGULAR) {
54  /* the problem is that the matrix can't be solved with
55  * the current LU factorization. Maybe if we reload and
56  * try to reorder again it will help...
57  */
59  temp = ckt->CKTrhs;
60  ckt->CKTrhs = ckt->CKTrhsSpare;
61  ckt->CKTrhsSpare = temp;
62 
63  temp = ckt->CKTirhs;
64  ckt->CKTirhs = ckt->CKTirhsSpare;
65  ckt->CKTirhsSpare = temp;
66 
67  error = CKTacLoad(ckt);
68  if (error) return(error);
69 
70  temp = ckt->CKTrhs;
71  ckt->CKTrhs = ckt->CKTrhsSpare;
72  ckt->CKTrhsSpare = temp;
73 
74  temp = ckt->CKTirhs;
75  ckt->CKTirhs = ckt->CKTirhsSpare;
76  ckt->CKTirhsSpare = temp;
77  continue;
78  }
79  return (error); /* can't handle E_BADMATRIX, so let caller */
80  }
81  }
82  break;
83  }
84  spSolve(ckt->CKTmatrix,ckt->CKTrhs,ckt->CKTrhs,
85  ckt->CKTirhs,ckt->CKTirhs);
86 
87  *ckt->CKTrhs = 0;
88  *ckt->CKTrhsSpare = 0;
89  *ckt->CKTrhsOld = 0;
90  *ckt->CKTirhs = 0;
91  *ckt->CKTirhsSpare = 0;
92  *ckt->CKTirhsOld = 0;
93 
94  temp = ckt->CKTirhsOld;
95  ckt->CKTirhsOld = ckt->CKTirhs;
96  ckt->CKTirhs = temp;
97 
98  temp = ckt->CKTrhsOld;
99  ckt->CKTrhsOld = ckt->CKTrhs;
100  ckt->CKTrhs = temp;
101  return (OK);
102 }
#define NIACSHOULDREORDER
Definition: cktdefs.h:123
double * CKTirhs
Definition: cktdefs.h:100
double * CKTrhsSpare
Definition: cktdefs.h:99
SMPmatrix * CKTmatrix
Definition: cktdefs.h:95
#define OK
Definition: iferrmsg.h:17
double * CKTrhsOld
Definition: cktdefs.h:98
double * CKTirhsSpare
Definition: cktdefs.h:102
#define NULL
Definition: spdefs.h:121
int CKTniState
Definition: cktdefs.h:96
int CKTacLoad()
int spFactor()
double * CKTirhsOld
Definition: cktdefs.h:101
void spSetComplex()
int spOrderAndFactor()
double CKTpivotRelTol
Definition: cktdefs.h:182
#define E_SINGULAR
Definition: sperror.h:17
int CKTnoncon
Definition: cktdefs.h:203
double CKTpivotAbsTol
Definition: cktdefs.h:181
void spSolve()
double * CKTrhs
Definition: cktdefs.h:97