⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sparsem.h

📁 是稀疏矩阵库以及全矩阵和稀疏矩阵分析程序源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
// 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 + -