00001
00002
00003
00004
00005
00006 #ifndef __GAUSSIAN_H__
00007 #define __GAUSSIAN_H__
00008
00009 #ifdef _PC
00010 #define DEBUG_SOLVER (TRUE)
00011 #else
00012 #define DEBUG_SOLVER (FALSE)
00013 #endif
00014
00015 #define BIG_NMAX 32
00016 #define BIG_MMAX 32
00017
00018 typedef struct {
00019 REAL m[BIG_NMAX][BIG_MMAX];
00020 long NRows, NCols;
00021 } BIGMAT;
00022
00023 typedef struct {
00024 REAL v[BIG_MMAX];
00025 long NElements;
00026 } BIGVEC;
00027
00028 #define NRows(a) ((a)->NRows) // Return number of rows in a matrix
00029 #define NCols(a) ((a)->NCols) // Return number of columns in a matrix
00030 #define NSize(a) ((a)->NElements) // Return number of elements in a vector
00031 #define SetNRows(a, n) ((a)->NRows = (n))
00032 #define SetNCols(a, m) ((a)->NCols = (m))
00033 #define SetBigMatSize(a, n, m) { \
00034 (a)->NRows = (n); \
00035 (a)->NCols = (m); \
00036 }
00037 #define SetBigVecSize(v, n) { \
00038 (v)->NElements = (n); \
00039 }
00040
00041
00042 extern void ClearBigMat(BIGMAT *a);
00043 extern void ClearBigVec(BIGVEC *b);
00044 extern void CopyBigMat(BIGMAT *src, BIGMAT *dest);
00045 extern void CopyBigVec(BIGVEC *src, BIGVEC *dest);
00046 extern void BigVecPlusScalarVec(BIGVEC *vLeft, REAL s, BIGVEC *vRight, BIGVEC *vOut);
00047
00048 extern int SolveLinearEquations(BIGMAT *a, BIGVEC *b, REAL resTol, REAL coefTol, int *origRow, int *origCol, BIGVEC *z, BIGVEC *x);
00049 extern int Eliminate(BIGMAT *a, BIGVEC *b, int *redundant, REAL pivotTol);
00050 extern void Substitute(BIGMAT *a, BIGVEC *b, BIGVEC *x);
00051 extern void L1(BIGMAT *a, BIGVEC *b, REAL toler, BIGVEC *x, BIGVEC *e, int *s);
00052 extern void ConjGrad(BIGMAT *A, BIGVEC *b, REAL tol, int maxIts, BIGVEC *x, REAL *res, int *nIts);
00053
00054 #if DEBUG_SOLVER
00055 extern void TestSolver();
00056 extern bool CheckSolution(BIGMAT *origCoef, BIGVEC *origRes, BIGVEC *soln, BIGVEC *newRes, REAL error);
00057 extern void TestConjGrad();
00058 #endif
00059
00060 #endif