📄 maffbsub.cpp
字号:
//===========================================================================
//
// EMS高级应用软件
//
//===========================================================================
// rev 0.0 8-9-2004 initial release Qwbin
// 版本 0.0 8-9-2004 第一次发布 齐文斌
//---------------------------------------------------------------------------
//************************************************************************
// maffbsub - fast forward - backward substitution for sparse matrix
// 快速线性方程求解叠代过程,CA,OPF,LF用
//************************************************************************
#include <malib.h>
//************************************************************************
int EmsMatrix::maffbsub (void)
{
if ( nmastate > 0 )
{
initialize();
forward_sub();
divide_diagonal();
backward_sub();
}
return ( SUCCESS );
}
//************************************************************************
// initialize - Establish maorder-mastate linkage
//************************************************************************
void EmsMatrix::initialize (void )
{
int i;
struct maorderst *maorderpt;
struct mastatest *mastatept;
for (i=0;i<nmastate;i++)
{
maorderpt = maorder_vt[i];
mastatept = mastate_vt[maorderpt->mastate_itm-1];
maorderpt->link.mastatept = mastatept;
if ( mastatept->stat.fastfbs )
{
maorderpt->stat.fastfbs = TRUE;
mastatept->stat.fastfbs = FALSE;
}
else
{
maorderpt->stat.fastfbs = FALSE;
mastatept->x = 0.0;
}
}
return;
}
//************************************************************************
// formard_sub - Forward substitution
//************************************************************************
void EmsMatrix::forward_sub (void)
{
int i;
int j;
double value;
struct maorderst *maorderpt, *maorder_pt;
struct magmtrxst *magmtrxpt;
for ( i=0; i<nmastate;i++)
{
maorderpt = maorder_vt[i];
if ( maorderpt->stat.fastfbs )
{
value = 0.0;
for ( j=0;j<maorderpt->magmtrx_cnt;j++)
{
magmtrxpt = magmtrx_vt[j+maorderpt->magmtrx_itm-1] ;
maorder_pt = maorder_vt[magmtrxpt->colitm-1];
if ( maorder_pt->stat.fastfbs )
value += magmtrxpt->element * maorder_pt->link.mastatept->x;
}
maorderpt->link.mastatept->x -= value;
j = maorderpt->magmtrx_col;
while ( j != 0 )
{
magmtrxpt = magmtrx_vt[j-1];
maorder_pt = maorder_vt[magmtrxpt->rowitm-1];
maorder_pt->stat.fastfbs = TRUE;
j = magmtrxpt->magmtrx_itm;
}
}
}
return;
}
//************************************************************************
// divide_diagonal - Divide by diagonals
//************************************************************************
void EmsMatrix::divide_diagonal (void )
{
int i;
struct maorderst *maorderpt;
for ( i=0; i<nmastate;i++)
{
maorderpt = maorder_vt[i];
if ( maorderpt->stat.fastfbs )
maorderpt->link.mastatept->x *= maorderpt->diag;
}
return;
}
//************************************************************************
// backward_sub - Backward substitution
//************************************************************************
void EmsMatrix::backward_sub(void)
{
int i, j;
int magmtrx_col;
double value;
struct maorderst *maorderpt, *maorder_pt;
struct magmtrxst *magmtrxpt;
for ( i=0; i<nmastate;i++)
{
maorderpt =maorder_vt[nmastate-i-1];
if ( maorderpt->stat.fastfbs )
{
value = 0.0;
magmtrx_col = maorderpt->magmtrx_col;
while ( magmtrx_col != 0 )
{
magmtrxpt = magmtrx_vt[magmtrx_col-1];
maorder_pt = maorder_vt[magmtrxpt->rowitm-1];
if ( maorder_pt->stat.fastfbs )
value += magmtrxpt->element * maorder_pt->link.mastatept->x;
magmtrx_col = magmtrxpt->magmtrx_itm;
}
maorderpt->link.mastatept->x -= value;
for ( j=0; j<maorderpt->magmtrx_cnt;j++)
{
magmtrxpt = magmtrx_vt[j+maorderpt->magmtrx_itm-1];
maorder_pt = maorder_vt[magmtrxpt->colitm-1];
maorder_pt->stat.fastfbs = TRUE;
}
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -