65 lines
1.6 KiB
C++
65 lines
1.6 KiB
C++
/////////////////////////////////////////////////////////////////////
|
|
// 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
|
|
BOOL *Q;
|
|
CComplex *P;
|
|
CComplex *U;
|
|
CComplex *R;
|
|
CComplex *V;
|
|
CComplex *Z;
|
|
CComplex *b; // RHS of linear equation
|
|
CComplexEntry **M; // pointer to list of matrix entries;
|
|
int n; // dimensions of the matrix;
|
|
int bdw; // optional bandwidth parameter;
|
|
int NumNodes;
|
|
double Precision;
|
|
CComplex Lambda;
|
|
|
|
// 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);
|
|
// use to create/set entries in the matrix
|
|
CComplex Get(int p, int q);
|
|
int PBCGSolve(int flag); // flag==true if guess for V present;
|
|
int QMRSolve(int flag);
|
|
void MultA(CComplex *X, CComplex *Y);
|
|
void MultConjA(CComplex *X, CComplex *Y);
|
|
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);
|
|
int PCGSQSolve(int flag);
|
|
int PCGSQStart(int flag);
|
|
int PBCGSolveMod(int flag);
|
|
|
|
CcsolvDlg *TheView;
|
|
|
|
private:
|
|
|
|
};
|
|
|