61 #undef PSEUDOCONDITION
67 #define EXPANDABLE YES
69 #define INITIALIZE YES
72 #define MODIFIED_NODAL YES
73 #define QUAD_ELEMENT YES
76 #define DOCUMENTATION YES
77 #define MULTIPLICATION YES
78 #define DETERMINANT YES
80 #define PSEUDOCONDITION YES
119 #define SPARSE_ID 0x772773
120 #define IS_SPARSE(matrix) ((matrix) != NULL && \
121 (matrix)->ID == SPARSE_ID)
122 #define IS_VALID(matrix) ((matrix) != NULL && \
123 (matrix)->ID == SPARSE_ID && \
124 (matrix)->Error >= spOKAY && \
125 (matrix)->Error < spFATAL)
126 #define IS_FACTORED(matrix) ((matrix)->Factored && !(matrix)->NeedsOrdering)
130 #define MAX(a,b) ((a) > (b) ? (a) : (b))
131 #define MIN(a,b) ((a) < (b) ? (a) : (b))
134 #define ABS(a) ((a) < 0.0 ? -(a) : (a))
137 #define SQR(a) ((a)*(a))
140 #define SWAP(type, a, b) {type swapx; swapx = a; a = b; b = swapx;}
144 #define ELEMENT_MAG(ptr) (ABS((ptr)->Real) + ABS((ptr)->Imag))
146 #define ELEMENT_MAG(ptr) ((ptr)->Real < 0.0 ? -(ptr)->Real : (ptr)->Real)
150 #define CMPLX_ASSIGN(to,from) \
151 { (to).Real = (from).Real; \
152 (to).Imag = (from).Imag; \
154 #define CMPLX_CONJ_ASSIGN(to,from) \
155 { (to).Real = (from).Real; \
156 (to).Imag = -(from).Imag; \
158 #define CMPLX_NEGATE_ASSIGN(to,from) \
159 { (to).Real = -(from).Real; \
160 (to).Imag = -(from).Imag; \
162 #define CMPLX_CONJ_NEGATE_ASSIGN(to,from) \
163 { (to).Real = -(from).Real; \
164 (to).Imag = (from).Imag; \
166 #define CMPLX_CONJ(a) (a).Imag = -(a).Imag
167 #define CMPLX_NEGATE(a) \
168 { (a).Real = -(a).Real; \
169 (a).Imag = -(a).Imag; \
173 #define CMPLX_1_NORM(a) (ABS((a).Real) + ABS((a).Imag))
176 #define CMPLX_INF_NORM(a) (MAX (ABS((a).Real),ABS((a).Imag)))
179 #define CMPLX_2_NORM(a) (sqrt((a).Real*(a).Real + (a).Imag*(a).Imag))
182 #define CMPLX_ADD(to,from_a,from_b) \
183 { (to).Real = (from_a).Real + (from_b).Real; \
184 (to).Imag = (from_a).Imag + (from_b).Imag; \
188 #define CMPLX_SUBT(to,from_a,from_b) \
189 { (to).Real = (from_a).Real - (from_b).Real; \
190 (to).Imag = (from_a).Imag - (from_b).Imag; \
194 #define CMPLX_ADD_ASSIGN(to,from) \
195 { (to).Real += (from).Real; \
196 (to).Imag += (from).Imag; \
200 #define CMPLX_SUBT_ASSIGN(to,from) \
201 { (to).Real -= (from).Real; \
202 (to).Imag -= (from).Imag; \
206 #define SCLR_MULT(to,sclr,cmplx) \
207 { (to).Real = (sclr) * (cmplx).Real; \
208 (to).Imag = (sclr) * (cmplx).Imag; \
212 #define SCLR_MULT_ASSIGN(to,sclr) \
213 { (to).Real *= (sclr); \
214 (to).Imag *= (sclr); \
218 #define CMPLX_MULT(to,from_a,from_b) \
219 { (to).Real = (from_a).Real * (from_b).Real - \
220 (from_a).Imag * (from_b).Imag; \
221 (to).Imag = (from_a).Real * (from_b).Imag + \
222 (from_a).Imag * (from_b).Real; \
226 #define CMPLX_MULT_ASSIGN(to,from) \
227 { RealNumber to_real_ = (to).Real; \
228 (to).Real = to_real_ * (from).Real - \
229 (to).Imag * (from).Imag; \
230 (to).Imag = to_real_ * (from).Imag + \
231 (to).Imag * (from).Real; \
236 #define CMPLX_CONJ_MULT(to,from_a,from_b) \
237 { (to).Real = (from_a).Real * (from_b).Real + \
238 (from_a).Imag * (from_b).Imag; \
239 (to).Imag = (from_a).Real * (from_b).Imag - \
240 (from_a).Imag * (from_b).Real; \
245 #define CMPLX_MULT_ADD(to,mult_a,mult_b,add) \
246 { (to).Real = (mult_a).Real * (mult_b).Real - \
247 (mult_a).Imag * (mult_b).Imag + (add).Real; \
248 (to).Imag = (mult_a).Real * (mult_b).Imag + \
249 (mult_a).Imag * (mult_b).Real + (add).Imag; \
254 #define CMPLX_MULT_SUBT(to,mult_a,mult_b,subt) \
255 { (to).Real = (subt).Real - (mult_a).Real * (mult_b).Real + \
256 (mult_a).Imag * (mult_b).Imag; \
257 (to).Imag = (subt).Imag - (mult_a).Real * (mult_b).Imag - \
258 (mult_a).Imag * (mult_b).Real; \
264 #define CMPLX_CONJ_MULT_ADD(to,mult_a,mult_b,add) \
265 { (to).Real = (mult_a).Real * (mult_b).Real + \
266 (mult_a).Imag * (mult_b).Imag + (add).Real; \
267 (to).Imag = (mult_a).Real * (mult_b).Imag - \
268 (mult_a).Imag * (mult_b).Real + (add).Imag; \
273 #define CMPLX_MULT_ADD_ASSIGN(to,from_a,from_b) \
274 { (to).Real += (from_a).Real * (from_b).Real - \
275 (from_a).Imag * (from_b).Imag; \
276 (to).Imag += (from_a).Real * (from_b).Imag + \
277 (from_a).Imag * (from_b).Real; \
282 #define CMPLX_MULT_SUBT_ASSIGN(to,from_a,from_b) \
283 { (to).Real -= (from_a).Real * (from_b).Real - \
284 (from_a).Imag * (from_b).Imag; \
285 (to).Imag -= (from_a).Real * (from_b).Imag + \
286 (from_a).Imag * (from_b).Real; \
292 #define CMPLX_CONJ_MULT_ADD_ASSIGN(to,from_a,from_b) \
293 { (to).Real += (from_a).Real * (from_b).Real + \
294 (from_a).Imag * (from_b).Imag; \
295 (to).Imag += (from_a).Real * (from_b).Imag - \
296 (from_a).Imag * (from_b).Real; \
302 #define CMPLX_CONJ_MULT_SUBT_ASSIGN(to,from_a,from_b) \
303 { (to).Real -= (from_a).Real * (from_b).Real + \
304 (from_a).Imag * (from_b).Imag; \
305 (to).Imag -= (from_a).Real * (from_b).Imag - \
306 (from_a).Imag * (from_b).Real; \
314 #define CMPLX_DIV(to,num,den) \
315 { RealNumber r_, s_; \
316 if (((den).Real >= (den).Imag AND (den).Real > -(den).Imag) OR \
317 ((den).Real < (den).Imag AND (den).Real <= -(den).Imag)) \
318 { r_ = (den).Imag / (den).Real; \
319 s_ = (den).Real + r_*(den).Imag; \
320 (to).Real = ((num).Real + r_*(num).Imag)/s_; \
321 (to).Imag = ((num).Imag - r_*(num).Real)/s_; \
324 { r_ = (den).Real / (den).Imag; \
325 s_ = (den).Imag + r_*(den).Real; \
326 (to).Real = (r_*(num).Real + (num).Imag)/s_; \
327 (to).Imag = (r_*(num).Imag - (num).Real)/s_; \
332 #define CMPLX_DIV_ASSIGN(num,den) \
333 { RealNumber r_, s_, t_; \
334 if (((den).Real >= (den).Imag AND (den).Real > -(den).Imag) OR \
335 ((den).Real < (den).Imag AND (den).Real <= -(den).Imag)) \
336 { r_ = (den).Imag / (den).Real; \
337 s_ = (den).Real + r_*(den).Imag; \
338 t_ = ((num).Real + r_*(num).Imag)/s_; \
339 (num).Imag = ((num).Imag - r_*(num).Real)/s_; \
343 { r_ = (den).Real / (den).Imag; \
344 s_ = (den).Imag + r_*(den).Real; \
345 t_ = (r_*(num).Real + (num).Imag)/s_; \
346 (num).Imag = (r_*(num).Imag - (num).Real)/s_; \
352 #define CMPLX_RECIPROCAL(to,den) \
354 if (((den).Real >= (den).Imag AND (den).Real > -(den).Imag) OR \
355 ((den).Real < (den).Imag AND (den).Real <= -(den).Imag)) \
356 { r_ = (den).Imag / (den).Real; \
357 (to).Imag = -r_*((to).Real = 1.0/((den).Real + r_*(den).Imag)); \
360 { r_ = (den).Real / (den).Imag; \
361 (to).Real = -r_*((to).Imag = -1.0/((den).Imag + r_*(den).Real));\
381 #define ASSERT(condition) if (NOT(condition)) ABORT()
383 #define ASSERT(condition)
388 { (void)fflush(stdout); \
389 (void)fprintf(stderr, "sparse: panic in file `%s' at line %d.\n", \
390 __FILE__, __LINE__); \
391 (void)fflush(stderr); \
410 #if spCOMPLEX AND spSEPARATED_COMPLEX_VECTORS
411 #define IMAG_VECTORS , iRHS, iSolution
412 #define IMAG_RHS , iRHS
429 #if !defined(__MWERKS__)
430 extern char *malloc(), *calloc(), *realloc();
442 #define ALLOC(type,number) ((type *)malloc((unsigned)(sizeof(type)*(number))))
443 #define REALLOC(ptr,type,number) \
444 ptr = (type *)realloc((char *)ptr,(unsigned)(sizeof(type)*(number)))
446 #define FREE(ptr) { if ((ptr) != NULL) {char* p = (char*)(ptr); (ptr) = NULL; free(p);} }
450 #define CALLOC(ptr,type,number) \
451 { int i; ptr = ALLOC(type, number); \
452 if (ptr != (type *)NULL) \
453 for(i=(number)-1;i>=0; i--) ptr[i] = (type) 0; \
struct MatrixFrame * MatrixPtr
struct MatrixElement * ElementPtr
ElementPtr * ArrayOfElementPtrs
struct AllocationRecord * AllocationListPtr
struct ComplexNumber * ComplexVector
struct AllocationRecord * NextRecord
int NumberOfFillinsInList
struct FillinListNodeStruct * Next
struct MatrixElement * NextInCol
struct MatrixElement * NextInRow
int MaxRowCountInLowerTri
ElementPtr NextAvailFillin
BOOLEAN InternalVectorsAllocated
BOOLEAN PreviousMatrixWasComplex
struct FillinListNodeStruct * FirstFillinListNode
BOOLEAN NumberOfInterchangesIsOdd
struct FillinListNodeStruct * LastFillinListNode
ArrayOfElementPtrs FirstInCol
char PivotSelectionMethod
ArrayOfElementPtrs FirstInRow
AllocationListPtr TopOfAllocationList
ElementPtr NextAvailElement
struct MatrixElement TrashCan