FEMM/fkn/spars.h

132 lines
3.5 KiB
C++

class CEntry
{
public:
double x; // value stored in the entry
int c; // column that the entry lives in
CEntry *next; // pointer to next entry in row;
CEntry();
private:
};
#define LAMBDA 1.5
class CBigLinProb
{
public:
// data members
double *V; // solution
double *P; // search direction;
double *R; // residual;
double *U; // A * P;
double *Z;
double *b; // RHS of linear equation
CEntry **M; // pointer to list of matrix entries;
int n; // dimensions of the matrix;
int bdw; // Optional matrix bandwidth parameter;
double Precision; // error tolerance for solution
// member functions
CBigLinProb(); // constructor
~CBigLinProb(); // destructor
int Create(int d, int bw); // initialize the problem
void Put(double v, int p, int q);
// use to create/set entries in the matrix
double Get(int p, int q);
void AddTo(double v, int p, int q);
int PCGSolve(int flag); // flag==true if guess for V present;
void MultPC(double *X, double *Y);
void MultA(double *X, double *Y);
void SetValue(int i, double x);
void Periodicity(int i, int j);
void AntiPeriodicity(int i, int j);
void Wipe();
double Dot(double *X, double *Y);
void ComputeBandwidth();
CFknDlg *TheView;
private:
};
/////////////////////////////////////////////////////////////////////
// for complex matrices......
class CComplexEntry
{
public:
CComplex x; // value stored in the entry
int c; // column that the entry lives in
CComplexEntry *next; // pointer to next entry in the row;
CComplexEntry();
private:
};
class CBigComplexLinProb
{
public:
// data members
CComplex *P; // search direction
CComplex *U;
CComplex *R; // residual
CComplex *V;
CComplex *Z;
CComplex *b; // RHS of linear equation
CComplex *uu;
CComplex *vv;
CComplexEntry **M; // pointer to list of matrix entries;
CComplexEntry **Mh; // Hermitian matrix arising from N-R algorithm;
CComplexEntry **Ma; // Antihermitian matrix arising from N-R algorithm;
CComplexEntry **Ms; // Additional complex-symmetric matrix arising from N-R algorithm;
int n; // dimensions of the matrix;
int bdw; // optional bandwidth parameter;
int bNewton; // Flag which denotes whether or not there are entries in Mh or Ms;
int NumNodes;
double Precision;
// member functions
CBigComplexLinProb(); // constructor
~CBigComplexLinProb(); // destructor
int Create(int d, int bw, int nodes); // initialize the problem
void Put(CComplex v, int p, int q, int k=0); // use to create/set entries in the matrix
CComplex Get(int p, int q, int k=0);
void AddTo(CComplex v, int p, int q);
void MultA(CComplex *X, CComplex *Y, int k=0);
void MultConjA(CComplex *X, CComplex *Y, int k=0);
CComplex Dot(CComplex *x, CComplex *y);
CComplex ConjDot(CComplex *x, CComplex *y);
void SetValue(int i, CComplex x);
void Periodicity(int i, int j);
void AntiPeriodicity(int i, int j);
void Wipe();
void MultPC(CComplex *X, CComplex *Y);
void MultAPPA(CComplex *X, CComplex *Y);
// flag==false initializes solution to zero
// flag==true starts from solution of previous call
int PBCGSolveMod(int flag); // Precondition Biconjugate Gradient
int PCGSQStart();
int PBCGSolve(int flag);
int BiCGSTAB(int flag);
int KludgeSolve(int flag);
CFknDlg *TheView;
private:
};