?? sparsem.h
字號:
// sparsem.h : header file
#define LPAEXPORT FAR PASCAL EXPORT
#ifdef __SPARSE_DLL__
#define DLLEXPORT _declspec( dllexport )
#else
#define DLLEXPORT
#endif
// 數(shù)據(jù)類型定義:與FORTRAN程序一致
#define INT1 char
#define INT2 int
#define INT4 long
#define INT8 long
#define REAL4 float
#define REAL8 double
#define FLOAT4 float
#define FLOAT8 double
/////////////////////////////////////////////////////////////////////////////
/*數(shù)據(jù)結(jié)構(gòu)*/
#define LINKED_LIST struct linked_list
#define TRIANGULAR_TABLE struct triangular_table
#define TRIANGULAR_TABLE_C struct triangular_table_c
#define LXBRANCHES_ struct lxbranches_ // 支路
#define LXHBRANCHES_ struct lxhbranches_ // 零序互感抗支路
#define PRC int
#define OLD_NEW int
//
// 復(fù)數(shù)
//
#define RE_IM_TYPE 0
#define A_ANGLE_TYOE 1
LINKED_LIST{ // 雙重鏈接表
INT2 nza; // 非零元素個數(shù)
INT2 n; // 矩陣階數(shù)
INT2 *row; // 元素行號
INT2 *col; // 元素列號
INT2 *up; // 元素的上鄰元素號
INT2 *down; // 元素的下鄰元素號
INT2 *left; // 元素的左鄰元素號
INT2 *right; // 元素的右鄰元素號
INT1 *del; // 元素刪除標志: 1=刪除
INT2 *rp; // 行鏈指針
INT2 *cp; // 列鏈指針
};
TRIANGULAR_TABLE{ // 三角形表, 先對角元素, 其余按 LU 分解順序排列
INT2 nza; // 非零元素個數(shù)
INT2 n; // 矩陣階數(shù)
INT2 lun; // 由符號 LU 分解確定的需修正的元素個數(shù)
INT2 fen; // 由符號前消確定的需修正的向量元素個數(shù)
FLOAT8 *val; // 矩陣及右端向量/中間解向量元素值
INT2 *roco; // 對角元素行列號, U 元素列號, L 元素行號
INT2 *urp; // U 陣行指針
INT2 *lcp; // L 陣列指針
INT2 *lup; // 由符號 LU 分解確定的需修正的元素號
INT2 *fep; // 前消需修正的元素號
};
TRIANGULAR_TABLE_C{ // 復(fù)數(shù)三角形表, 先對角元素, 其余按 LU 分解順序排列
INT2 nza; // 非零元素個數(shù)
INT2 n; // 矩陣階數(shù)
INT2 lun; // 由符號 LU 分解確定的需修正的元素個數(shù)
INT2 fen; // 由符號前消確定的需修正的向量元素個數(shù)
FLOAT8 *vre; // 矩陣及右端向量/中間解向量元素實部值
FLOAT8 *vim; // 矩陣及右端向量/中間解向量元素虛部值
INT2 *roco; // 對角元素行列號, U 元素列號, L 元素行號
INT2 *urp; // U 陣行指針
INT2 *lcp; // L 陣列指針
INT2 *lup; // 由符號 LU 分解確定的需修正的元素號
INT2 *fep; // 前消需修正的元素號
};
LXBRANCHES_{
int n; // 外支路號
char typen; // 支路類型號: 0="線路", 1="變壓器
int i; // 始節(jié)點
int j; // 終節(jié)點
double vre; // 電阻(實部)
double vim; // 電抗(虛部)
double bk; // 電納/變比
};
LXHBRANCHES_{
int ni; // 前條外支路號
int i; // 前條支路的始節(jié)點
int j; // 前條支路的終節(jié)點
int nj; // 后條外支路號
int p; // 后條支路的始節(jié)點
int q; // 后條支路的終節(jié)點
double pvre; // 前條支路的電阻
double pvim; // 前條支路的電抗
double bvre; // 后條支路的電阻
double bvim; // 后條支路的電抗
double vim; // 兩條支路間的互感抗
};
//宏定義
#define PI 3.1415926535
// CSparseMatrixApp
// See sparsem.cpp for the implementation of this class
//
class CSparseMatrix
{
private:
LINKED_LIST List; // 雙鏈表結(jié)構(gòu)
TRIANGULAR_TABLE Table; // 三角形表結(jié)構(gòu)
TRIANGULAR_TABLE_C TableC; // 復(fù)數(shù)三角形表結(jié)構(gòu)
INT2 maxRank; // 最大階數(shù)
INT2 maxNonzero; // 最大非零元個數(shù)
INT2 *NewOldR; // 新=》舊行號,新=》舊行/列號
INT2 *NewOldC; // 新=》舊列號
INT2 *OldNewR; // 舊=》新行號,舊=》新行/列號
INT2 *OldNewC; // 舊=》新列號
FLOAT8 *x1,*x2; // 存儲數(shù)值用
INT1 fOption; /* 使用選項:
0:只使用雙鏈表及其數(shù)據(jù)
1:建立和解實系數(shù)方程,Markwitz優(yōu)化排序,全主元;
2:建立和解實系數(shù)方程,Markwitz優(yōu)化排序,對角主元;
3:建立和解實系數(shù)方程,Tinney-Wolker優(yōu)化排序,對角主元;
4:建立和解復(fù)系數(shù)方程,Markwitz優(yōu)化排序,全主元;
*/
// 壞數(shù)據(jù)檢測數(shù)據(jù)結(jié)構(gòu) Logic
TRIANGULAR_TABLE Table_T; //三角形表結(jié)構(gòu)的轉(zhuǎn)置矩陣
public:
//接口函數(shù)
void newList(INT2 _maxRank, FLOAT4 _rNonzero); // 只使用雙鏈表
void newList(INT2 _maxRank, FLOAT4 _rNonzero, INT2 _fOption);
/* 創(chuàng)建和使用稀疏矩陣技術(shù)解方程,_fOption:
0:只使用雙鏈表
1:實系數(shù)方程,Markwitz優(yōu)化排序,全主元;
2:實系數(shù)方程,Markwitz優(yōu)化排序,對角主元;
3:實系數(shù)方程,Tinney-Wolker優(yōu)化排序,對角主元;
4:復(fù)系數(shù)方程,Markwitz優(yōu)化排序,全主元;
*/
void deleteList(); // 刪除用newList()創(chuàng)建的雙鏈表
void clrList(); // 清除用newList()創(chuàng)建的雙鏈表
INT2 insertListEle(INT2 i,INT2 j); // 在List(i,j)位置插入一個非零元,返回List(i,j)位置標號
INT2 getNumListEle(INT2 i,INT2 j); // 返回List(i,j)位置標號
void setRankList(INT2 rank); // 置List的階數(shù)
INT2 getRankList(); // 取List的階數(shù)
INT2 getNonNumList(); // 取List的非零元素個數(shù)
INT2 getRankTable(); // 取Table的階數(shù)
INT2 getStruList(INT2 i,INT1 _fOption);
/*_fOption=0 取List中元素i的行號
_fOption=1 取List中元素i的列號
_fOption=2 取List中元素i的上鄰元素號或
_fOption=3 取List中元素i的下鄰元素號
_fOption=4 取List中元素i的左鄰元素號
_fOption=5 取List中元素i的右鄰元素號
_fOption=6 取List中元素i的行鏈指針
_fOption=7 取List中元素i的列鏈指針*/
double getStruTableV(INT2 i); // 返回三角形表中的第i個元素的值
void covListTab(); // 優(yōu)化排序,雙鏈表List=》三角形表Table,符號LU分解
void insertB(INT2 i); // 在Table中插入一個非零元右端元素B[i]
void insertBT(INT2 i); // 在Table中插入一個非零元右端元素B[i]
void symFE(); // 右端向量填元,符號前消
void insertCoef(INT2 i,INT2 j,FLOAT8 a); // 在Table中插入矩陣元素a[i,j]
//修改2003.3.30-----------------------------------------函數(shù)調(diào)用后的值是原矩陣元素a[i,j]加上a的值
void insertCoef(INT2 i,INT2 j,FLOAT8 are,FLOAT8 aim); // 在TableC中插入矩陣元素are[i,j],aim[i,j]
void numLU(); // 數(shù)值LU分解
void insertBVal(INT2 i,FLOAT8 b); // 在Table中插入一個右端元素B[i]值
void insertBVal(INT2 i,FLOAT8 bre,FLOAT8 bim); // 在Table中插入一個右端元素B[i]復(fù)數(shù)值
BOOL makeSolution(); // 數(shù)值前消、后代,獲得Tab中的解
FLOAT8 getX(INT2 i); // 從Table獲取解x[i]/TableC獲取解xre[i]
FLOAT8 getXim(INT2 i); // 從TableC獲取解xim[i]
INT2 GetOldNewR(INT2 i);
INT2 GetOldNewC(INT2 i);
void memfree();
void ReSetA();//初始化:使Table中A[i][j]=0
void ReSetB();//初始化:使Table中B[i]=0
BOOL JudgeZero();
// 判斷矩陣對角元素是否為零
// 壞數(shù)據(jù)檢測函數(shù)
void SoluteVF( TRIANGULAR_TABLE table, double *VF );
double FormMartrix( CSparseMatrix& Linked_bar, int row, int col, double* JacoBi, double* m_pV, double* m_pF );
double FormMartrix( int row, int col, double* JacoBi, double* m_pV, double* m_pF );
void translate_table();
TRIANGULAR_TABLE& GetTable() { return Table; };
TRIANGULAR_TABLE& GetTranspose() { return Table_T; };
// 形成轉(zhuǎn)置三角形表
void TransposeSymFE(); // 右端向量填元,符號前消
void new_table(INT2 rank_max,INT2 nonzero);
void new_tableT(INT2 rank_max,INT2 nonzero);
void delete_tableT();
void SetfOption(INT2 option) { fOption = option; };
BOOL Cholesky(double *m_pX,double *Z);
//平方根分解法
//供VB調(diào)用
void WINAPI Formbranch();
public:
CSparseMatrix();
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -