/*************************************************************************/ /* */ /* Copyright (c) 1994 Stanford University */ /* */ /* All rights reserved. */ /* */ /* Permission is given to use, copy, and modify this software for any */ /* non-commercial purpose as long as this copyright notice is not */ /* removed. All other uses, including redistribution in whole or in */ /* part, are forbidden without prior written permission. */ /* */ /* This software is provided with absolutely no warranty and no */ /* support. */ /* */ /*************************************************************************/ EXTERN_ENV #include "matrix.h" #include long vMiss=0, wMiss=0, xMiss=0, yMiss=0; /* Local but don't care */ extern long BS; extern struct GlobalMemory *Global; extern BMatrix LB; extern long solution_method; extern long *node, *firstchild; /* global */ long *block_start, *all_blocks; /* arguments */ extern long *T, P; void BFac(long diag, struct LocalCopies *lc) { long n, is, il, js, jl, ks, kl; double *A; n = BLOCK(diag)->length; A = BLOCK(diag)->nz; for (js=0; js n) jl = n; OneFac(&A[js+n*js], jl-js, n); for (is=jl; is n) il = n; CopyBlock(A, lc->blktmp, n, is, js, il, jl); OneDiv(&A[js+n*js], lc->blktmp, jl-js, il-is, n); CopyBlockBack(A, lc->blktmp, n, is, js, il, jl); for (ks=jl; ks n) kl = n; OneMatmat(lc->blktmp, &A[ks+n*js], &A[is+n*ks], kl-ks, jl-js, il-is, n, n); } OneLower(lc->blktmp, &A[is+n*is], il-is, jl-js, n); } } } /* Factor A (dim n1 by n1), stride n2 */ void OneFac(double *A, long n1, long n2) { long i, j, k; for (j=0; j n1) jl = n1; for (is=0; is n3) il = n3; CopyBlock(B, lc->blktmp, n3, is, js, il, jl); OneDiv(&A[js+js*n1], lc->blktmp, jl-js, il-is, n1); CopyBlockBack(B, lc->blktmp, n3, is, js, il, jl); for (ks=jl; ks n1) kl = n1; OneMatmat(lc->blktmp, &A[ks+js*n1], &B[is+ks*n3], kl-ks, jl-js, il-is, n3, n1); } } } } } /* diag block is A, dim n1 by n1, stride n4 */ /* below block is B, dim n3 by n1 */ /* n4 is stride of A */ void OneDiv(double *A, double *B, long n1, long n3, long n4) { long i, j, k; double a_j0k0, a_j0k1, a_j0k2, a_j0k3; double a_j1k0, a_j1k1, a_j1k2, a_j1k3; double *b0, *b1, *b2, *b3; double *dest0, *dest1, *last; double *tmp; double t0, t1, tmp0, tmp1; for (j=0; j n2) kl = n2; OneMatmat(&B[ks*n3], &A[ks*n1], C, n1, kl-ks, n3, n3, n1); } } else { for (is=0; is n3) il = n3; for (ks=0; ks n2) kl = n2; CopyBlock(B, lc->blktmp, n3, is, ks, il, kl); OneMatmat(lc->blktmp, &A[ks*n1], &C[is], n1, kl-ks, il-is, n3, n1); } } } } void CopyBlock(double *B, double *dest, long n3, long is, long ks, long il, long kl/*, long MyNum, struct LocalCopies *lc*/) { long i, k, bs; bs = il-is; for (k=ks; k n1) il = n1; for (ks=0; ks n2) kl = n2; CopyBlock(A, lc->blktmp, n1, is, ks, il, kl); OneMatmat(lc->blktmp, &A[ks*n1], &C[is], is, kl-ks, il-is, n1, n1); OneLower(lc->blktmp, &C[is+is*n1], il-is, kl-ks, n1); } } } } /* left part is A, dim n1 by n2 */ /* result is lower triangle of square block, dim n1 by n1 */ /* n3 is stride of C */ void OneLower(double *A, double *C, long n1, long n2, long n3) { long i, j, k; double *tmp; double a_j0k0, a_j0k1, a_j0k2, a_j0k3; double a_j1k0, a_j1k1, a_j1k2, a_j1k3; double *b0, *b1, *b2, *b3; double t0, t1, tmp0, tmp1; double *dest0, *dest1, *last; for (j=0; jlength; into_i = into_j; for (; ilength; update_len = into_i; for (; ilength; domain_update = LB.proc_domain_storage[domain]; *update = &domain_update[into_j*update_len - into_j*(into_j+1)/2 + into_i]; *stride = update_len - into_j - 1; }