#ifndef __DCLAPACK_H__ #define __DCLAPACK_H__ #ifndef FLOAT #define FLOAT float #endif #include #define _ABS(a) ( (a)<=0 ? 0-(a) : (a) ) #ifdef DYNAMIC_INDEX #define _(A,O,P) A[O*n+P] #else #define _(A,O,P) A[O][P] #endif /* * Prints a matrix A (n by m) */ #define PRINT(A,n,m) { \ int i,j; \ printf(#A "\n"); \ for (i=0; i _ABS(_(U,max,i))) { max = j; } \ } \ _tempi=Piv[i]; Piv[i]=Piv[max]; Piv[max]=_tempi; \ for (k=i; k=0; j--) { \ float sum=0.0; \ for (k=n-1; k>j; k--) { sum += _(U,j,k)*_(X,k,i); } \ _(X,j,i) = (_(B,j,i) - sum) / _(U,j,j); \ } \ } \ } /* * Inverts a matrix X (n by n) using the method of LU decomposition */ #ifdef DYNAMIC_INDEX #define INV_SETUP(ORDER) \ FLOAT Ipiv[ORDER*ORDER]; \ FLOAT L[ORDER*ORDER]; \ FLOAT U[ORDER*ORDER]; \ FLOAT I[ORDER*ORDER]; \ FLOAT C[ORDER*ORDER]; #else #define INV_SETUP(ORDER) \ FLOAT Ipiv[ORDER][ORDER]; \ FLOAT L[ORDER][ORDER]; \ FLOAT U[ORDER][ORDER]; \ FLOAT I[ORDER][ORDER]; \ FLOAT C[ORDER][ORDER]; #endif #define INV(Ainv,A,n,ORDER) { \ INV_SETUP(ORDER) \ int Piv[ORDER]; \ IDENTITY(I,n); \ LU(L,U,A,Piv,n); \ PIVOT(Ipiv,I,Piv,n,n); \ L_SUB(C,L,Ipiv,n,n); \ U_SUB(Ainv,U,C,n,n); \ } /* PRINT(A,n,n); \ PRINT(L,n,n); \ PRINT(U,n,n); \ MUL(L,U,LU,n,n,n);\ PRINT(LU,n,n);\ PRINT(C,n,n); \ PRINT(Ainv,n,n); \ */ /* * Matrix Multiply R = A * B * R (n by p) * A (n by m) * B (m by p) */ #define MUL(R,A,B,n,m,p) { \ int i,j,k; \ for (i=0; i