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; \ ArrayOfElementPtrs FirstInRow
AllocationListPtr TopOfAllocationList
int NumberOfFillinsInList
ElementPtr NextAvailElement
struct FillinListNodeStruct * Next
ArrayOfElementPtrs FirstInCol
struct ComplexNumber * ComplexVector
struct MatrixElement * NextInRow
struct AllocationRecord * NextRecord
BOOLEAN InternalVectorsAllocated
struct MatrixElement * ElementPtr
struct AllocationRecord * AllocationListPtr
struct FillinListNodeStruct * LastFillinListNode
BOOLEAN NumberOfInterchangesIsOdd
ElementPtr NextAvailFillin
struct FillinListNodeStruct * FirstFillinListNode
int MaxRowCountInLowerTri
char PivotSelectionMethod
struct MatrixFrame * MatrixPtr
ElementPtr * ArrayOfElementPtrs
struct MatrixElement * NextInCol
BOOLEAN PreviousMatrixWasComplex