📄 sparsem.h
字号:
// sparsem.h : header file
#define LPAEXPORT FAR PASCAL EXPORT
#ifdef __SPARSE_DLL__
#define DLLEXPORT _declspec( dllexport )
#else
#define DLLEXPORT
#endif
// 数据类型定义:与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
/////////////////////////////////////////////////////////////////////////////
/*数据结构*/
#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
//
// 复数
//
#define RE_IM_TYPE 0
#define A_ANGLE_TYOE 1
LINKED_LIST{ // 双重链接表
INT2 nza; // 非零元素个数
INT2 n; // 矩阵阶数
INT2 *row; // 元素行号
INT2 *col; // 元素列号
INT2 *up; // 元素的上邻元素号
INT2 *down; // 元素的下邻元素号
INT2 *left; // 元素的左邻元素号
INT2 *right; // 元素的右邻元素号
INT1 *del; // 元素删除标志: 1=删除
INT2 *rp; // 行链指针
INT2 *cp; // 列链指针
};
TRIANGULAR_TABLE{ // 三角形表, 先对角元素, 其余按 LU 分解顺序排列
INT2 nza; // 非零元素个数
INT2 n; // 矩阵阶数
INT2 lun; // 由符号 LU 分解确定的需修正的元素个数
INT2 fen; // 由符号前消确定的需修正的向量元素个数
FLOAT8 *val; // 矩阵及右端向量/中间解向量元素值
INT2 *roco; // 对角元素行列号, U 元素列号, L 元素行号
INT2 *urp; // U 阵行指针
INT2 *lcp; // L 阵列指针
INT2 *lup; // 由符号 LU 分解确定的需修正的元素号
INT2 *fep; // 前消需修正的元素号
};
TRIANGULAR_TABLE_C{ // 复数三角形表, 先对角元素, 其余按 LU 分解顺序排列
INT2 nza; // 非零元素个数
INT2 n; // 矩阵阶数
INT2 lun; // 由符号 LU 分解确定的需修正的元素个数
INT2 fen; // 由符号前消确定的需修正的向量元素个数
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; // 始节点
int j; // 终节点
double vre; // 电阻(实部)
double vim; // 电抗(虚部)
double bk; // 电纳/变比
};
LXHBRANCHES_{
int ni; // 前条外支路号
int i; // 前条支路的始节点
int j; // 前条支路的终节点
int nj; // 后条外支路号
int p; // 后条支路的始节点
int q; // 后条支路的终节点
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; // 双链表结构
TRIANGULAR_TABLE Table; // 三角形表结构
TRIANGULAR_TABLE_C TableC; // 复数三角形表结构
INT2 maxRank; // 最大阶数
INT2 maxNonzero; // 最大非零元个数
INT2 *NewOldR; // 新=》旧行号,新=》旧行/列号
INT2 *NewOldC; // 新=》旧列号
INT2 *OldNewR; // 旧=》新行号,旧=》新行/列号
INT2 *OldNewC; // 旧=》新列号
FLOAT8 *x1,*x2; // 存储数值用
INT1 fOption; /* 使用选项:
0:只使用双链表及其数据
1:建立和解实系数方程,Markwitz优化排序,全主元;
2:建立和解实系数方程,Markwitz优化排序,对角主元;
3:建立和解实系数方程,Tinney-Wolker优化排序,对角主元;
4:建立和解复系数方程,Markwitz优化排序,全主元;
*/
// 坏数据检测数据结构 Logic
TRIANGULAR_TABLE Table_T; //三角形表结构的转置矩阵
public:
//接口函数
void newList(INT2 _maxRank, FLOAT4 _rNonzero); // 只使用双链表
void newList(INT2 _maxRank, FLOAT4 _rNonzero, INT2 _fOption);
/* 创建和使用稀疏矩阵技术解方程,_fOption:
0:只使用双链表
1:实系数方程,Markwitz优化排序,全主元;
2:实系数方程,Markwitz优化排序,对角主元;
3:实系数方程,Tinney-Wolker优化排序,对角主元;
4:复系数方程,Markwitz优化排序,全主元;
*/
void deleteList(); // 删除用newList()创建的双链表
void clrList(); // 清除用newList()创建的双链表
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的阶数
INT2 getRankList(); // 取List的阶数
INT2 getNonNumList(); // 取List的非零元素个数
INT2 getRankTable(); // 取Table的阶数
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(); // 优化排序,双链表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-----------------------------------------函数调用后的值是原矩阵元素a[i,j]加上a的值
void insertCoef(INT2 i,INT2 j,FLOAT8 are,FLOAT8 aim); // 在TableC中插入矩阵元素are[i,j],aim[i,j]
void numLU(); // 数值LU分解
void insertBVal(INT2 i,FLOAT8 b); // 在Table中插入一个右端元素B[i]值
void insertBVal(INT2 i,FLOAT8 bre,FLOAT8 bim); // 在Table中插入一个右端元素B[i]复数值
BOOL makeSolution(); // 数值前消、后代,获得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();
// 判断矩阵对角元素是否为零
// 坏数据检测函数
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; };
// 形成转置三角形表
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调用
void WINAPI Formbranch();
public:
CSparseMatrix();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -