64 #undef PSEUDOCONDITION 67 #undef spCOMPATIBILITY 71 #define EXPANDABLE YES 73 #define INITIALIZE YES 76 #define MODIFIED_NODAL YES 77 #define QUAD_ELEMENT YES 80 #define DOCUMENTATION YES 81 #define MULTIPLICATION YES 82 #define DETERMINANT YES 84 #define PSEUDOCONDITION YES 87 #define spCOMPATIBILITY YES 124 #define SPARSE_ID 0x772773 125 #define IS_SPARSE(matrix) ((matrix) != NULL && \ 126 (matrix)->ID == SPARSE_ID) 127 #define IS_VALID(matrix) ((matrix) != NULL && \ 128 (matrix)->ID == SPARSE_ID && \ 129 (matrix)->Error >= spOKAY && \ 130 (matrix)->Error < spFATAL) 131 #define IS_FACTORED(matrix) ((matrix)->Factored && !(matrix)->NeedsOrdering) 135 #define MAX(a,b) ((a) > (b) ? (a) : (b)) 136 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 139 #define ABS(a) ((a) < 0 ? -(a) : (a)) 142 #define SQR(a) ((a)*(a)) 145 #define SWAP(type, a, b) {type swapx; swapx = a; a = b; b = swapx;} 157 #define ELEMENT_MAG(ptr) (Matrix->Complex ? \ 158 (ABS((ptr)->Real) + ABS((ptr)->Imag)) : \ 159 ((ptr)->Real < 0.0 ? -(ptr)->Real : (ptr)->Real)) 161 #define ELEMENT_MAG(ptr) ((ptr)->Real < 0.0 ? -(ptr)->Real : (ptr)->Real) 165 #define CMPLX_ASSIGN(to,from) \ 166 { (to).Real = (from).Real; \ 167 (to).Imag = (from).Imag; \ 169 #define CMPLX_CONJ_ASSIGN(to,from) \ 170 { (to).Real = (from).Real; \ 171 (to).Imag = -(from).Imag; \ 173 #define CMPLX_NEGATE_ASSIGN(to,from) \ 174 { (to).Real = -(from).Real; \ 175 (to).Imag = -(from).Imag; \ 177 #define CMPLX_CONJ_NEGATE_ASSIGN(to,from) \ 178 { (to).Real = -(from).Real; \ 179 (to).Imag = (from).Imag; \ 181 #define CMPLX_CONJ(a) (a).Imag = -(a).Imag 182 #define CMPLX_NEGATE(a) \ 183 { (a).Real = -(a).Real; \ 184 (a).Imag = -(a).Imag; \ 188 #define CMPLX_1_NORM(a) (ABS((a).Real) + ABS((a).Imag)) 191 #define CMPLX_INF_NORM(a) (MAX (ABS((a).Real),ABS((a).Imag))) 194 #define CMPLX_2_NORM(a) (sqrt((a).Real*(a).Real + (a).Imag*(a).Imag)) 197 #define CMPLX_ADD(to,from_a,from_b) \ 198 { (to).Real = (from_a).Real + (from_b).Real; \ 199 (to).Imag = (from_a).Imag + (from_b).Imag; \ 203 #define CMPLX_SUBT(to,from_a,from_b) \ 204 { (to).Real = (from_a).Real - (from_b).Real; \ 205 (to).Imag = (from_a).Imag - (from_b).Imag; \ 209 #define CMPLX_ADD_ASSIGN(to,from) \ 210 { (to).Real += (from).Real; \ 211 (to).Imag += (from).Imag; \ 215 #define CMPLX_SUBT_ASSIGN(to,from) \ 216 { (to).Real -= (from).Real; \ 217 (to).Imag -= (from).Imag; \ 221 #define SCLR_MULT(to,sclr,cmplx) \ 222 { (to).Real = (sclr) * (cmplx).Real; \ 223 (to).Imag = (sclr) * (cmplx).Imag; \ 227 #define SCLR_MULT_ASSIGN(to,sclr) \ 228 { (to).Real *= (sclr); \ 229 (to).Imag *= (sclr); \ 233 #define CMPLX_MULT(to,from_a,from_b) \ 234 { (to).Real = (from_a).Real * (from_b).Real - \ 235 (from_a).Imag * (from_b).Imag; \ 236 (to).Imag = (from_a).Real * (from_b).Imag + \ 237 (from_a).Imag * (from_b).Real; \ 241 #define CMPLX_MULT_ASSIGN(to,from) \ 242 { RealNumber to_real_ = (to).Real; \ 243 (to).Real = to_real_ * (from).Real - \ 244 (to).Imag * (from).Imag; \ 245 (to).Imag = to_real_ * (from).Imag + \ 246 (to).Imag * (from).Real; \ 251 #define CMPLX_CONJ_MULT(to,from_a,from_b) \ 252 { (to).Real = (from_a).Real * (from_b).Real + \ 253 (from_a).Imag * (from_b).Imag; \ 254 (to).Imag = (from_a).Real * (from_b).Imag - \ 255 (from_a).Imag * (from_b).Real; \ 260 #define CMPLX_MULT_ADD(to,mult_a,mult_b,add) \ 261 { (to).Real = (mult_a).Real * (mult_b).Real - \ 262 (mult_a).Imag * (mult_b).Imag + (add).Real; \ 263 (to).Imag = (mult_a).Real * (mult_b).Imag + \ 264 (mult_a).Imag * (mult_b).Real + (add).Imag; \ 269 #define CMPLX_MULT_SUBT(to,mult_a,mult_b,subt) \ 270 { (to).Real = (subt).Real - (mult_a).Real * (mult_b).Real + \ 271 (mult_a).Imag * (mult_b).Imag; \ 272 (to).Imag = (subt).Imag - (mult_a).Real * (mult_b).Imag - \ 273 (mult_a).Imag * (mult_b).Real; \ 279 #define CMPLX_CONJ_MULT_ADD(to,mult_a,mult_b,add) \ 280 { (to).Real = (mult_a).Real * (mult_b).Real + \ 281 (mult_a).Imag * (mult_b).Imag + (add).Real; \ 282 (to).Imag = (mult_a).Real * (mult_b).Imag - \ 283 (mult_a).Imag * (mult_b).Real + (add).Imag; \ 288 #define CMPLX_MULT_ADD_ASSIGN(to,from_a,from_b) \ 289 { (to).Real += (from_a).Real * (from_b).Real - \ 290 (from_a).Imag * (from_b).Imag; \ 291 (to).Imag += (from_a).Real * (from_b).Imag + \ 292 (from_a).Imag * (from_b).Real; \ 297 #define CMPLX_MULT_SUBT_ASSIGN(to,from_a,from_b) \ 298 { (to).Real -= (from_a).Real * (from_b).Real - \ 299 (from_a).Imag * (from_b).Imag; \ 300 (to).Imag -= (from_a).Real * (from_b).Imag + \ 301 (from_a).Imag * (from_b).Real; \ 307 #define CMPLX_CONJ_MULT_ADD_ASSIGN(to,from_a,from_b) \ 308 { (to).Real += (from_a).Real * (from_b).Real + \ 309 (from_a).Imag * (from_b).Imag; \ 310 (to).Imag += (from_a).Real * (from_b).Imag - \ 311 (from_a).Imag * (from_b).Real; \ 317 #define CMPLX_CONJ_MULT_SUBT_ASSIGN(to,from_a,from_b) \ 318 { (to).Real -= (from_a).Real * (from_b).Real + \ 319 (from_a).Imag * (from_b).Imag; \ 320 (to).Imag -= (from_a).Real * (from_b).Imag - \ 321 (from_a).Imag * (from_b).Real; \ 329 #define CMPLX_DIV(to,num,den) \ 330 { RealNumber r_, s_; \ 331 if (((den).Real >= (den).Imag AND (den).Real > -(den).Imag) OR \ 332 ((den).Real < (den).Imag AND (den).Real <= -(den).Imag)) \ 333 { r_ = (den).Imag / (den).Real; \ 334 s_ = (den).Real + r_*(den).Imag; \ 335 (to).Real = ((num).Real + r_*(num).Imag)/s_; \ 336 (to).Imag = ((num).Imag - r_*(num).Real)/s_; \ 339 { r_ = (den).Real / (den).Imag; \ 340 s_ = (den).Imag + r_*(den).Real; \ 341 (to).Real = (r_*(num).Real + (num).Imag)/s_; \ 342 (to).Imag = (r_*(num).Imag - (num).Real)/s_; \ 347 #define CMPLX_DIV_ASSIGN(num,den) \ 348 { RealNumber r_, s_, t_; \ 349 if (((den).Real >= (den).Imag AND (den).Real > -(den).Imag) OR \ 350 ((den).Real < (den).Imag AND (den).Real <= -(den).Imag)) \ 351 { r_ = (den).Imag / (den).Real; \ 352 s_ = (den).Real + r_*(den).Imag; \ 353 t_ = ((num).Real + r_*(num).Imag)/s_; \ 354 (num).Imag = ((num).Imag - r_*(num).Real)/s_; \ 358 { r_ = (den).Real / (den).Imag; \ 359 s_ = (den).Imag + r_*(den).Real; \ 360 t_ = (r_*(num).Real + (num).Imag)/s_; \ 361 (num).Imag = (r_*(num).Imag - (num).Real)/s_; \ 367 #define CMPLX_RECIPROCAL(to,den) \ 369 if (((den).Real >= (den).Imag AND (den).Real > -(den).Imag) OR \ 370 ((den).Real < (den).Imag AND (den).Real <= -(den).Imag)) \ 371 { r_ = (den).Imag / (den).Real; \ 372 (to).Imag = -r_*((to).Real = 1.0/((den).Real + r_*(den).Imag)); \ 375 { r_ = (den).Real / (den).Imag; \ 376 (to).Real = -r_*((to).Imag = -1.0/((den).Imag + r_*(den).Real));\ 396 #define ASSERT(condition) if (NOT(condition)) ABORT() 398 #define ASSERT(condition) 403 { (void)fflush(stdout); \ 404 (void)fprintf(stderr, "sparse: panic in file `%s' at line %d.\n", \ 405 __FILE__, __LINE__); \ 406 (void)fflush(stderr); \ 425 #if spCOMPLEX AND spSEPARATED_COMPLEX_VECTORS 426 #define IMAG_VECTORS , iRHS, iSolution 427 #define IMAG_RHS , iRHS 433 #define ALLOC(type,number) ((type *)tmalloc((unsigned)(sizeof(type)*(number)))) 434 #define REALLOC(ptr,type,number) \ 435 ptr = (type *)trealloc((char *)ptr,(unsigned)(sizeof(type)*(number))) 436 #define FREE(ptr) { if ((ptr) != NULL) txfree((char *)(ptr)); (ptr) = NULL; } 440 #define CALLOC(ptr,type,number) \ 441 { int i; ptr = ALLOC(type, number); \ 442 if (ptr != (type *)NULL) \ 443 for(i=(number)-1;i>=0; i--) ptr[i] = (type) 0; \ 884 extern ElementPtr
spcCreateElement( MatrixPtr,
int,
int, ElementPtr*,
int );
ElementPtr NextAvailFillin
ElementPtr spcGetElement()
char PivotSelectionMethod
ArrayOfElementPtrs FirstInRow
int NumberOfFillinsInList
struct FillinListNodeStruct * FirstFillinListNode
struct ComplexNumber * ComplexVector
BOOLEAN PreviousMatrixWasComplex
BOOLEAN NumberOfInterchangesIsOdd
void spcCreateInternalVectors()
struct MatrixElement * NextInCol
struct MatrixElement * ElementPtr
struct FillinListNodeStruct * LastFillinListNode
struct AllocationRecord * AllocationListPtr
ElementPtr spcCreateElement()
ElementPtr spcFindElementInCol()
ElementPtr spcGetFillin()
ElementPtr NextAvailElement
struct AllocationRecord * NextRecord
BOOLEAN InternalVectorsAllocated
struct MatrixElement * NextInRow
struct MatrixFrame * MatrixPtr
struct FillinListNodeStruct * Next
ElementPtr * ArrayOfElementPtrs
int MaxRowCountInLowerTri
ArrayOfElementPtrs FirstInCol
AllocationListPtr TopOfAllocationList