132 lines
3.5 KiB
C++
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:
|
|
|
|
};
|
|
|