Jspice3
niaciter.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 niaciter.c:

Go to the source code of this file.

Functions

int NIacIter (CKTcircuit *ckt)
 

Function Documentation

int NIacIter ( CKTcircuit ckt)

Definition at line 29 of file niaciter.c.

32 {
33  int error;
34  int ignore;
35  double *temp;
36 
37  for (;;) {
38  ckt->CKTnoncon = 0;
39 
40  error = CKTacLoad(ckt);
41  if (error) return (error);
42 
43  if (ckt->CKTniState & NIACSHOULDREORDER) {
44  spSetComplex(ckt->CKTmatrix);
45  error = spOrderAndFactor(ckt->CKTmatrix,NULL,
46  ckt->CKTpivotRelTol,ckt->CKTpivotAbsTol,1);
48  if (error != 0) {
49  /* either singular equations or no memory, in either case,
50  * let caller handle problem
51  */
52  return (error);
53  }
54  }
55  else {
56  spSetComplex(ckt->CKTmatrix);
57  error = spFactor(ckt->CKTmatrix);
58  if (error != 0) {
59  if (error == E_SINGULAR) {
60  /* the problem is that the matrix can't be solved with
61  * the current LU factorization. Maybe if we reload and
62  * try to reorder again it will help...
63  */
65  continue;
66  }
67  return (error); /* can't handle E_BADMATRIX, so let caller */
68  }
69  }
70  break;
71  }
72  spSolve(ckt->CKTmatrix,ckt->CKTrhs,ckt->CKTrhs,
73  ckt->CKTirhs,ckt->CKTirhs);
74 
75  *ckt->CKTrhs = 0;
76  *ckt->CKTrhsSpare = 0;
77  *ckt->CKTrhsOld = 0;
78  *ckt->CKTirhs = 0;
79  *ckt->CKTirhsSpare = 0;
80  *ckt->CKTirhsOld = 0;
81 
82  temp = ckt->CKTirhsOld;
83  ckt->CKTirhsOld = ckt->CKTirhs;
84  ckt->CKTirhs = temp;
85 
86  temp = ckt->CKTrhsOld;
87  ckt->CKTrhsOld = ckt->CKTrhs;
88  ckt->CKTrhs = temp;
89 
90  return (OK);
91 }
#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